गिरा डेटाबेस के बाद डिस्क स्थान खाली करना


12

मैं एक देव प्रणाली पर काम कर रहा हूं, और मैं एक डेटाबेस को बहाल कर रहा हूं, "फू" कहो, कि मैं देव उद्देश्यों के लिए उपयोग कर रहा हूं। जैसा कि मैं kinks के माध्यम से काम कर रहा हूं, मैं अभी DROP DATABASE foo चला रहा हूं। हालाँकि, मुझे जल्दी ही एहसास हुआ कि मैंने अपनी डिस्क पर सभी जगह खा लिया है। बकवास।

क्या VACUUM FULL, एक अलग लॉजिकल डेटाबेस से, उस डेटाबेस से स्पेस खाली करता है, जिसे मैंने पहले छोड़ा था (foo)? मैंने इसे एक अलग तार्किक डेटाबेस से आज़माया, और मुक्त स्थान को पुनः प्राप्त किया गया था, लेकिन मुझे नहीं लगता कि यह मेरे द्वारा बनाए गए सभी सृजन / ड्रॉप डेटा कॉल के लिए पर्याप्त था। मेरे द्वारा चलाए गए तार्किक डेटाबेस में यह सिर्फ VACUUM'ed हो सकता है।

कुल डेटाबेस init किए बिना उस स्थान को पुनः प्राप्त करने का एक तरीका होना चाहिए?

संपादित करें

इसलिए मैंने इन स्टेप्स को फॉलो करते हुए डेटाबेस को बैकअप से रीइंस्ट्रक्ट किया । पुनर्स्थापना के बाद, मैंने डिस्क पर एक टन स्थान पुनः प्राप्त किया है! यह अब के लिए काम करता है, लेकिन कैसे गिरा डेटाबेस को साफ करने के बारे में कोई मदद अभी भी उपयोगी होगी।

EDIT 2

इसलिए मैं इस मुद्दे के बारे में कुछ और जानकारी इकट्ठा करने में कामयाब रहा ... यहाँ मैं एक उदाहरण के रूप में आया हूँ:

Initial partition size:
                       Size   Used  Avail Use% Mounted on
                        25G   8.1G    16G  35% /apps1

After creating my new database and populating it:
                        25G    18G   6.4G  73% /apps1

After Dropping the database using "DROP database mydb" from a separate logical DB:
                        25G    13G    11G  56% /apps1

तो यह मुझे प्रतीत होता है कि नए DB ने डिस्क पर ~ 9.6 GB लिया। हालाँकि, इसे छोड़ने के बाद, पुनः प्राप्त डिस्क स्थान केवल ~ 4.6G की वृद्धि हुई। तो, वहाँ लगभग 5 जीबी स्थान है जो मुझे आश्चर्यचकित करता है कि क्या चल रहा है !?

और यह इस चक्र को जारी रखता है जब मैं पुन: बनाता हूं, आबाद करता हूं, और फिर से गिरता हूं।

क्या किसी को पता है कि "DROP DATABASE" कमांड जारी होने के बाद क्या सुस्त है?


शायद यह भी ध्यान देने योग्य है कि मेरे पास संग्रह चालू है। ऐसा प्रतीत होता है कि जिस स्थान पर वाल आर्काइव फाइलें लिखी जा रही हैं, वह जगह बड़ी है। मैं इसकी बारीकी से निगरानी नहीं कर रहा हूं। हो सकता है कि मैं ऊपर सूचीबद्ध समान प्रक्रिया का प्रयास करूं और उस निर्देशिका पर "डु" चलाऊं, यह देखने के लिए कि क्या सभी स्थान पुनः प्राप्त हैं। मैं वापस रिपोर्ट करूँगा।
Jmoney38

मुझे लगता है कि वैक्यूम तब मदद नहीं करता है?
रोज़रपैक

जवाबों:


6

sudo lsof| grep deletedयदि कोई PostgreSQL प्रक्रिया दिखाई देती है, तो कोशिश करें और देखें। यह कमांड उन फ़ाइलों की तलाश करता है जिन्हें हटा दिया गया है लेकिन इसके फाइल डिस्क्रिप्टर अभी भी किसी भी प्रक्रिया से खुले हैं। एक और दुष्प्रभाव यह है कि df -hऔर du -sh /अलग है। ऐसा इसलिए है क्योंकि duफ़ाइल सिस्टम को देखता है और सभी फ़ाइलों के आकार को योग करता है, और dfभौतिक डिवाइस को देखता है।

