मुझे कोई उपलब्ध डिस्क स्थान के साथ रिक्त स्थान को चलाने की आवश्यकता है


27

मेरे पास एक तालिका है जो हमारे सर्वर पर लगभग 90% एचडी स्पेस ले रही है। मैंने जगह खाली करने के लिए कुछ कॉलम छोड़ने का फैसला किया है। लेकिन मुझे ओएस को स्पेस वापस करने की आवश्यकता है। हालाँकि, समस्या यह है कि मुझे यकीन नहीं है कि अगर मैं VACUUM FULL चलाऊंगा तो क्या होगा और तालिका की प्रतिलिपि बनाने के लिए पर्याप्त खाली स्थान नहीं है।

मैं समझता हूं कि VACUUM FULL का उपयोग नहीं किया जाना चाहिए लेकिन मुझे लगा कि यह इस परिदृश्य में सबसे अच्छा विकल्प है।

किसी भी सुझाव की सराहना की जाएगी।

मैं PostgreSQL 9.0.6 का उपयोग कर रहा हूं

जवाबों:


19

चूंकि आपके पास एक रिक्त स्थान को चलाने या पुनर्निर्माण करने के लिए पर्याप्त जगह नहीं है, आप हमेशा अपने पोस्टग्रैक्स्ल डेटाबेस को पुनर्स्थापित करके उन्हें फिर से बना सकते हैं। डेटाबेस, टेबल, इंडेक्स को बहाल करने से अंतरिक्ष और डीफ़्रैग्मेंट को मुक्त किया जाएगा। बाद में, आप नियमित रूप से अपने डेटाबेस को खाली करने के लिए स्वचालित रखरखाव सेटअप कर सकते हैं।

1 अपने पोस्टग्रैक्स्ल सर्वर पर सभी डेटाबेस का बैकअप लें

आप अपने सभी डेटाबेस को एक विभाजन के लिए बैकअप देना चाहेंगे जिसमें पर्याप्त जगह हो। यदि आप लिनक्स पर थे, तो आप स्पेस बचाने के लिए बैकअप को सेक करने के लिए gzip का उपयोग कर सकते हैं

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2 अपनी कॉन्फ़िगरेशन फ़ाइलों का बैकअप लें

