नोट: मैंने इसका परीक्षण 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;