从备份中恢复PostgreSQL数据库而不存在外键约束问题
我有一个postgresql数据库,大约有85个以上的表。我在复制模式下定期使用从备份中恢复PostgreSQL数据库而不存在外键约束问题,postgresql,database-backups,Postgresql,Database Backups,我有一个postgresql数据库,大约有85个以上的表。我在复制模式下定期使用pg_dump(通过php pgadmin)进行备份,备份文件的大小几乎为10-12 MB。现在我面临的问题是,每当我尝试恢复数据库时,就会出现外键约束问题。情况如下: 有两个表:1)用户和2)区域。我已将区域id存储在users表中,以识别用户的区域,并将其设置为外键 当我进行数据库转储时,table区域的条目仅位于table用户的条目之后。我认为这是由于表名的第一个字母:u位于z之前,因此当我恢复数据库时,出现外
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)位于顶部,然后是一系列插入以重新加载数据。来自的二进制转储将更好地为您服务,看起来您需要一些额外的配置来告诉PhpPgAdminpg_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
只还原数据。听起来架构已经存在,您的还原正在尝试将架构还原为空好的,这些是样品清单!!!