PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

pg_dump mit --exclude-table schließt diese Tabellen immer noch in die im Hintergrund ausgeführten COPY-Befehle ein?

pg_dump sichert jede untergeordnete Tabelle separat und unabhängig von ihren Eltern. Wenn Sie also eine Hypertabelle ausschließen, werden ihre Chunk-Tabellen weiterhin gesichert. Daher beobachten Sie, dass alle Chunk-Tabellen immer noch ausgegeben werden.

Beachten Sie, dass das Ausschließen von Hypertabellen und Chunks nicht funktioniert, um den Dump korrekt in einer TimescaleDB-Instanz wiederherzustellen, da TimescaleDB-Metadaten nicht mit dem tatsächlichen Zustand der Datenbank übereinstimmen. TimescaleDB verwaltet Katalogtabellen mit Informationen über Hypertabellen und Chunks und sie sind nur weitere Benutzertabellen für pg_dump , also werden sie ausgegeben (was wichtig ist), aber wenn sie wiederhergestellt werden, enthalten sie alle Hypertabellen und Chunks, die vor dem Speicherauszug in der Datenbank waren.

Sie müssen also Daten aus den Tabellen ausschließen, die Sie ausschließen möchten (nicht Hypertabellen oder Chunks selbst), wodurch die Dump- und Wiederherstellungszeit verkürzt wird. Dann müssen die ausgeschlossenen Hypertabellen nach der Wiederherstellung gelöscht werden. Sie schließen Tabellendaten mit pg_dump aus Parameter --exclude-table-data . Es gibt ein Problem im TimescaleDB-GitHub-Repo, das diskutiert, wie Hypertable-Daten aus einem Dump ausgeschlossen werden . Das Problem schlägt vor, wie die Ausschlusszeichenfolge generiert wird:

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> ;

Alternativ finden Sie hypertable_id und schließen Sie Daten aus allen Chunk-Tabellen aus, denen die Hypertabellen-ID vorangestellt ist. Finden Sie hypertable_id aus der Katalogtabelle _timescaledb_catalog.hypertable :

SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';

Nehmen wir an, die ID ist 2. Sichern Sie dann die Datenbank gemäß den Anweisungen :

pg_dump -U user -Fc -f TestDB_Backup.bak \
  --exclude-table-data='_timescaledb_internal._hyper_2*' TestDB