Rig*_*iri 4 postgresql timescaledb
我正在尝试备份 TimescaleDB 数据库,不包括两个非常大的超级表。这意味着在备份运行时,我不会期望看到COPY底层块的任何命令,但我确实看到了!
假设TestDB我的数据库有两个mySchema名为hyper1和的大型超级表hyper2,以及其他普通表。
我运行以下命令:
pg_dump -U user -F t TestDB --exclude-table "mySchema.hyper1" --exclude-table "mySchema.hyper2" > TestDB_Backup.tar
Run Code Online (Sandbox Code Playgroud)
然后我检查正在运行的查询(尤其是因为我没想到它会花这么长时间),我发现对于我实际排除的表的每个块,有几个 COPY 命令正在运行。
这是TimescaleDB版本1.7.4。
你们中有人遇到过这种情况吗?这里到底发生了什么?
附:很抱歉,我无法真正为此提供重现,这更多的是讨论而不是实际的程序问题,但我仍然希望有人以前见过这个并可以告诉我我错过了什么:)
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> ;
Run Code Online (Sandbox Code Playgroud)
或者,您可以hypertable_id从所有以超表 ID 为前缀的块表中查找并排除数据。hypertable_id从目录表中查找_timescaledb_catalog.hypertable:
SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';
Run Code Online (Sandbox Code Playgroud)
假设 id 是 2。然后根据说明转储数据库:
pg_dump -U user -Fc -f TestDB_Backup.bak \
--exclude-table-data='_timescaledb_internal._hyper_2*' TestDB
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7291 次 |
| 最近记录: |