cp /path/to/postgresql/data_directory/*.conf /some/partition/

3 Postgresql बंद करो

pg_ctl -D /path/to/postgresql/data_directory stop

4 डेटा निर्देशिका की सामग्री को मिटा दें

rm -Rf /path/to/postgresql/data_directory/*

5 अपने डेटा डायरेक्टरी को पुष्ट करने के लिए initdb चलाएं

initdb -D /path/to/postgresql/data_directory

6 कॉन्फ़िगरेशन फ़ाइलों को पुनर्स्थापित करें

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7 शुरू Postgresql

pg_ctl -D /path/to/postgresql/data_directory start

8 आपके द्वारा बनाए गए सभी डेटाबेस के डंप को पुनर्स्थापित करें

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out

1
धन्यवाद, यह वही है जो मैंने किया, कुछ मतभेदों के साथ। मैंने डेटाबेस का बैकअप लेने के बाद उसे छोड़ दिया। फिर एक नया बनाया और इसे बहाल किया।
जस्टिन

आपका स्वागत है। मुझे लगा कि डेटा निर्देशिका की सामग्री को हटाने और initdb करने के लिए पर्याप्त होगा।
क्रेग एफ्रेइन

महान काम किया है, मैं gzipसमय बचाने के लिए इस भाग को छोड़ देने की सलाह देता हूं ।
राफेल बारबोसा

17

नोट: मैंने इसका परीक्षण 9.1 पर किया है। मेरे पास कोई 9.0 सर्वर नहीं है। मुझे विश्वास है कि हालांकि यह 9.0 पर काम करेगा।


चेतावनी (जैसा टिप्पणी में @erny द्वारा दिया गया है):

Note that high CPU load due to I/O operations may be expected.

आप एक अस्थायी टेबलस्पेस का उपयोग करके बहुत कम समय के साथ ऐसा कर सकते हैं। डाउन-टाइम अनन्य ताले के रूप में होगा। लेकिन केवल मेज पर आप वैक्यूम कर रहे हैं। इतना सब कुछ होता है कि ग्राहक प्रश्न केवल उस तालिका का अधिग्रहण करने की प्रतीक्षा करेंगे यदि वे प्रश्न में तालिका का उपयोग करते हैं। आपको मौजूदा कनेक्शन बंद करने की आवश्यकता नहीं है।

हालांकि एक बात का ध्यान रखना चाहिए कि टेबल को हिलाने और वैक्यूम को पूरा करने के लिए खुद को पहले एक विशेष लॉक की प्रतीक्षा करनी होगी!


सबसे पहले, आपको स्पष्ट रूप से कुछ अतिरिक्त भंडारण की आवश्यकता है। जैसा Stéphaneकि टिप्पणियों में उल्लेख किया गया है, यह कम से कम दो बार बड़ा होना चाहिए क्योंकि प्रश्न में तालिका VACUUM FULLपूरी नकल करती है। यदि आप भाग्यशाली हैं और गतिशील रूप से मशीन में डिस्क जोड़ सकते हैं, तो ऐसा करें। में सबसे खराब मामला तुम सिर्फ एक USB डिस्क (जोखिम भरा और धीमी गति से हालांकि) संलग्न कर सकते हैं!

अगला, नया उपकरण माउंट करें और इसे टेबलस्पेस के रूप में उपलब्ध करें:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

आप आसानी से उपयोग करने वाले टेबलस्पेस को सूचीबद्ध कर सकते हैं:

\db

अपनी तालिका की वर्तमान तालिका को दोबारा जांचें (आपको यह जानना होगा कि उसे वापस कहां ले जाना है):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

यदि यह है NULL, तो यह डिफ़ॉल्ट टेबलस्पेस में होगा:

SHOW default_tablespace;

यदि ऐसा है NULL, तो इसकी संभावना होगी pg_default( यदि यह बदल गया है तो आधिकारिक डॉक्स देखें )।

अब टेबल को ऊपर ले जाएँ:

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

इसे वैक्यूम करें:

VACUUM FULL mytable;

इसे वापस ले जाएं:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

अस्थायी स्थान निकालें:

DROP TABLESPACE tempspace;

एनबी: मूल डेटा निर्देशिका में अधिक डिस्क स्थान का उपयोग करने के लिए यह कदम प्रतीत होता है ...
क्रिस विवर्स

सिर्फ 9.3 पर इसका परीक्षण किया गया और यह आकर्षण की तरह काम करता है।
जेब्लोंस्की

9.1 पर उत्पादन में सफलतापूर्वक उपयोग किया गया। तालिकाओं को बदलने के बाद मूल उपयोग किए गए स्थान को छोड़ दिया जाता है। ध्यान दें कि I / O संचालन के कारण उच्च CPU लोड की उम्मीद की जा सकती है।
इर्नी

2
अद्भुत सुझाव, इस विस्तृत व्याख्या के लिए धन्यवाद। ध्यान दें कि टेबल की एक पूरी प्रतिलिपि बनाने के size of table x 2बाद से आपको कम से कम अस्थायी टेबलस्पेस की आवश्यकता होगी VACUUM FULL
स्टीफन

धन्यवाद @ स्टीफन। मैंने जानकारी को मुख्य निकाय में जोड़ा।
पूर्वाह्न

2

जल्दी और गन्दी:

  • पोस्टग्रेट्स बंद करो
  • मुख्य डेटाबेस निर्देशिका को दूसरी डिस्क पर ले जाएँ जहाँ वैक्यूम करने के लिए पर्याप्त जगह है
  • मुख्य के मूल स्थान में, नए स्थान पर एक सिमलिंक जोड़ें
  • शून्य स्थान
  • सीलिंक को हटाएं और मुख्य निर्देशिका को अपने मूल स्थान पर वापस ले जाएं
  • Postgres शुरू करें

उदाहरण के लिए ,:

$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start


0

यदि आपके पास एक डंप करने और पुनर्स्थापित करने के लिए डिस्क स्थान है, तो आपके पास एक वैक्यूमडब्लू - पिफल्म करने के लिए डिस्क स्थान होना चाहिए। समस्या यह है कि वैक्यूमडब - बफ़ल पूरे डेटा फ़ाइल की एक प्रतिलिपि बना देगा। तो, आप क्या कर सकते हैं:

  1. बड़ी तालिका को अलग ड्राइव पर रखने वाली फ़ाइलों की प्रतिलिपि बनाएँ, उदाहरण के लिए, धीमी, बड़ी ड्राइव।
  2. अन्य ड्राइव पर मूल स्थान से नए स्थान पर प्रतीकात्मक लिंक बनाएं।
  3. वैक्यूम-रन चलाएं, अब इसे दूसरी डिस्क से डेटा पढ़ना चाहिए, और अपनी मूल डेटा डिस्क पर अंतिम तालिका लिखना चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.