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