从备份中恢复PostgreSQL数据库,不存在外键约束问题

e5nqia27  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(7)|浏览(343)

我有一个postgresql数据库,里面有85多个表,我经常使用pg_dump(通过php-pgadmin)在复制模式下进行备份,备份文件的大小几乎是10-12 MB,现在我面临的问题是每当我试图恢复数据库时,外键约束问题就会出现,场景如下:
有两个表:1)users和2)zones。我已经将区域的id存储在users表中以标识用户的区域,并将其设置为外键。
当我进行数据库转储时,表zones的条目只出现在表users的条目之后,我认为这是由于表名的第一个字母:uz之前,因此当我恢复数据库时,发生了外键约束问题,执行停止。当我尝试恢复db结构时,发生了相同的问题,它说表zones不存在于数据库中,因为转储文件中zones的结构在users的结构之后。
有没有解决办法?有没有其他可行的备份方法?

yks3o0rb

yks3o0rb1#

听起来像是从pg_dump获得了SQL转储而不是二进制转储。(包括FK),然后执行一系列INSERT来重新加载数据。来自pg_dump的二进制转储将更好地为您服务,看起来你需要一些额外的配置来告诉PhpPgAdmin pg_dump在哪里。d将该二进制转储提供给pg_restorepg_restore将以正确顺序重建所有内容,以避免引用完整性问题(或者,更准确地说,pg_restore将恢复所有数据,然后添加约束)。
PhpPgAdmin似乎想使用普通的SQL转储而不是pg_restore。我觉得这很难相信,但我在文档中找不到任何关于调用pg_restore的内容。如果这是真的,那么您可能需要手动编辑SQL转储并将所有FK移到末尾。
您还可以尝试在SQL转储的顶部添加SET CONSTRAINTS ALL DEFERRED;,这应该会将约束检查延迟到事务结束,您还需要确保整个INSERT块都包含在事务中。
如果PhpPgAdmin真的不能调用pg_restore,那么您最好手动使用pg_dumppg_restore,这样您就可以对备份过程进行必要的控制。抱歉,任何数据库管理工具如果不能处理使用FK备份数据库,那就更糟了。希望有人知道他们的方式周围的PhpPgAdmin将出现,让我们知道如何使用pg_restore与PhpPgAdmin。

1qczuiv0

1qczuiv02#

我发现您可以在sql的开头添加(这将停止外键检查):
SET session_replication_role = replica;
最后(恢复检查):
SET session_replication_role = origin;

rmbxnbpk

rmbxnbpk3#

如果这对任何人有帮助:以前建议的解决方案对我来说都不起作用(有些INSERT引用了后来转储的数据,独立于二进制格式或普通SQL查询)。
我所做的:我使用了schemaspy,这是一个脚本--除了其他特性之外,比如一个非常有用的底层ER模型的html图--它生成了两个非常有用的列表:“插入顺序”(考虑到现有的限制和依赖关系,所有表都以最佳顺序列出,以便执行插入)和“删除顺序”(对于删除表非常有用)。
如果你想要一个样本,检查这个http://schemaspy.sourceforge.net/sample/。特别是,有两个样本列表,我刚刚提到(试图张贴直接链接,但垃圾邮件预防机制允许我张贴只有2个链接)。

gj3fmq9x

gj3fmq9x4#

我曾经遇到过这种情况,我在单独的文件中备份了结构和数据,所以这是我能够恢复信息的方式:

ALTER TABLE table_name DISABLE TRIGGER ALL;

从pg Admin还原数据库

ALTER TABLE table_name ENABLE TRIGGER ALL;
yacmzcpb

yacmzcpb5#

使用pgdump(通过php-pgadmin)
你确定PhpPgAdmin正在使用pg_dump创建备份吗?我从来没有见过任何由pg_dump创建的转储文件,在恢复转储文件时有外键问题。
PhpPgAdmin只是一个PHP脚本,在大多数情况下,它没有启动pg_dump这样的程序的权限。

i34xakig

i34xakig6#

我将删除前面的fk创建,并将其添加到脚本的末尾。

nfg76nw0

nfg76nw07#

我将远程pstgres数据库备份为.dump文件mybackup.dump
现在,当恢复它在我的本地数据库,我使用下面的命令:

pg_restore -d local_db_name mybackup.dump

但我遇到了与问题中突出显示的外键相同的问题,由于备份数据表的顺序问题,因此为了忽略数据恢复的外键问题,我首先执行了上述命令,其中表创建查询成功,但由于外键问题数据恢复失败,然后我运行了以下命令,这有助于忽略外键检查并恢复数据,

pg_restore -d local_db_name mybackup.dump --disable-triggers --superuser=postgres --data-only

正如可以看到的,我已经通过了一些额外的参数作为禁用触发器和数据只恢复(忽略颜色变化的文本从'--diable...'),也需要通过超级用户,这可能是大多数postgres,但检查了一次在您的目标机器。

相关问题