我有一个大约85个表的
postgresql数据库.我在复制模式下使用pg_dump(通过PHP-pgadmin)定期进行备份,备份文件的大小几乎为10-12 MB.现在我遇到的问题是,每当我尝试恢复数据库时,都会出现外键约束问题.方案如下:
有两个表:1)用户和2)区域.我已在users表中存储了zone的id以标识用户的区域并将其设置为外键.
当我进行数据库转储时,表区域的条目仅在表用户之后.我认为这是由于表名的第一个字母:u在z之前出现,因此当我恢复数据库时,会出现外键约束问题并且执行停止.当我尝试恢复数据库结构时会出现同样的问题,它表示数据库中不存在表区域,因为区域结构位于转储文件中的用户之后.
听起来你正在从pg_dump获得sql转储而不是二进制转储.这将为您提供一大堆sql,其中包含顶部的架构(包括FK),然后是一堆INSERT来重新加载数据.从
原文链接:https://www.f2er.com/postgresql/192164.htmlpg_dump
开始的二进制转储会更好地为您服务,看起来您需要一些额外的配置来告诉PHPPgAdmin pg_dump在哪里.然后你将这个二进制转储提供给pg_restore,pg_restore将以正确的顺序重建所有内容以避免引用完整性问题(或者更准确地说,pg_restore将恢复所有数据然后添加约束).
PhpPgAdmin seems to want to work with plain SQL dumps而不是pg_restore.我发现这很难相信,但我在文档中找不到有关调用pg_restore的任何内容.如果这是真的那么你可能需要手动编辑sql转储并将所有FK移动到最后.
您还可以尝试在sql转储的顶部添加SET CONSTRAINTS ALL DEFERRED;
,这应该延迟约束检查直到事务结束,您还需要确保整个INSERT块包含在事务中.
如果PHPPgAdmin真的无法调用pg_restore那么你最好手动使用pg_dump和pg_restore,这样你就可以对备份过程进行必要的控制.抱歉,任何无法处理使用FK备份数据库的数据库管理工具都比无用更糟糕.希望有知道PHPPgAdmin的人会出现并让我们知道如何将pg_restore与PHPPgAdmin一起使用.