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;
听起来你正在获得一个SQL转储而不是二进制转储pg_dump.这将为您提供一大堆SQL,其中模式(包括FK)位于顶部,然后是一堆INSERT来重新加载数据.二进制转储来pg_dump为您提供更好的服务,看起来您需要一些额外的配置来告诉PhpPgAdmin在哪里pg_dump.然后,您将该二进制转储提供给pg_restore并pg_restore以正确的顺序重建所有内容,以避免引用完整性问题(或者,更准确地说,pg_restore将恢复所有数据,然后添加约束).
PhpPgAdmin似乎想要使用纯SQL转储而不是pg_restore.我觉得这很难相信,但我在文档中找不到有关调用的内容pg_restore.如果这是真的那么你可能需要手动编辑SQL转储并将所有FK移动到最后.
您还可以尝试SET CONSTRAINTS ALL DEFERRED;在SQL转储的顶部添加,这应该延迟约束检查直到事务结束,您还需要确保整个INSERT块包含在事务中.
如果PhpPgAdmin确实无法调用pg_restore那么您最好使用pg_dump和pg_restore手动使用,这样您就可以对备份过程进行必要的控制.抱歉,任何无法处理使用FK备份数据库的数据库管理工具都比无用更糟糕.希望知道PhpPgAdmin的方式的人会出现并让我们知道如何使用pg_restorePhpPgAdmin.
| 归档时间: | 
 | 
| 查看次数: | 17439 次 | 
| 最近记录: |