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
上有两个大型超表,分别称为 hyper1
和 hyper2
,以及其他普通表。
我运行以下命令:
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
我正在尝试备份 TimescaleDB 数据库,不包括两个非常大的超表。
这意味着虽然备份是 运行ning,但我不希望看到底层块的任何 COPY
命令,但我确实看到了!
假设 TestDB
是我的数据库,它在模式 mySchema
上有两个大型超表,分别称为 hyper1
和 hyper2
,以及其他普通表。
我运行以下命令:
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