从备份恢复PostgreSQL数据库没有外键约束问题

Bla*_*der 9 postgresql database-backups

我有一个大约85+表的postgresql数据库.我pg_dump在复制模式下使用(通过php-pgadmin)定期备份,备份文件的大小几乎是10-12 MB.现在我面临的问题是,每当我尝试恢复数据库时,都会出现外键约束问题.方案如下:

有两个表:1)users和2)zones.我已经在users表中存储了区域的id 以识别用户的区域并将其设置为外键.

当我进行db转储时,表的条目zones仅在表的条目之后users.我认为这是由于表名的第一个字母:u来之前z,因此当我恢复数据库时,会发生外键约束问题并且执行停止.当我尝试恢复数据库结构时会出现同样的问题,它表示zones数据库中不存在该表,因为在转储文件中的结构zones之后users.

这有什么解决方案吗?还有其他备用方法可行吗?

ven*_*mus 11

我发现你可以在 sql 的开头添加(这将停止外键检查):

SET session_replication_role = replica;

最后(恢复检查):

SET session_replication_role = origin;


mu *_*ort 7

听起来你正在获得一个SQL转储而不是二进制转储pg_dump.这将为您提供一大堆SQL,其中模式(包括FK)位于顶部,然后是一堆INSERT来重新加载数据.二进制转储来pg_dump为您提供更好的服务,看起来您需要一些额外的配置来告诉PhpPgAdmin在哪里pg_dump.然后,您将该二进制转储提供给pg_restorepg_restore以正确的顺序重建所有内容,以避免引用完整性问题(或者,更准确地说,pg_restore将恢复所有数据,然后添加约束).

PhpPgAdmin似乎想要使用纯SQL转储而不是pg_restore.我觉得这很难相信,但我在文档中找不到有关调用的内容pg_restore.如果这是真的那么你可能需要手动编辑SQL转储并将所有FK移动到最后.

您还可以尝试SET CONSTRAINTS ALL DEFERRED;在SQL转储的顶部添加,这应该延迟约束检查直到事务结束,您还需要确保整个INSERT块包含在事务中.

如果PhpPgAdmin确实无法调用pg_restore那么您最好使用pg_dumppg_restore手动使用,这样您就可以对备份过程进行必要的控制.抱歉,任何无法处理使用FK备份数据库的数据库管理工具都比无用更糟糕.希望知道PhpPgAdmin的方式的人会出现并让我们知道如何使用pg_restorePhpPgAdmin.