使用pg_dump命令的--exclude-table选项,是否仍将这些表包含在后台运行的COPY命令中?

4

我试图备份一个TimescaleDB数据库,但要排除两个非常大的超级表(hypertables)。这意味着在备份运行时,我不希望看到基础块(underlying chunks)的任何COPY命令,但实际上我确实看到了!

假设TestDB是我的数据库,它有两个位于架构mySchema中的大型超级表hyper1hyper2,以及其他普通表。

我执行以下命令:

pg_dump -U user -F t TestDB --exclude-table "mySchema.hyper1" --exclude-table "mySchema.hyper2"  > TestDB_Backup.tar

然后我检查正在运行的查询(尤其是因为我没有预料到需要这么长时间),发现有几个COPY命令正在运行,每个表块都被排除。

这是TimescaleDB版本1.7.4

这种情况发生在你们中的任何人身上过吗?实际上在这里发生了什么?

附言:很抱歉我无法提供此问题的复现,并且这更像是一次讨论而不是一个实际的编程问题,但我仍然希望有人曾经见过这种情况并能向我展示我错过了什么 :)


尽管这里说可以这样做,但我猜想事实并非如此。我还猜测它排除了父表,但没有排除子(块)表。 - Adrian Klaver
是的,我也已经阅读了文档很多次,但我还是在这里。但我认为你可能对它只排除父级的想法有所发现。我会更仔细地研究它,感谢您的评论! - Rigerta
您可以使用--exclude-table/-T与模式匹配多个表。请参见此处模式 - Adrian Klaver
它只是从复制超块开始。太奇怪了。无论如何,谢谢! :) - Rigerta
不,我的意思是如果它们匹配模式,您可以在一个“--exclude-table”中排除多个表。因此,假设“hyper1”有名为“hyper1a、hyper1b等”的子表,“--exclude-table hyper1*”将匹配它们所有。 - Adrian Klaver
显示剩余8条评论
1个回答

6
pg_dump会将每个子表单独且独立地从其父表中转储,因此当您排除一个超级表时,它的分块表仍将被转储。因此,您会发现所有分块表仍然被转储。
请注意,排除超级表和分块表将无法正确将转储还原到TimescaleDB实例中,因为TimescaleDB元数据将不匹配数据库的实际状态。TimescaleDB维护包含有关超级表和分块表信息的目录表,并且它们对于pg_dump来说只是另一个用户表(这很重要),因此它们将被转储,但在恢复它们时,它们将包含在转储之前数据库中存在的所有超级表和分块表。
因此,您需要排除您想要排除的表中的数据(而不是超级表或分块表本身),这将减少转储和还原时间。然后,在还原后,需要删除已排除的超级表。您可以使用pg_dump参数--exclude-table-data来排除表数据。在TimescaleDB GitHub存储库中有一个问题,讨论如何从转储中排除超级表数据。该问题提供了如何生成排除字符串的建议:
SELECT string_agg(format($$--exclude-table-data='%s.%s'$$,coalesce(cc.schema_name,c.schema_name), coalesce(cc.table_name, c.table_name)), ' ')
FROM _timescaledb_catalog.hypertable h 
  INNER JOIN _timescaledb_catalog.chunk c on c.hypertable_id = h.id 
  LEFT JOIN _timescaledb_catalog.chunk cc on c.compressed_chunk_id = cc.id
WHERE h.schema_name = <foo> AND h.table_name = <bar> ;

或者,您可以找到 hypertable_id 并从所有以 hypertable id 为前缀的块表中排除数据。从目录表 _timescaledb_catalog.hypertable 中查找 hypertable_id

SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';

假设id为2。根据说明转储数据库:
pg_dump -U user -Fc -f TestDB_Backup.bak \
  --exclude-table-data='_timescaledb_internal._hyper_2*' TestDB 

1
是的,这就是问题所在。当排除超级表时,pg_dump仍会转储块!感谢您撰写此答案,我忘记更新了,我找到了问题所在。 - Rigerta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接