PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

pg_dump com --exclude-table ainda inclui essas tabelas nos comandos COPY em segundo plano que ele executa?


pg_dump despeja cada tabela filha separadamente e independentemente de seus pais, portanto, quando você exclui uma hipertabela, suas tabelas de pedaços ainda serão despejadas. Assim, você observa que todas as tabelas de pedaços ainda são despejadas.

Observe que a exclusão de hipertabelas e fragmentos não funcionará para restaurar o despejo corretamente em uma instância do TimescaleDB, pois os metadados do TimescaleDB não corresponderão ao estado real do banco de dados. TimescaleDB mantém tabelas de catálogo com informações sobre hypertables e chunks e são apenas mais tabelas de usuário para pg_dump , então ele irá despejá-los (o que é importante), mas quando eles forem restaurados, eles conterão todas as hipertabelas e pedaços, que estavam no banco de dados antes do despejo.

Portanto, você precisa excluir os dados das tabelas que deseja excluir (não as hipertabelas ou os próprios pedaços), o que reduzirá o tempo de despejo e restauração. Em seguida, será necessário descartar as hipertabelas excluídas após a restauração. Você exclui dados de tabela com pg_dump parâmetro --exclude-table-data . Há um problema no repositório do GitHub do TimescaleDB, que discute como excluir dados de hipertabela de um dump . O problema sugere como gerar a string de exclusão:
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> ;

Como alternativa, você pode encontrar hypertable_id e exclua dados de todas as tabelas de fragmentos prefixadas com o ID da hipertabela. Encontre hypertable_id da tabela de catálogo _timescaledb_catalog.hypertable :
SELECT id
FROM _timescaledb_catalog.hypertable
WHERE schema_name = 'mySchema' AND table_name = 'hyper1';

Digamos que o id seja 2. Em seguida, despeje o banco de dados de acordo com as instruções :
pg_dump -U user -Fc -f TestDB_Backup.bak \
  --exclude-table-data='_timescaledb_internal._hyper_2*' TestDB