pg_dump with --exclude-table 仍然在它运行的后台 COPY 命令中包含那些 tables?

pg_dump with --exclude-table still includes those tables in the background COPY commands it runs?

我正在尝试备份 TimescaleDB 数据库,不包括两个非常大的超表。 这意味着虽然备份是 运行ning,但我不希望看到底层块的任何 COPY 命令,但我确实看到了!

假设 TestDB 是我的数据库,它在模式 mySchema 上有两个大型超表,分别称为 hyper1hyper2,以及其他普通表。

我运行以下命令:

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

然后我检查了 运行ning 查询(特别是因为我没想到它需要 this 长)并且我发现几个 COPY 命令是 运行ning,对于我实际排除的每个表块。

这是 TimescaleDB 版本 1.7.4

你们中有人遇到过这种情况吗?这里到底发生了什么?

ps。很抱歉,我真的不能为此提供重现,这更多的是讨论而不是实际的编程问题,但我仍然希望有人以前看过这个,可以告诉我我错过了什么:)

pg_dump 将每个 child table 与它们的 parents 分开且独立地转储,因此当您排除一个 hypertable 时,它的块 tables 仍将被转储。因此你观察到所有块 tables 仍然被转储。

请注意,排除 hypertables 和块将无法将转储正确恢复到 TimescaleDB 实例中,因为 TimescaleDB 元数据与数据库的实际状态不匹配。 TimescaleDB 维护目录 tables,其中包含有关 hypertables 和块的信息,它们只是 tables 的另一个用户 pg_dump,因此它将转储它们(这很重要) , 但当它们被恢复时,它们将包含所有 hypertables 和块,它们在转储之前在数据库中。

所以你需要从你想排除的 tables 中排除数据(不是 hypertables 或块本身),这将减少转储和恢复时间。然后有必要在恢复后删除排除的 hypertables。您使用 pg_dump 参数 --exclude-table-data 排除了 table 数据。 TimescaleDB GitHub 存储库 discusses how to exclude hypertable data from a dump 中存在问题。该问题建议如何生成排除字符串:

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 的块 table 中排除数据。从目录 table 中查找 hypertable_id _timescaledb_catalog.hypertable:

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

假设id为2,则根据the instructions:

dump数据库
pg_dump -U user -Fc -f TestDB_Backup.bak \
  --exclude-table-data='_timescaledb_internal._hyper_2*' TestDB