Để chỉ sao lưu một bảng, hãy sử dụng COPY
từ bên trong cơ sở dữ liệu:
COPY user_tbl TO '/path/to/file';
hoặc pg_dump
từ vỏ:
pg_dump -t user_tbl mydb > user_tbl.sql
Sau đó thả cơ sở dữ liệu, khôi phục phiên bản mới của bạn, trống user_tbl
và sử dụng COPY FROM
để khôi phục một bảng:
COPY user_tbl FROM '/path/to/file';
hoặc khôi phục bản sao lưu bằng một bảng từ shell với psql
:
psql -f user_tbl.sql mydb
Xác định các bảng phụ thuộc
Nhanh và bẩn
Không có cái gọi là "SAO CHÉP ... CASCADE". Phương pháp đơn giản nhất để xác định các bảng phụ thuộc sẽ là bắt đầu một giao dịch, gọi TRUNCATE tbl CASCADE
và ghi lại các thông báo bạn nhận được:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Sau đó quay trở lại giao dịch - vì vậy không có gì thực sự thay đổi:
ROLLBACK;
Cẩn thận với điều đó. Nếu bạn COMMIT
đường cắt ngắn đi qua.
Chậm và chắc
Chà, không thực sự "chậm", nhưng mã phức tạp hơn rất nhiều. Tuy nhiên, điều này không có một khóa riêng trên các bảng liên quan, vì vậy nó sạch sẽ và an toàn hơn rất nhiều:
WITH RECURSIVE x AS (
SELECT conrelid::regclass
FROM pg_constraint
WHERE confrelid = 'user_tbl'::regclass
UNION
SELECT p.conrelid::regclass
FROM x
JOIN pg_constraint p ON p.confrelid = x.conrelid
)
SELECT conrelid::text AS tbl
FROM x;
Lợi nhuận:
tbl
------
tbl1
tbl2
tbl3
Tôi sử dụng CTE đệ quy
(yêu cầu PostgreSQL 8.4 trở lên) trên bảng danh mục pg_constraint
, bởi vì mỗi bảng có thể có các phụ thuộc lần lượt.
Sử dụng UNION
, không phải UNION ALL
để tránh đánh giá nhiều bảng có thể được liên kết với nhiều khóa ngoại trực tiếp hoặc gián tiếp.