LƯU Ý: Tôi đã thử nghiệm điều này trên 9.1. Tôi không có máy chủ 9.0 nằm quanh đây. Tôi chắc chắn rằng mặc dù nó sẽ hoạt động trên 9.0.
THẬN TRỌNG (Như đã lưu ý trong các nhận xét của @erny):
Note that high CPU load due to I/O operations may be expected.
Bạn có thể làm điều này với khá nhiều thời gian không bằng cách sử dụng một vùng bảng tạm thời. Thời gian xuống sẽ ở dạng khóa độc quyền. Nhưng chỉ trên bàn bạn đang hút bụi. Vì vậy, tất cả những gì sẽ xảy ra là các truy vấn của khách hàng sẽ chỉ cần đợi khóa được lấy nếu họ truy cập vào bảng được đề cập. Bạn không cần phải đóng các kết nối hiện có.
Mặc dù vậy, một điều cần lưu ý là việc di chuyển bàn và chân không đầy đủ sẽ cần phải đợi một khóa độc quyền trước!
Đầu tiên, bạn rõ ràng cần một số lưu trữ bổ sung. Như đã Stéphane
đề cập trong các bình luận, cái này cần phải lớn hơn ít nhất gấp đôi so với bảng trong câu hỏi cũng như VACUUM FULL
một bản sao đầy đủ. Nếu bạn may mắn và có thể tự động thêm một đĩa vào máy, hãy làm điều đó. Trong trường hợp xấu nhất, bạn chỉ có thể gắn đĩa USB (mặc dù rủi ro và chậm)!
Tiếp theo, gắn thiết bị mới và làm cho nó có sẵn dưới dạng không gian bảng:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Bạn có thể liệt kê các không gian bảng dễ dàng bằng cách sử dụng:
\db
Kiểm tra kỹ không gian bảng hiện tại của bảng của bạn (bạn cần biết nơi để di chuyển nó trở lại):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Nếu có NULL
, nó sẽ nằm trong vùng bảng mặc định:
SHOW default_tablespace;
Nếu đó là NULL
tốt, nó sẽ có khả năng pg_default
(kiểm tra các tài liệu chính thức trong trường hợp nó đã thay đổi).
Bây giờ di chuyển bảng qua:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Hút bụi:
VACUUM FULL mytable;
Di chuyển nó trở lại:
-- 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
Xóa không gian tạm thời:
DROP TABLESPACE tempspace;