PostgreSQL पर डिस्क स्थान को कैसे पुनः प्राप्त करें?


25

मेरे पास कुछ टेबल के साथ 9.1 डेटाबेस की स्थानीय स्थापना है जिसमें cca था। 300 mio रिकॉर्ड और डेटाबेस लगभग 20 GB तक बढ़ गया। बाद में मैंने delete fromइसे से सभी रिकॉर्ड को हटाने के लिए आदेश जारी किया (मुझे इसका उपयोग करना चाहिए truncateथा, लेकिन मुझे यह नहीं पता था)। इसलिए मैंने डिस्क स्थान को पुनः प्राप्त करने के लिए अपने db पर पूर्ण वैक्यूम किया, लेकिन यह सिर्फ मदद नहीं करता है। मेरी समस्या के समान लगता है यह एक है, लेकिन वहाँ प्रदान की कोई समाधान नहीं है। मैंने पहले ही इस थ्रेड और प्रलेखन को "डिस्क स्थान को पुनर्प्राप्त करने " पर जांच लिया है , लेकिन फिर भी इसका समाधान नहीं मिल रहा है। मैं सभी तालिकाओं का आकार प्राप्त करने के लिए इस कोड का उपयोग करता हूं

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

हालांकि, 1GB से भी कम के लिए कुल

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

अभी भी लगभग 20 जीबी दिखाता है। किसी भी सलाह बहुत सराहना की।


ठीक है, आपके आकार की क्वेरी को बाहर रखा गया है: अनुक्रमित, तालिकाओं pg_catalogऔर तालिकाओं में information_schema। इसलिए यह देखने का प्रयास करें कि क्या यह उन खंडों में से कोई प्रतिबंध हटाकर उनमें से कोई WHEREहै। कृपया अपना सटीक PostgreSQL संस्करण ( SELECT version()) दिखाएं और वास्तव में आप "पूर्ण डेटाबेस को वैक्यूम करें" यानी सटीक कमांड क्या कर रहे हैं। यदि संभव हो, तो रन VACUUM FULL VERBOSE;(कोई तर्क नहीं) करें और आउटपुट को कहीं पेस्ट करें फिर यहां लिंक करें।
क्रेग रिंगर

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

1
@jb यह काम करेगा, लेकिन आवश्यक नहीं होना चाहिए। सीखने के लिए बेहतर है कि समस्या क्या है।
क्रेग रिंगर

जवाबों:


22

यद्यपि आपने इसे नहीं बताया है, मैं आपके संदर्भों से लेकर उन दस्तावेज़ों तक मानता हूं, जिनका आपने अनुसरण किया है कि आपने डेटाबेस और / या प्रभावित तालिकाओं पर एक VACUUM FULL किया है। आपने यह भी निर्दिष्ट नहीं किया कि आप कौन सा पोस्टग्रैस्कल संस्करण उपयोग कर रहे हैं - मैं यह मान लूंगा कि यह 9.0 है (इससे पहले VACUUM FULL ने अलग तरह से व्यवहार किया है)।

VACUUM FULL नई फ़ाइलों में प्रभावित तालिकाओं को फिर से लिखेंगे, फिर पुरानी फ़ाइलों को हटा दें। हालांकि, अगर किसी भी प्रक्रिया में अभी भी पुरानी फ़ाइल खुली है, तो ऑपरेटिंग सिस्टम वास्तव में फ़ाइल को हटा नहीं देगा - जब तक कि अंतिम प्रक्रिया इसे बंद नहीं कर देती।

यदि व्यावहारिक है, तो डेटाबेस को फिर से शुरू करना सुनिश्चित करेगा कि सभी खुली हुई फाइलें बंद हो जाएं।

यदि वह व्यावहारिक नहीं है, तो आप सत्यापित कर सकते हैं कि क्या यह आपकी समस्या है, और यह पता करें कि किस प्रक्रिया में फाइलें खुली हैं।

यदि लिनक्स (या अधिकांश अन्य यूनिक्स जैसी प्रणालियों) का उपयोग करते हुए आप सभी प्रक्रियाओं में खुली सभी फाइलों की सूची प्राप्त करने के लिए 'lsof' कमांड का उपयोग कर सकते हैं। जो फाइलें खुली हैं, लेकिन जो डिलीट हो गई हैं, उनका फाइल नाम के लिए 'डिलीट' (डिलीट) हो जाएगा। तो, आप इस तरह से नष्ट कर दिया फ़ाइलों की तलाश में, lsof के उत्पादन को रोक सकते हैं:

sudo lsof -u postgres | grep 'deleted'

यदि यह उन प्रक्रियाओं की पहचान करता है जिनमें अभी भी पुरानी फाइलें खुली हैं, तो आप उस प्रक्रिया को समाप्त करने के लिए pg_terminate_backend का उपयोग कर सकते हैं:

SELECT pg_terminate_backend(xxx);

जहाँ xxx प्रक्रिया का PID है, जो lsof आउटपुट में पाया जाता है।

यदि विंडोज का उपयोग करते हैं, तो एक ही सिद्धांत लागू हो सकता है, क्योंकि पोस्टग्रोज़ FILE_SHARE_DELETE ध्वज का उपयोग करके फ़ाइलें खोलता है, जो इसे किसी अन्य प्रक्रिया में खुली फ़ाइलों को हटाने की अनुमति देता है। ' हैंडल ' कमांड lsof के बराबर है, हालाँकि मुझे यकीन नहीं है कि अगर आप बता सकते हैं कि फाइलें डिलीट हुई हैं या नहीं तो कुछ अतिरिक्त काम करने की आवश्यकता हो सकती है।

यह एक और सवाल है कि इस तरह की कोई भी प्रक्रिया पुरानी फाइल हैंडल पर क्यों लटकी होगी। हालाँकि आपके प्रश्न में उद्धृत किए गए धागे में, टॉम लेन का अर्थ है कि यह हो सकता है।


मुझे तत्काल डिस्क स्थान वापस प्राप्त करना था इसलिए मैंने डेटाबेस को छोड़ दिया और इसे बैकअप से पुनर्स्थापित कर दिया। हालांकि "कैसे" इस मुद्दे को हल करने के लिए अभी भी भविष्य के मामलों के लिए बहुत मूल्यवान है। मेरा डेटाबेस 9.1 है, 8 64 बिट जीतें, क्या फ़ाइल नामकरण (खुली फाइलों का मामला) उसी तरह लागू होता है जैसे कि लिनक्स में?

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