如果只备份一张表,请在数据库中使用COPY:
COPY user_tbl TO '/path/to/file';
或来自 shell 的 pg_dump:
pg_dump -t user_tbl mydb > user_tbl.sql
然后删除数据库,恢复你的新版本,清空user_tbl并使用COPY FROM恢复一张表:
COPY user_tbl FROM '/path/to/file';
或使用 psql 从 shell 中的一张表恢复备份:
psql -f user_tbl.sql mydb
识别依赖表
又快又脏
没有“复制...级联”之类的东西。识别依赖表的最简单方法是启动事务,调用TRUNCATE tbl CASCADE 并记录您收到的通知:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
然后回滚事务 - 所以实际上没有任何变化:
ROLLBACK;
小心点。如果你 COMMIT 截断通过。
缓慢而确定
嗯,实际上并不“慢”,但代码要复杂得多。不过,这不会对所涉及的表进行排他锁,因此更清洁、更安全:
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;
返回:
tbl
------
tbl1
tbl2
tbl3
我在目录表pg_constraint 上使用recursive CTE(需要PostgreSQL 8.4 或更高版本),因为每个表都可以依次具有依赖关系。
使用UNION,而不是UNION ALL,以避免对可能直接或间接与多个外键链接的表进行多次评估。