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

从备份中恢复PostgreSQL数据库而不存在外键约束问题,postgresql,database-backups,Postgresql,Database Backups,我有一个postgresql数据库,大约有85个以上的表。我在复制模式下定期使用pg_dump(通过php pgadmin)进行备份,备份文件的大小几乎为10-12 MB。现在我面临的问题是,每当我尝试恢复数据库时,就会出现外键约束问题。情况如下: 有两个表:1)用户和2)区域。我已将区域id存储在users表中,以识别用户的区域,并将其设置为外键 当我进行数据库转储时,table区域的条目仅位于table用户的条目之后。我认为这是由于表名的第一个字母:u位于z之前,因此当我恢复数据库时,出现外

我有一个postgresql数据库,大约有85个以上的表。我在复制模式下定期使用
pg_dump
(通过php pgadmin)进行备份,备份文件的大小几乎为10-12 MB。现在我面临的问题是,每当我尝试恢复数据库时,就会出现外键约束问题。情况如下:

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

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

有什么解决办法吗?还有其他可行的备份方法吗

使用pgdump(通过php pgadmin)

您确定PhpPgAdmin正在使用pg_dump创建备份吗?我从未见过pg_dump进行任何转储,在恢复转储时外键出现问题


PhpPgAdmin只是一个PHP脚本,在大多数情况下,它没有启动像pg_dump这样的程序的权限。

我会先删除fk创建并将其添加到脚本的末尾。

听起来像是从
pg_dump
获得SQL转储而不是二进制转储。这将为您提供一大堆SQL,其中模式(包括FKs)位于顶部,然后是一系列插入以重新加载数据。来自的二进制转储将更好地为您服务,看起来您需要一些额外的配置来告诉PhpPgAdmin
pg_dump
在哪里。然后,您将二进制转储输入到
pg_restore
中,
pg_restore
将以正确的顺序重建所有内容,以避免引用完整性问题(或者更准确地说,
pg_restore
将恢复所有数据,然后添加约束)

而不是
pg\u还原
。我觉得这很难相信,但我在文档中找不到任何关于调用
pg_restore
的内容。如果这是真的,那么您可能必须手动编辑SQL转储并将所有FK移到末尾

您还可以尝试在SQL转储的顶部添加,这会将约束检查延迟到事务结束,您还需要确保整个插入块都包含在事务中


如果PhpPgAdmin真的无法调用
pg\u restore
,那么最好手动使用
pg\u dump
pg\u restore
,以便对备份过程进行必要的控制。很抱歉,任何不能用FKs备份数据库的数据库管理工具都比没用更糟糕。希望了解PhpPgAdmin的人会出现,让我们知道如何使用PhpPgAdmin的
pg_restore

如果这对任何人都有帮助:之前建议的解决方案都不适合我(有一些插入引用了后来转储的数据,如果是二进制格式,则是独立的,或者是纯SQL查询)

我所做的:我使用了一个脚本,除了其他功能外,比如底层ER模型的一个非常有用的html图表,它生成了两个非常有用的列表:一个“插入顺序”(考虑到现有的限制和依赖性,所有表都列为执行插入的最佳顺序)和一个“删除顺序”(对于删除表格非常有用)


如果您想要一个示例,请检查此项。特别是,上面提到的两个示例列表(尝试发布直接链接,但垃圾邮件预防机制允许我只发布两个链接)。

我发现您可以在sql的开头添加(这将停止外键检查):

SET session\u replication\u role=replica;

最后(恢复检查):


SET session\u replication\u role=origin;

我曾经遇到过这样的情况,我在单独的文件中备份了结构和数据,因此我可以这样还原信息:

ALTER TABLE table_name DISABLE TRIGGER ALL;
从pg Admin恢复数据库

ALTER TABLE table_name ENABLE TRIGGER ALL;

实际上,我通过phppgadmin接口本身将从phppgadmin获得的转储作为sql发送……我相信phppgadmin使用pgdump进行备份……我错了吗?【链接】说它可以使用pg_dump..但我不确定当转储完成时接口是否使用pg_dump..有人能确认吗?是的pg_restore是我想要的..现在数据迁移工作正常,但现在出现了一个新问题..当我导入数据库结构,并使用pg_restore将其还原到新数据库时,出现了类似错误的情况“序列X已经存在"出现..我发现问题在于数据库转储中自动递增字段的数据类型是bigserial,因此postgres会根据列名自动创建一个序列..但是在create table语句下面,转储中有一个create sequence语句,该语句创建了一个与postgres自动生成的序列同名的序列,并且这个行错误..有解决方案吗?@Midhun:您应该还原到一个空数据库中,然后
pg_restore
将设置所有内容。或者,如果您的架构已经就位但没有数据,您可以告诉
pg_restore
只还原数据。听起来架构已经存在,您的还原正在尝试将架构还原为空好的,这些是样品清单!!!