PostgreSQL恢复单个schema前是否需要先删除现有对应schema?
PostgreSQL单Schema恢复方案
报错原因说明
你遇到的报错是因为目标schema中已经存在同名外键约束,pg_restore默认不会覆盖现有对象,因此创建重复对象时触发冲突。
是否需要提前删除目标schema
如果你的恢复需求是完全替换现有目标schema,提前删除目标schema是最稳妥的方案,该操作仅会清理指定schema下的所有对象,完全不会影响另一个独立schema。
不影响其他schema的正确操作步骤
- 第一步:终止所有连接到待恢复schema的活跃会话,避免删除时触发锁冲突,在数据库中执行如下SQL:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '你的实际数据库名' AND pid <> pg_backend_pid() AND search_path LIKE '%待恢复的schema名称%';
- 第二步:删除待恢复的目标schema及级联所有下属对象:
DROP SCHEMA IF EXISTS 待恢复的schema名称 CASCADE;
- 第三步:执行恢复命令,额外添加
-c(清理已存在对象)、--if-exists参数避免残留对象报错:
pg_restore -d db_name -h localhost -U user_name -n schema_name -c --if-exists < path/file_name.sql
补充注意:如果你的备份存在跨schema的外键依赖(比如报错中的外键关联了另一个schema的表),恢复前需要确认另一个schema的关联表、关联字段正常存在,否则恢复外键时仍会触发报错。如果不需要恢复约束,可以在pg_restore命令中添加
--disable-triggers参数临时禁用约束检查,恢复完成后手动校验即可。
内容的提问来源于stack exchange,提问作者Anton Makarov
相关产品推荐
相关产品推荐

