pg_dump
vypíše každou podřízenou tabulku samostatně a nezávisle na jejich rodičích, takže když vyloučíte hypertabulku, její tabulky bloků budou stále vypisovány. Tak vidíte, že všechny tabulky bloků jsou stále vypisovány.
Všimněte si, že vyloučení hypertabulek a bloků nebude fungovat pro správné obnovení výpisu do instance TimescaleDB, protože metadata TimescaleDB nebudou odpovídat skutečnému stavu databáze. TimescaleDB udržuje katalogové tabulky s informacemi o hypertabulkách a blocích a jsou to jen další uživatelské tabulky pro pg_dump
, takže je vypíše (což je důležité), ale když budou obnoveny, budou obsahovat všechny hypertabulky a bloky, které byly v databázi před výpisem.
Musíte tedy vyloučit data z tabulek, které chcete vyloučit (nikoli samotné hypertabulky nebo bloky), což zkrátí dobu výpisu a obnovení. Poté bude nutné po obnovení zahodit vyloučené hypertabulky. Data tabulky vyloučíte pomocí pg_dump
parametr --exclude-table-data
. V úložišti TimescaleDB GitHub došlo k problému, který pojednává o tom, jak vyloučit hypertabulková data z výpisu . Problém navrhuje, jak vygenerovat řetězec vyloučení:
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> ;
Případně můžete najít hypertable_id
a vyloučit data ze všech tabulek bloků s předponou hypertable id. Najděte hypertable_id
z katalogové tabulky _timescaledb_catalog.hypertable
:
SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';
Řekněme, že id je 2. Poté vypište databázi podle pokynů :
pg_dump -U user -Fc -f TestDB_Backup.bak \
--exclude-table-data='_timescaledb_internal._hyper_2*' TestDB