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

pg_dump con --exclude-table include ancora quelle tabelle nei comandi COPY in background che esegue?

pg_dump scarica ogni tabella figlio separatamente e indipendentemente dai suoi genitori, quindi quando escludi un'ipertabella, le sue tabelle chunk verranno comunque scaricate. Quindi osservi che tutte le tabelle dei blocchi vengono ancora scaricate.

Tieni presente che l'esclusione di hypertable e blocchi non funzionerà per ripristinare correttamente il dump in un'istanza di TimescaleDB, poiché i metadati di TimescaleDB non corrisponderanno allo stato effettivo del database. TimescaleDB mantiene le tabelle del catalogo con informazioni su hypertable e blocchi e sono solo altre tabelle utente per pg_dump , quindi li scaricherà (che è importante), ma quando verranno ripristinati conterranno tutti gli hypertable e i blocchi, che erano nel database prima del dump.

Quindi è necessario escludere i dati dalle tabelle che si desidera escludere (non hypertable o blocchi stessi), il che ridurrà il tempo di dump e ripristino. Quindi sarà necessario eliminare le hypertable escluse dopo il ripristino. Escludi i dati della tabella con pg_dump parametro --exclude-table-data . Si è verificato un problema nel repository GitHub di TimescaleDB, che discute come escludere i dati hypertable da un dump . Il problema suggerisce come generare la stringa di esclusione:

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

In alternativa, puoi trovare hypertable_id ed escludere i dati da tutte le tabelle dei blocchi precedute dall'id dell'ipertabella. Trova hypertable_id dalla tabella del catalogo _timescaledb_catalog.hypertable :

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

Diciamo che l'id è 2. Quindi scarica il database secondo le istruzioni :

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