PostgreSQL: พื้นที่ว่างในดิสก์ไม่ได้ถูกปล่อยออกหลังจาก TRUNCATE


12

ฉันมีTRUNCATEตารางขนาดใหญ่ (~ 120Gb) ที่เรียกว่าfiles:

TRUNCATE files;
VACUUM FULL files;

ขนาดตารางคือ 0 แต่ไม่มีพื้นที่ดิสก์ออก แนวคิดใดบ้างที่จะเรียกคืนพื้นที่ดิสก์ที่หายไป

ปรับปรุง: พื้นที่ว่างในดิสก์ได้รับการปล่อยตัวหลังจาก ~ 12 ชั่วโมงโดยไม่มีการดำเนินการใด ๆ ในด้านของฉัน ฉันใช้เซิร์ฟเวอร์ Ubuntu 8.04


ฉันกำลังจะแนะนำ "ดูดมัน!" แต่เมื่อพิจารณาว่าคุณเพิ่งทำไปฉันแนะนำให้นำสิ่งนี้ไปยังรายการ pg-hacker หรือ pg-performance (และเชื่อมโยงกลับไปที่เธรดหรือคำตอบเมื่อคุณมี หนึ่ง).
เดนิสเดอเบอร์นาดี

ลิงก์นี้ ( postgresql.1045698.n5.nabble.com/… ) ให้คำแนะนำกับคุณหรือไม่? อาจยังมีบางสิ่งที่เข้าถึงตารางหรือคล้ายกัน
DrColossos

@DrColossos: ฉันอ่านความคิดเห็นในแหล่งที่มา (ความคิดเห็นที่ฉันไม่สามารถหาได้ในขณะนี้) ที่กล่าวว่า PostgreSQL แจ้งการเชื่อมต่อทั้งหมดที่มีการตัดทอนกำลังจะเกิดขึ้นและมันล็อคทรัพยากรที่จำเป็น (มีหลายอย่างรวมถึงตัวตารางดัชนีลำดับและขนมปังปิ้ง) ฉันค่อนข้างแน่ใจว่าฉันพบความคิดเห็นก่อนหน้านี้โดยการติดตามผ่าน ExecuteTruncate () แต่ฉันไม่ได้บวก 100% เกี่ยวกับเรื่องนี้
Mike Sherrill 'Cat Recall'

คำตอบ:


12

ตามความคิดเห็นในแหล่งข้อมูลให้truncateสร้างไฟล์หน่วยเก็บข้อมูลใหม่ที่ว่างเปล่าและลบไฟล์หน่วยเก็บข้อมูลเก่าในเวลาที่กำหนด (เอกสารแนะนำให้ "ไฟล์จัดเก็บข้อมูล" เป็นเพียงไฟล์เท่าที่ระบบปฏิบัติการเกี่ยวข้อง แต่ฉันอาจเข้าใจคำศัพท์ผิด)

สร้างไฟล์หน่วยเก็บข้อมูลว่างใหม่สำหรับความสัมพันธ์และกำหนดเป็นค่า relfilenode ไฟล์หน่วยเก็บข้อมูลเก่าถูกกำหนดเวลาสำหรับการลบเมื่อคอมมิชชัน

เนื่องจากดูเหมือนว่าจะเป็นการลบไฟล์ฉันสามารถจินตนาการบางกรณีที่ระบบปฏิบัติการพื้นฐานอาจไม่เพิ่มพื้นที่ว่างทันที ฉันคิดว่าในบางกรณีไฟล์หน่วยเก็บข้อมูลอาจสิ้นสุดในถังรีไซเคิลภายใต้ Windows ตัวอย่างเช่น แต่ในกรณีของฉันการตัดทอนตารางภายใต้ PostgreSQL 9. บางสิ่งเพิ่มพื้นที่ว่างใน Windows ทันที

การตัดจะถูกบันทึกในบันทึก WAL ฉันไม่รู้ว่าจะมีเอฟเฟกต์เท่าใด


2
เป็นไปได้ว่ากระบวนการแบ็กเอนด์อื่นยังคงมีตัวให้คำอธิบายไฟล์ในการเปิดไฟล์ หากสิ่งนี้เกิดขึ้นอีกฉันจะลองยุติกระบวนการแบ็กเอนด์อื่นทั้งหมดเพื่อดูว่ามันสร้างความแตกต่างหรือไม่
Peter Eisentraut

ฉันค่อนข้างมั่นใจว่าฉันอ่านว่า ExecuteTruncate () ควรจะทำให้แน่ใจว่าจะไม่เกิดขึ้น ส่วนหนึ่งของการล็อกทรัพยากรที่จำเป็นในการลบไฟล์หน่วยเก็บข้อมูลเก่าในที่สุด แต่ฉันไม่รู้ว่าฉันพบที่ไหนในแหล่งนั้น ฉันแค่ท่องออนไลน์ มันง่ายที่จะหลงทางนั้น
Mike Sherrill 'Cat Recall'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.