ऑपरेटिंग सिस्टम के लिए डिस्क स्थान पर वापसी VACUUM


21

VACUUMआमतौर पर ऑपरेटिंग सिस्टम में डिस्क स्थान नहीं लौटता है, कुछ विशेष मामलों को छोड़कर।
डॉक्स से:

VACUUMटेबल और इंडेक्स में डेड रो संस्करण को हटाने का मानक रूप और भविष्य के पुन: उपयोग के लिए उपलब्ध स्थान को चिह्नित करता है। हालांकि, यह ऑपरेटिंग सिस्टम के लिए स्थान नहीं लौटाएगा, विशेष मामले को छोड़कर जहां एक मेज के अंत में एक या अधिक पृष्ठ पूरी तरह से स्वतंत्र हो जाते हैं और एक विशेष टेबल लॉक आसानी से प्राप्त किया जा सकता है। इसके विपरीत, VACUUM FULLसक्रिय रूप से टेबल फ़ाइल का पूरा नया संस्करण लिखकर तालिकाओं को बिना किसी मृत स्थान के साथ कॉम्पैक्ट किया जाता है। यह तालिका के आकार को कम करता है, लेकिन इसमें लंबा समय लग सकता है। जब तक ऑपरेशन पूरा नहीं हो जाता, तब तक उसे टेबल की नई कॉपी के लिए अतिरिक्त डिस्क स्पेस की भी आवश्यकता होती है।

सवाल यह है कि जब one or more pages at the end of a table become entirely freeहासिल किया जा सकता है तो यह डेटाबेस कैसे हो सकता है? इसके माध्यम से किया जा सकता है VACUUM FULL, लेकिन मुझे इसे लागू करने के लिए पर्याप्त स्थान नहीं मिला है। तो क्या कोई अन्य संभावनाएं हैं?

जवाबों:


29

OS पर स्थान लौटने के लिए, उपयोग करें VACUUM FULL। इस पर रहते हुए, मुझे लगता है कि आप चलाते हैं VACUUM FULL ANALYZEमैं मैनुअल को उद्धृत करता हूं :

FULL

"पूर्ण" वैक्यूम का चयन करता है, जो अधिक स्थान को पुनः प्राप्त कर सकता है , लेकिन अधिक समय लेता है और विशेष रूप से तालिका को लॉक करता है। इस विधि को अतिरिक्त डिस्क स्थान की भी आवश्यकता होती है, क्योंकि यह तालिका की एक नई प्रति लिखता है और जब तक ऑपरेशन पूरा नहीं होता तब तक पुरानी प्रति जारी नहीं करता है। आमतौर पर इसका उपयोग केवल तब किया जाना चाहिए जब तालिका के भीतर से एक महत्वपूर्ण मात्रा में जगह की आवश्यकता हो।

बोल्ड जोर मेरा।

CLUSTER एक संपार्श्विक प्रभाव के रूप में, वह भी प्राप्त करता है।

सादा VACUUMआमतौर पर आपके लक्ष्य को प्राप्त नहीं करता है ( "तालिका के अंत में एक या एक से अधिक पृष्ठ पूरी तरह से स्वतंत्र हैं" )। यह पंक्तियों को पुन: व्यवस्थित नहीं करता है और केवल अवसर आने पर फ़ाइल के भौतिक छोर से खाली पृष्ठों को प्रूव करता है - जैसे मैनुअल से आपका उद्धरण।

जब आप INSERTपंक्तियों का एक समूह और DELETEअन्य ट्यूपल्स संलग्न होने से पहले आप भौतिक फ़ाइल के अंत में खाली पृष्ठ प्राप्त कर सकते हैं । या यह संयोग से हो सकता है यदि पर्याप्त पंक्तियों को हटा दिया जाए।

वहाँ भी विशेष सेटिंग्स है कि VACUUM FULLस्थान को पुनः प्राप्त करने से रोक सकते हैं। देख:

परीक्षण के लिए एक तालिका के अंत में खाली पृष्ठ तैयार करें

सिस्टम कॉलम ctidएक पंक्ति की भौतिक स्थिति का प्रतिनिधित्व करता है। आपको उस कॉलम को समझने की आवश्यकता है:

हम उसके साथ काम कर सकते हैं और पिछले पृष्ठ से सभी पंक्तियों को हटाकर एक तालिका तैयार कर सकते हैं:

