sql >> データベース >  >> RDS >> PostgreSQL

--exclude-tableを指定したpg_dumpには、実行するバックグラウンドCOPYコマンドにこれらのテーブルが含まれていますか?

    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 
    



    1. JavaでMySQL削除ステートメントを実行する際の問題

    2. DATE型列のデフォルト値を時間部分のない現在の日付に設定しますか?

    3. doctrineDQLまたはQueryBuilderを使用してMySqlクエリを変換できません

    4. GRANT USAGE ON SCHEMAは正確に何をしますか?