आंशिक रूप से निर्मित और बिजली आउटेज द्वारा समाप्त किए गए एक सूचकांक द्वारा लिए गए स्थान को कैसे पुनः प्राप्त किया जाए


9

मैं एक मैक (10.10.4) पर पोस्टग्रिज (पोस्टगिस) 9.4.2 चला रहा हूं।

मुझे कुछ बड़े टेबल (कई टीबी) मिले हैं।

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

मैंने मेज को गिराने की कोशिश की और पुनः प्रवेश कर गया, और वह स्थान नहीं गिरा। अब मैं एक ऐसे स्थान पर हूँ जहाँ मेरे पास सूचकांक बनाने के लिए पर्याप्त जगह नहीं है।

क्या इंडेक्स बिल्ड के दौरान उत्पन्न फाइलें किसी लिम्बो में अटक जाती हैं, जहां पावर आउटेज के दौरान मशीन के नीचे जाने के कारण उन्हें सिस्टम द्वारा हटाया नहीं जा सकता है?

जब मैं db में तालिका आकार + अनुक्रमित को देखता हूं (जो उस ड्राइव का एकमात्र डेटा है) वे लगभग 6TB तक जोड़ते हैं । ड्राइव 8TB है , और ड्राइव पर 500GB से भी कम बचा है, इसलिए ऐसा लगता है कि लगभग 1.5TB कहीं खो गए हैं जो कि उस आकार के बारे में है जो सूचकांक होता।

कोई विचार?


क्या सूचकांक अभी भी इस तरह से एक क्वेरी के साथ सूचीबद्ध है? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
कसांड्री 14

नहीं, यह उस क्वेरी के परिणामों में दिखाई नहीं देता है।
dkitchel

1
क्या आपके पास सूची में कुछ भी है जो SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;आपको देता है?
dezso 16

नहीं, कि खाली आता है।
dkitchel

जवाबों:


5

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

मान लेते हैं कि यह काम नहीं किया, या कम से कम इसे मैन्युअल रूप से जांचना होगा।

फाइल की सूची जो डेटादिर में होनी चाहिए, इस तरह से क्वेरी के साथ स्थापित की जा सकती है:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0डिफ़ॉल्ट टेबलस्पेस के लिए है। यदि समस्या-रहित अनुक्रमणिका को गैर-डिफ़ॉल्ट तालिकाओं में बनाया गया था, तो इसे 0इसके OID द्वारा प्रतिस्थापित किया जाना चाहिए pg_tablespace

i, r, t, S, m को relkindक्रमशः अनुक्रमित, तालिकाओं, टोस्ट स्थान, अनुक्रमों, भौतिक विचारों के अनुरूप किया जाता है। इन सभी वस्तुओं का फाइलों में अपना डेटा होता है जिनके नाम मेल खाते हैं pg_relation_filenode(oid)

डिस्क पर, डेटा फ़ाइलों से नीचे हैं $PGDATA/base/oid/, जहां oidहै oidडेटाबेस के द्वारा प्राप्त की select oid,datname from pg_database। यदि हम डिफ़ॉल्ट टेबलस्पेस के बारे में बात नहीं कर रहे हैं, baseतो PG_version_somelabelइसके बजाय बदल दिया जाता है ।

उस निर्देशिका में relfilenodes से मेल खाने वाली फ़ाइलों की सूची बनाएं और सॉर्ट करें:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(यह वास्तव में उन संबंधों के लिए केवल पहला खंड है जो 1Gb से बड़े हैं। यदि लिंग खंड ऐसे हैं जो किसी भी चीज से जुड़े नहीं हैं तो उन्हें अलग से माना जाना चाहिए)

और उपरोक्त क्वेरी के परिणाम के साथ उस फ़ाइल को अलग करें।

यदि ऐसी डेटा फाइलें हैं जो किसी भी ऑब्जेक्ट के अनुरूप नहीं हैं, जिसके बारे में db को पता है, तो उन्हें उस अंतर में दिखाई देना चाहिए।


बहुत बढ़िया! मुझे दातादिर में 1 फ़ाइल मिली जो चयन सूची में नहीं दिखाई दी। क्या मैं सुरक्षित रूप से उस फ़ाइल को निकाल सकता हूँ?
dkitchel

वास्तव में यह डॉट के बाद पुनरावृत्तियों के साथ लगभग 800 फ़ाइलों से मेल खाती है - जैसे 499807.484 आदि। क्या मैं सुरक्षित रूप से उन फाइलों को हटा सकता हूं?
dkitchel

@dkitchel: यह विशाल सूचकांक के लिए प्रत्येक 1Gb के खंड होंगे। हो सकता है कि जाँच करें कि जब टाइम इंडेक्स चल रहा था, तब उनका टाइमस्टैम्प मेल खाता है। उन्हें हटाने के लिए, ठीक है, मुझे आशा है कि ऊपर दिया गया मेरा तर्क सही है, लेकिन यह आपका डेटा है, इसलिए अंततः यह आपका निर्णय है!
डैनियल वेत्रे

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

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