sql >> Database teknologi >  >> RDS >> PostgreSQL

pg_dump med --exclude-table inkluderer stadig disse tabeller i baggrunden COPY kommandoer den kører?

pg_dump dumper hvert underordnet bord separat og uafhængigt af deres forældre, så når du ekskluderer en hypertabel, vil dens chunk-tabeller stadig blive dumpet. Således observerer du, at alle chunk-tabeller stadig er dumpet.

Bemærk, at ekskludering af hypertabeller og chunks ikke vil fungere for at gendanne dumpet korrekt i en TimescaleDB-instans, da TimescaleDB-metadata ikke vil matche databasens faktiske tilstand. TimescaleDB vedligeholder katalogtabeller med information om hypertabeller og chunks, og de er blot endnu en brugertabeller til pg_dump , så det vil dumpe dem (hvilket er vigtigt), men når de er gendannet, vil de indeholde alle hypertabeller og chunks, som var i databasen før dumpet.

Så du skal udelukke data fra de tabeller, du vil ekskludere (ikke hypertabeller eller chunks selv), hvilket vil reducere dump- og gendannelsestiden. Så vil det være nødvendigt at droppe de udelukkede hypertabeller efter gendannelsen. Du ekskluderer tabeldata med pg_dump parameter --exclude-table-data . Der er et problem i TimescaleDB GitHub repo, som diskuterer, hvordan man udelukker hypertabeldata fra et dump a> . Problemet foreslår, hvordan man genererer ekskluderingsstrengen:

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 finde hypertable_id og ekskluder data fra alle chunk-tabeller med hypertabel-id'et som præfiks. Find hypertable_id fra katalogtabel _timescaledb_catalog.hypertable :

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

Lad os sige, at id'et er 2. Dump derefter databasen ifølge instruktionerne :

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



  1. EF Code First Mysql til SQL Server

  2. MySQL - BETWEEN operator med FLOAT(10,6) fungerer som> og <, i stedet for>=og <=

  3. Sådan laver du nemt CRUD ved hjælp af PHP og MySQL

  4. Hvordan opdaterer man valgte rækker med værdier fra en CSV-fil i Postgres?