sql >> Database >  >> RDS >> PostgreSQL

pg_dump met --exclude-table bevat nog steeds die tabellen op de achtergrond COPY-commando's die het uitvoert?

pg_dump dumpt elke onderliggende tabel afzonderlijk en onafhankelijk van hun ouders, dus als u een hypertabel uitsluit, worden de chunk-tabellen nog steeds gedumpt. Zo zie je dat alle chunk-tabellen nog steeds worden gedumpt.

Houd er rekening mee dat het uitsluiten van hypertabellen en chunks niet werkt om de dump correct te herstellen in een TimescaleDB-instantie, aangezien TimescaleDB-metagegevens niet overeenkomen met de werkelijke status van de database. TimescaleDB onderhoudt catalogustabellen met informatie over hypertabellen en chunks en het zijn gewoon andere gebruikerstabellen voor pg_dump , dus het zal ze dumpen (wat belangrijk is), maar wanneer ze worden hersteld, zullen ze alle hypertabellen en chunks bevatten, die zich vóór de dump in de database bevonden.

U moet dus gegevens uitsluiten van de tabellen die u wilt uitsluiten (niet hypertables of chunks zelf), wat de dump- en hersteltijd verkort. Dan is het nodig om de uitgesloten hypertabellen na het herstel te verwijderen. U sluit tabelgegevens uit met pg_dump parameter --exclude-table-data . Er is een probleem in de TimescaleDB GitHub-repo, die bespreekt hoe hypertabelgegevens van een dump kunnen worden uitgesloten . Het probleem geeft aan hoe u de tekenreeks voor uitsluiten kunt genereren:

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

Als alternatief kunt u hypertable_id . vinden en sluit gegevens uit van alle chunk-tabellen die zijn voorafgegaan door de hypertable-id. Zoek hypertable_id uit catalogustabel _timescaledb_catalog.hypertable :

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

Laten we zeggen dat de id 2 is. Dump vervolgens de database volgens de instructies :

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



  1. hoe serveroutput in te stellen op het gebruik van een jdbc-verbinding in Jmeter

  2. Hoe verwijder ik elk record na de n-de rij in mysql?

  3. Hoe kan ik een index maken op de substring van een kolom?

  4. niet hoofdlettergevoelige zoekopdracht in mysql