sql >> Databasteknik >  >> RDS >> PostgreSQL

pg_dump med --exclude-table innehåller fortfarande dessa tabeller i bakgrunden COPY-kommandon som den kör?

pg_dump dumpar varje underordnad tabell separat och oberoende av sina föräldrar, så när du utesluter en hypertabell kommer dess deltabeller fortfarande att dumpas. Du ser alltså att alla chunk-tabeller fortfarande är dumpade.

Observera att exkludering av hypertabeller och bitar inte fungerar för att återställa dumpen korrekt till en TimescaleDB-instans, eftersom TimescaleDB-metadata inte kommer att matcha databasens faktiska tillstånd. TimescaleDB underhåller katalogtabeller med information om hypertabeller och bitar och de är bara ytterligare en användartabell för pg_dump , så det kommer att dumpa dem (vilket är viktigt), men när de återställs kommer de att innehålla alla hypertabeller och bitar som fanns i databasen före dumpningen.

Så du måste utesluta data från tabellerna du vill exkludera (inte hypertabeller eller bitar själva), vilket kommer att minska dumpnings- och återställningstiden. Då kommer det att bli nödvändigt att släppa de exkluderade hypertabellerna efter återställningen. Du utesluter tabelldata med pg_dump parameter --exclude-table-data . Det finns ett problem i TimescaleDB GitHub-repo, som diskuterar hur man utesluter hypertabelldata från en dump a> . Problemet föreslår hur man genererar exclude-strängen:

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

Alternativt kan du hitta hypertable_id och exkludera data från alla deltabeller med prefixet hypertabell-id. Hitta hypertable_id från katalogtabellen _timescaledb_catalog.hypertable :

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

Låt oss säga att id är 2. Dumpa sedan databasen enligt instruktionerna :

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



  1. (var)char som kolumnstyp för prestanda?

  2. Hitta den längsta raden av perfekta poäng per spelare

  3. CodeIgniter Bildfil kan inte laddas upp

  4. Få alla procedurmässiga, användardefinierade funktioner