หมายเหตุ: ฉันได้ทดสอบสิ่งนี้ใน 9.1 ฉันไม่มีเซิร์ฟเวอร์ 9.0 วางอยู่แถวนี้ ฉัน preeeettty แน่ใจว่ามันจะทำงานบน 9.0 แม้ว่า
ข้อควรระวัง (ตามที่ระบุไว้ในความคิดเห็นโดย @erny):
Note that high CPU load due to I/O operations may be expected.
คุณสามารถทำได้โดยไม่ต้องหยุดทำงานโดยใช้พื้นที่ตารางชั่วคราว เวลาหยุดทำงานจะอยู่ในรูปของการล็อคแบบเอกสิทธิ์ แต่เฉพาะบนโต๊ะที่คุณกำลังดูดฝุ่น ดังนั้นสิ่งที่จะเกิดขึ้นก็คือการสอบถามลูกค้าจะรอให้ได้รับการล็อคหากพวกเขาเข้าถึงตารางที่เป็นปัญหา คุณไม่จำเป็นต้องปิดการเชื่อมต่อที่มีอยู่
สิ่งหนึ่งที่ต้องระวังคือการย้ายโต๊ะและสูญญากาศเต็มจะต้องรอการล็อคพิเศษก่อน!
ก่อนอื่นคุณต้องมีที่เก็บข้อมูลเพิ่มเติม ในฐานะที่เป็นStéphane
ที่กล่าวถึงในความคิดเห็นที่ตอบสนองความต้องการนี้จะมีอย่างน้อยสองครั้งเป็นใหญ่เป็นตารางในคำถามเป็นVACUUM FULL
ไม่ฉบับเต็ม หากคุณโชคดีและสามารถเพิ่มดิสก์ในเครื่องได้ให้ทำเช่นนั้น ในกรณีที่เลวร้ายที่สุดคุณเพียงแค่แนบดิสก์ USB (เสี่ยงและช้า)!
ถัดไปติดตั้งอุปกรณ์ใหม่และทำให้พร้อมใช้งานเป็น tablespace:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
คุณสามารถแสดงรายการพื้นที่ตารางได้อย่างง่ายดายโดยใช้:
\db
ตรวจสอบพื้นที่ตารางปัจจุบันของตารางของคุณอีกครั้ง (คุณจำเป็นต้องทราบว่าจะย้ายกลับไปที่ใด):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
หากเป็นNULL
เช่นนั้นจะอยู่ในพื้นที่ตารางเริ่มต้น:
SHOW default_tablespace;
ถ้าว่าเป็นNULL
เช่นกันก็มีแนวโน้มที่จะpg_default
(ตรวจสอบเอกสารเป็นทางการในกรณีที่มีการเปลี่ยนแปลง)
ตอนนี้ย้ายโต๊ะไปที่:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
ดูดมัน:
VACUUM FULL mytable;
ย้ายกลับ:
-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT; -- if autocommit is off
ลบพื้นที่ชั่วคราว:
DROP TABLESPACE tempspace;