मेरे पास सिर्फ एक डेटाबेस के साथ एक समस्या है जो किसी भी जगह के बाद मुक्त नहीं हुई थी DROP tableऔर यही कारण था।

एकमात्र उपाय मुझे पता है कि डेटाबेस को पुनरारंभ करना है। हो सकता है कि आप पुनः लोड (SIGHUP) भेजने का प्रयास कर सकें।


2
lsof | grep deletedटिप एक अच्छा था, उस में, यह जोड़ें कि आपको केवल यह निर्धारित करने की आवश्यकता है कि कौन से पोस्टग्रैसिकल सत्र अभी भी सक्रिय हैं, और उन्हें मारना, फ़ाइलों को जारी करना। मेरे मामले में, 500+ सक्रिय कनेक्शनों में, लगभग सभी IDLE या COMMIT में, एक एकल को मारना, एक साथ मिला SELECT * FROM pg_stat_activityऔर ANALYZE में अटक गया, हटाए गए फ़ाइलों को मुक्त करने के लिए पर्याप्त था। ! 00 जीबी मुक्त।
एलेक्स नॉर्थ-कीज

5

मेरी समझ यह है कि जब आप एक डेटाबेस को छोड़ देते हैं तो यह, और यह फाइलें हैं, चले गए हैं।

जब तक आप टेबलस्पेस का उपयोग नहीं कर रहे हैं, तब तक प्रत्येक डेटाबेस में $ पीजीडीटीए / बेस के तहत यह स्वयं का उपनिर्देशिका में डेटा होना चाहिए। उदाहरण के लिए मेरे एक सर्वर का उपयोग करना (उपयोगकर्ता को पोस्टग्रेज के रूप में):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

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

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp

जो हम देखते हैं ($ PGDATA / base / 83637 नए डेटाबेस के लिए उपनिर्देशिका है)।

उस डेटाबेस को गिराना भी डेटा फ़ाइलों को हटाना चाहिए:

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

हम क्या उम्मीद करेंगे - $ PGDATA / base / 83637 डायरेक्टरी चली गई है, वैक्यूम के लिए कुछ भी नहीं होना चाहिए।

क्या आप सुनिश्चित हैं कि आपके डिस्क स्थान को खाने में कुछ और नहीं है? आपके अन्य डेटाबेस में से एक? लॉग फ़ाइल?

कुछ है कि आप की कोशिश कर सकता है:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

अपने विभिन्न डेटाबेस सामान बनाते हैं, बनाते हैं, छोड़ते हैं, आदि और फिर:

-bash-3.2$ du -sh `ls` > ../post_sizes

कुछ विचार पाने के लिए जहां डिस्क स्थान जा रहा है।


मैं वही परिणाम देखता हूं जो आप करते हैं - यानी जब मैं तालिका जोड़ता हूं, तो नई डीबी आधार निर्देशिका में दिखाई देती है, और जब मैं इसे हटाता हूं, तो यह चला गया है। हालाँकि, वह निर्देशिका पूरे अंतर को आकार में शामिल नहीं करती है (अर्थात। ~ 9.6GB)
Jmoney38

@ Jmoney38 - इसलिए मैंने ls$ PGDATA निर्देशिका पर "du -sh " करने की सिफारिश की है , डेटाबेस को जोड़ने / छोड़ने से पहले और बाद में दोनों को ध्वज के रूप में जोड़ना चाहिए, जो कि अन्य निर्देशिकाओं में बढ़ रही हैं।
19

@ Jmoney38 - अगर मुझे लगता था कि मैं कहूँगा कि अंतर $ PGDATA / pg_log और / या $ PGDATA / pg_xlog निर्देशिकाओं में पाया जाना है। लॉग फ़ाइलें क्लस्टर के लिए होती हैं और जब आप किसी डेटाबेस को छोड़ते हैं तो छोटा नहीं होता है।
२१:०१ पर २१:१२
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.