如何仅针对表而不针对触发器和函数执行 pg_dump?
Posted
技术标签:
【中文标题】如何仅针对表而不针对触发器和函数执行 pg_dump?【英文标题】:How to do a pg_dump for only tables only and not triggers and functions? 【发布时间】:2021-03-07 23:25:48 【问题描述】:我想要什么: 我想要一个数据库的 pg_dump(我们称数据库为“测试”)。 在这个 pg_dump 中,我只想要表没有以下内容:数据、触发器、函数、序列等。
我正在做什么来得到我想要的: 我运行的命令如下:
pg_dump -U postgres -s test > dump_test.sql
我所观察到的: 然后,当我尝试在另一台服务器上恢复此转储时,如下所示:
pg_dump -U postgres new_amazing_test < dump_test.sql
我注意到运行上述命令的部分输出内容如下:
CREATE TRIGGER
CREATE FUNCTION
CREATE SEQUENCE
CREATE INDEX
我真正想要的: 我想要的只是表本身,而不是这些触发器、函数、序列和索引。我如何只获取表格?
我尝试过/考虑过的其他事情:
我试过这样做:
pg_dump -U postgres -s -schema=\dtmvE test > dump_test.sql
但它不起作用,因为模式需要是名称而不是 \d 模式。
有关-n pattern
选项的信息,请参见此处:https://www.postgresql.org/docs/13/app-pgdump.html。
可以解决它的一件事是使用多个这样的开关:
pgdump -t mytable1 -t mytable2 -t mytable3 ... -t mytableN > dump_test.sql
但是,上述解决方案是不切实际的,因为我的数据库中有大约 70 多个表。
其他相关信息: PostgreSQL 版本为 13.1 Ubuntu 版本 v16.04(我也在 Ubuntu v18.04 上试过这个)
【问题讨论】:
@LaurenzAlbe 请救救我。 您可以编写一个 bash 脚本来遍历您想要的所有表。使用SELECT relname FROM pg_class WHERE relkind = 'r' AND <some_other_condition>
生成表格列表。然后使用您的“多开关”方法生成转储文件
【参考方案1】:
我将使用自定义格式仅模式转储 (-F c -s
) 转储所有内容,并在结果转储上运行 pg_restore -l
。这给了你一个目录。从该文件中删除除表格之外的所有内容,并将其用作pg_restore -L
的输入,以便从存档中准确恢复您需要的那些项目。
这可能不像您希望的那么简单,但它肯定比编写大量 -t
选项更简单,并且您可以将其自动化。
【讨论】:
以上是关于如何仅针对表而不针对触发器和函数执行 pg_dump?的主要内容,如果未能解决你的问题,请参考以下文章
delaysContentTouches 仅针对特定元素而不进行子类化?