加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:18:46 所属栏目:百科 来源:网络整理
导读:我有一个大约85个表的 postgresql数据库.我在复制模式下使用pg_dump(通过php-pgadmin)定期进行备份,备份文件的大小几乎为10-12 MB.现在我遇到的问题是,每当我尝试恢复数据库时,都会出现外键约束问题.方案如下: 有两个表:1)用户和2)区域.我已在users表中存
我有一个大约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一起使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读