pg_dump
会将每个子表单独且独立地从其父表中转储,因此当您排除一个超级表时,它的分块表仍将被转储。因此,您会发现所有分块表仍然被转储。
请注意,排除超级表和分块表将无法正确将转储还原到TimescaleDB实例中,因为TimescaleDB元数据将不匹配数据库的实际状态。TimescaleDB维护包含有关超级表和分块表信息的目录表,并且它们对于
pg_dump
来说只是另一个用户表(这很重要),因此它们将被转储,但在恢复它们时,它们将包含在转储之前数据库中存在的所有超级表和分块表。
因此,您需要排除您想要排除的表中的数据(而不是超级表或分块表本身),这将减少转储和还原时间。然后,在还原后,需要删除已排除的超级表。您可以使用
pg_dump
参数
--exclude-table-data
来排除表数据。在TimescaleDB GitHub存储库中有一个问题,
讨论如何从转储中排除超级表数据。该问题提供了如何生成排除字符串的建议:
SELECT string_agg(format($$
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
--exclude-table/-T
与模式匹配多个表。请参见此处模式。 - Adrian Klaver