转储带有外键和引用数据的 PostgreSQL 架构

Uno*_*ode 5 schema postgresql foreign-key dump

PostgreSQL 官方文档指出pg_dump可以使用该--schema=SCHEMA选项有选择地转储给定的模式。

然而,根据相同的文档(请阅读注释--schema=SCHEMA), 所选模式之外的对象的外键包含在转储中,但不包含它们引用的表。

话虽如此,我想知道如何转储给定的模式,使其包含所有需要的表,无论它们所在的模式如何,并且这是以安全/易于恢复转储的方式完成的。

此外,是否有可用的工具可以做到这一点?

谢谢

Chr*_*ers 2

我不知道有什么工具可以完全满足您现在的要求。我想建议一些您可能忽略的选项,但它们可能会满足您的需求。

数据库克隆

如果您的数据库没有被 24/7 使用,您可以克隆它用于测试用例。这可以在数据库未使用时使用:

createdb -U postgres new_dbname -T old_dbname
Run Code Online (Sandbox Code Playgroud)

这会执行数据库的文件级副本,因此它会保留所有数据,并且比转储和重新加载要快得多

当我想在一个数据库上运行测试用例时,我经常使用这种技术,但我不能保证所有内容都会回滚。

基础备份与恢复

如果您想将所有数据转移到另一台服务器上,您可以做的第二件事是将其设置为具有至少一个 wal_sender 的主服务器复制,并使用 pg_base_backup 通过网络克隆您的数据库集群。请注意,这是一个基于文件的克隆,因此这将是一个非常网络密集的过程(不仅仅是转储),但恢复会快得多。

编写自己的工具

拥有通用工具的一大困难是跨模式依赖关系可能非常复杂,处理所有可能的复杂性是一项艰巨的任务。然而,对于特定目的来说,这并不太难。我会推荐三个步骤,使用 pg_dump 来完成大部分工作,然后用一种语言或另一种语言编写脚本来添加我们希望的适度缺失的部分。我认为你甚至可以使用通过 psql 运行的 sql 脚本来做到这一点。

  1. 仅转储您需要的表的架构。创建新文件。就像是:pg_dump -t mytable1 -t mytable2 -t mytable3 > my_partial_dump.sql

  2. 将选定的数据导出到 csv,并使用 COPY 语句换行。这可以使用 psql 以及 echo 和 COPY TO STDOUT 来完成。这会附加到部分转储中。

  3. 按原样转储架构,并将其附加到部分转储中。

如果这是您所需要的,那么专用工具的优点是您可以手动管理其中的复杂部分,从而拥有比您可能需要的更小、更简单的工具。