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

前端之家收集整理的这篇文章主要介绍了从备份恢复PostgreSQL数据库没有外键约束问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个大约85个表的 postgresql数据库.我在复制模式下使用pg_dump(通过PHP-pgadmin)定期进行备份,备份文件的大小几乎为10-12 MB.现在我遇到的问题是,每当我尝试恢复数据库时,都会出现外键约束问题.方案如下:

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

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

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

听起来你正在从pg_dump获得sql转储而不是二进制转储.这将为您提供一大堆sql,其中包含顶部的架构(包括FK),然后是一堆INSERT来重新加载数据.从 pg_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一起使用.

原文链接:https://www.f2er.com/postgresql/192164.html

猜你在找的Postgre SQL相关文章