วิธีเรียกคืนพื้นที่ที่ใช้โดยดัชนีที่สร้างขึ้นบางส่วนและถูกยกเลิกโดยไฟฟ้าดับ


9

ฉันใช้ postgres (postgis) 9.4.2 บน mac (10.10.4)

ฉันมีตารางใหญ่สองสามอัน (หลาย TB)

ในระหว่างการสร้างดัชนีของหนึ่งในนั้นที่ใช้เวลาประมาณหนึ่งสัปดาห์ฉันดูการลดลงของพื้นที่ HD ที่มีอยู่ตามที่คุณคาดว่าจะถึงจุดที่ดัชนีจะเสร็จสิ้นเมื่อไฟฟ้าดับนานกว่าแบตเตอรี่และระบบ ลงไป. ฉันปิดบัฟเฟอร์และfillfactor=100ระหว่างการสร้างเนื่องจากเป็นแหล่งข้อมูลแบบคงที่ ในการรีบู๊ตพื้นที่ที่เหลืออยู่บนไดรฟ์จะอยู่ในตำแหน่งที่ใกล้ถึงจุดสิ้นสุดของการสร้างดัชนี การวิเคราะห์สูญญากาศไม่เพิ่มพื้นที่ว่าง

ฉันลองวางโต๊ะแล้วนำเข้าไปใหม่และนั่นก็ไม่ได้ทำให้เนื้อที่ลดลง ตอนนี้ฉันอยู่ในสถานที่ที่ฉันมีพื้นที่ไม่เพียงพอที่จะสร้างดัชนี

ไฟล์ถูกสร้างขึ้นในระหว่างการสร้างดัชนีติดอยู่ในบริเวณขอบรกบางส่วนที่ไม่สามารถลบออกได้โดยระบบเนื่องจากวิธีการที่เครื่องหยุดทำงานในระหว่างไฟฟ้าดับหรือไม่?

เมื่อฉันมองไปที่ตารางขนาด + ดัชนีในฐานข้อมูล (ซึ่งเป็นเพียงข้อมูลในไดรฟ์นั้น) พวกเขาเพิ่มขึ้นประมาณ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';
Kassandry

ไม่มันไม่ปรากฏในผลลัพธ์จากการค้นหานั้น
dkitchel

1
คุณมีอะไรในรายการที่SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;ให้คุณ
dezso

ไม่นั่นว่างเปล่า
dkitchel

คำตอบ:


5

โดยปกติเราคาดหวังว่าเมื่อรีสตาร์ท postgres กระบวนการกู้คืนความผิดพลาดจะลบไฟล์ที่เกี่ยวข้องกับดัชนีย้อนกลับจากไดเรกทอรีข้อมูล

สมมติว่ามันใช้งานไม่ได้หรืออย่างน้อยก็ต้องตรวจสอบด้วยตนเอง

รายการของไฟล์ที่ควรอยู่ใน datadir สามารถสร้างขึ้นได้ด้วยแบบสอบถามเช่นนี้:

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 หากมีเซ็กเมนต์ lingering ไม่แนบกับสิ่งที่พวกเขาควรพิจารณาแยกต่างหาก)

และแตกไฟล์นั้นด้วยผลลัพธ์ของแบบสอบถามด้านบน

หากมีไฟล์ข้อมูลที่ยังไม่ทำงานซึ่งไม่สอดคล้องกับวัตถุใด ๆ ที่ฐานข้อมูลรู้ควรจะปรากฏในส่วนต่างนั้น


! น่ากลัว ฉันพบ 1 ไฟล์ใน datadir ที่ไม่แสดงในรายการที่เลือก ฉันสามารถลบไฟล์นั้นได้อย่างปลอดภัยหรือไม่?
dkitchel

ที่จริงแล้วมันสอดคล้องกับประมาณ 800 ไฟล์ที่มีการวนซ้ำหลังจากจุด - เช่น 499807.484 ฯลฯ ฉันสามารถลบไฟล์เหล่านั้นออกอย่างปลอดภัยได้หรือไม่?
dkitchel

@dkitchel: นั่นคือส่วนของ 1Gb สำหรับดัชนีขนาดใหญ่ อาจตรวจสอบว่าการประทับเวลาของพวกเขาตรงกับเมื่อสร้างดัชนีกำลังทำงาน สำหรับการลบพวกเขาฉันหวังว่าเหตุผลของฉันถูกต้อง แต่เป็นข้อมูลของคุณดังนั้นในที่สุดมันก็เป็นการตัดสินใจของคุณ!
Daniel Vérité

ใช่การประทับเวลาสอดคล้องกับเมื่อดัชนีกำลังสร้างและผลรวมของขนาดไฟล์เกี่ยวกับสอดคล้องกับดัชนีที่ควรมีขนาดใหญ่ เหตุผลของคุณดูมั่นคง ฉันจะไปด้วยความมั่นใจสูง ขอบคุณมาก
dkitchel

เพียงแค่ติดตามเพื่อให้ผู้อื่นที่พบว่าตนเองอยู่ในสถานการณ์เดียวกันสามารถใช้โซลูชันของ @ DanielVerite ได้อย่างมั่นใจ ทางออกของเขาทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
dkitchel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.