DELETE FROM tbl t
USING (
   SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid     AS min_tid
        , (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
   FROM   tbl
   ORDER  BY ctid DESC
   LIMIT  1
   ) d
WHERE t.ctid BETWEEN d.min_tid AND d.max_tid;

अब, अंतिम पृष्ठ खाली है। यह समवर्ती लेखन को नजरअंदाज करता है। या तो आप उस टेबल पर केवल एक ही लेखन कर रहे हैं या आपको हस्तक्षेप से बचने के लिए राइट लॉक लेने की आवश्यकता है।

क्वॉलिफाइंग पंक्तियों को जल्दी पहचानने के लिए क्वेरी को ऑप्टिमाइज़ किया गया है। एक की दूसरी संख्या tidtuple सूचकांक अहस्ताक्षरित के रूप में संग्रहीत है int2, और 65535उस प्रकार ( 2^16 - 1) के लिए अधिकतम है , इसलिए यह सुरक्षित ऊपरी सीमा है।

एसक्यूएल फिडल (एक अलग मामले से एक साधारण तालिका का पुन: उपयोग करना।)

पंक्ति / तालिका आकार मापने के लिए उपकरण:

भरी हुई डिस्क

आपको इनमें से किसी भी ऑपरेशन के लिए डिस्क पर विग्लिंग रूम की आवश्यकता है। / के pg_repackप्रतिस्थापन के रूप में सामुदायिक उपकरण भी है । यह विशेष ताले से बचता है, लेकिन साथ ही साथ काम करने के लिए मुफ्त स्थान की आवश्यकता होती है। नियम पुस्तिका:VACUUM FULLCLUSTER

लक्ष्य तालिका (ओं) और अनुक्रमित के रूप में बड़े रूप में दो बार मुक्त डिस्क स्थान की आवश्यकता होती है।

अंतिम उपाय के रूप में, आप एक डंप / रिस्टोर साइकिल चला सकते हैं। टेबल और इंडेक्स से भी सभी ब्लोट को हटा देता है। बारीकी से संबंधित प्रश्न:

वहाँ पर जवाब बहुत कट्टरपंथी है। यदि आपकी स्थिति इसके लिए अनुमति देती है (पंक्ति हटाने को रोकने के लिए कोई विदेशी कुंजी या अन्य संदर्भ नहीं), और तालिका में कोई समवर्ती पहुँच नहीं है), तो आप बस यह कर सकते हैं:

एक से जोड़ने डिस्क के लिए तालिका डंप दूरस्थ कंप्यूटर के साथ डिस्क स्थान के बहुत सारे ( -aके लिए --data-only):

दूरस्थ शेल से, डंप टेबल डेटा:

pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql

पीजी सत्र में, TRUNCATEतालिका:

-- drop all indexes and constraints here for best performance
TRUNCATE mytbl;

दूरस्थ शेल से, उसी तालिका में पुनर्स्थापित करें:

psql -h <host_name> -p <port> mydb -f db_mytbl.sql
-- recreate all indexes and constraints here

यह अब किसी भी मृत पंक्तियों या ब्लोट से मुक्त है।

लेकिन शायद तुम उस सरल हो सकता है?

  • क्या आप असंबंधित फ़ाइलों को हटाकर (चलती) डिस्क पर पर्याप्त स्थान बना सकते हैं?

  • क्या आप VACUUM FULLपहले एक-एक करके छोटे टेबल बना सकते हैं , जिससे पर्याप्त डिस्क स्पेस खाली हो जाएगा?

  • क्या आप फूले हुए इंडेक्स से डिस्क स्थान को चला सकते हैं REINDEX TABLEया REINDEX INDEXमुक्त कर सकते हैं ?

जो कुछ भी आप करते हैं, दाने मत बनो । यदि संदेह है, तो पहले सब कुछ एक सुरक्षित स्थान पर बैकअप करें।


इरविन, क्षमा करें, मैं यह उल्लेख करना भूल गया कि मेरे पास निर्वात पूर्ण के लिए पर्याप्त स्थान नहीं है। सवाल अपडेट किया।
गलत-सब कुछ के बारे में

@Zapadlo: मैंने अद्यतन प्रश्न के लिए एक अध्याय जोड़ा।
इरविन ब्रांडस्टेटर

व्यापक उत्तर के लिए धन्यवाद। वास्तव में मैंने सोचा था कि मैं नकली अद्यतनों द्वारा db पृष्ठों के अंत में मृत पंक्तियों को रख सकता हूं, अर्थात update table set field_1 = field_1, लेकिन उस तालिका को वैक्यूम करने के बाद उस ऑपरेशन को खाली स्थान, किसी भी विचार को वापस करने में विफल रहा?
गलत-सब कुछ के बारे में

@Zapadlo: मेरे पास जो विचार थे वे पहले से ही उत्तर में हैं। :) मुझे ऐसे टूल का पता नहीं है जो डिस्क पर पर्याप्त विग्लिंग रूम की आवश्यकता के बिना मृत ट्यूपल्स को फिर से व्यवस्थित कर सकता है। (इसका मतलब यह नहीं है कि वहाँ कोई नहीं हो सकता है।)
एरविन ब्रांडस्टेटर

वे कहते हैं कि यह उपकरण चाल करता है, हालांकि इसने अभी तक कोशिश नहीं की है: code.google.com/p/pgtoolkit/source/browse/trunk/bin/…
गलत-सब कुछ-
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.