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
を見つけることもできます ハイパーテーブルIDのプレフィックスが付いたすべてのチャンクテーブルからデータを除外します。 hypertable_id
を見つけます カタログテーブルから_timescaledb_catalog.hypertable
:
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