使用外键约束从 pg_dump 恢复

Jer*_*ome 10 postgresql foreign-key restore pg-dump postgresql-9.4

在从 恢复数据库时pg_dump,会产生许多错误,随后整个表都会被忽略。一个例子:

ERROR:  insert or update on table "channelproducts" violates foreign key constraint "fk_rails_dfaae373a5"
DETAIL:  Key (channel_id)=(1) is not present in table "channels".
Run Code Online (Sandbox Code Playgroud)

有趣的是,我注意到所有这些实例都是由于加载顺序而弹出的。channelschannelproducts按字母顺序和在文件中之后,因此我可以理解为什么 postgres 抱怨必须创建一个没有父母的孩子。

警告:外键是由 rails 4.2 自动生成的:我可以从源头上删除问题,但这仍然没有真正解决问题......

版本:PostgreSQL 9.4.4。

psql如果已经创建了数据库表和列,那么如何从外键约束的情况中恢复?

ach*_*imh 10

您可以放在SET session_replication_role = replica;SQL 文件的顶部。这将在数​​据插入期间忽略约束 由于设置是基于会话的,因此约束将继续在此脚本之外工作。

但要注意:如果在此设置处于活动状态时创建不一致的数据,postgres 将保留它们。仅在插入/更新时检查约束。

请参阅https://www.endpoint.com/blog/2015/01/28/postgres-sessionreplication-role更深入地讨论这种方法的优缺点。

  • 危险,威尔罗宾逊!此设置是为非常低级的工具设计的,这些工具需要能够在 Postgres 工作时禁用系统规则、触发器和约束。最终用户不应该使用它。 (4认同)
  • 是的,此设置存在危险。但是是否用于复制目的,恕我直言,包括恢复数据库。因此,我不认为这是对设置的滥用。 (4认同)
  • @Colin'tHart - 当您指出问题并且不提供替代解决方案或解决方法时,这是非常无益的。如果这个方法很危险,您是否有建议的解决方案? (2认同)