sql >> Base de Datos >  >> RDS >> PostgreSQL

pg_dump con --exclude-table aún incluye esas tablas en segundo plano ¿Comandos COPY que ejecuta?

pg_dump volca cada tabla secundaria por separado e independientemente de sus padres, por lo tanto, cuando excluye una hipertabla, sus tablas de fragmentos aún se volcarán. Por lo tanto, observa que todas las tablas de fragmentos todavía están volcadas.

Tenga en cuenta que la exclusión de hipertablas y fragmentos no funcionará para restaurar el volcado correctamente en una instancia de TimescaleDB, ya que los metadatos de TimescaleDB no coincidirán con el estado real de la base de datos. TimescaleDB mantiene tablas de catálogo con información sobre hipertablas y fragmentos y son solo otras tablas de usuario para pg_dump , por lo que los volcará (lo cual es importante), pero cuando se restauren contendrán todas las hipertablas y fragmentos que estaban en la base de datos antes del volcado.

Por lo tanto, debe excluir los datos de las tablas que desea excluir (no las hipertablas o los fragmentos en sí mismos), lo que reducirá el tiempo de volcado y restauración. Entonces será necesario eliminar las hipertablas excluidas después de la restauración. Excluye los datos de la tabla con pg_dump parámetro --exclude-table-data . Hay un problema en el repositorio GitHub de TimescaleDB, que discute cómo excluir datos hipertables de un volcado . El problema sugiere cómo generar la cadena de exclusión:

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

Alternativamente, puede encontrar hypertable_id y excluya los datos de todas las tablas de fragmentos que tengan como prefijo el ID de hipertabla. Encuentra hypertable_id de la tabla de catálogo _timescaledb_catalog.hypertable :

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

Digamos que el id es 2. Luego descargue la base de datos según las instrucciones :

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