Làm thế nào để nhân đôi bảng postgres lớn?


29

Tôi có bảng postgres khổng lồ (10GB dữ liệu - 160M hồ sơ). Bảng là tĩnh và không có thao tác ghi trên nó được thực hiện. Tôi muốn sao chép nó, thực hiện ghi, reindex nó và sau đó với một giao dịch nhanh duy nhất xóa cái cũ và đổi tên cái mới thành tên gốc.

Cách nhanh nhất để nhân đôi bảng lớn như vậy là gì?

Câu trả lời:


55

Nói chung, cách nhanh nhất để sao chép bảng chỉ đơn giản là:

CREATE TABLE table2 AS SELECT * FROM table1;

Các INSERT song song có thể nhanh hơn, nhưng chỉ với một hệ thống con đĩa rất nhanh (khi dữ liệu được xen kẽ trên nhiều ổ đĩa). Nếu không thì điều này sẽ chậm hơn.

Khi bạn đã hoàn tất việc sửa đổi table2, nó có thể lấy tên mới bằng:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

Các DROP TABLElệnh cần một khóa độc quyền, làm ảnh hưởng đến bạn đọc đồng thời trong một cách mà bạn có thể muốn dự đoán:

  • DROP sẽ chờ cho bất kỳ đọc đang chờ xử lý trên bảng từ các giao dịch khác để kết thúc.
  • Bất kỳ giao dịch mới nào cố gắng đọc bảng đó trong thời gian đó sẽ được đặt trong trạng thái chờ, và sau đó thất bại do bản gốc table1không còn tồn tại. Lỗi sẽ giống như "không thể mở quan hệ với OID oid "

Để tránh vấn đề thứ hai, bạn có thể đổi tên table1 thành old_table1 thay vì bỏ nó và sau đó chỉ thả nó sau giao dịch, khi những độc giả này đã hoàn thành nó. Vì vậy, chuỗi trên sẽ trở thành:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
Cảm ơn người đàn ông. Đây chính xác là loại giải thích mà tôi đang tìm kiếm. Cảm ơn một lần nữa!
Milovan Zogovic

Nếu có các chỉ mục được xác định trên bảng2, liệu chúng có còn hoạt động sau khi bảng được đổi tên không?
BamaPookie

1
@BamaPookie kiểm tra điều này để biết toàn bộ lược đồ bao gồm các chỉ mục, các ràng buộc và mặc định wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.