PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

pg_dump avec --exclude-table inclut toujours ces tables dans les commandes COPY d'arrière-plan qu'il exécute ?

pg_dump vide chaque table enfant séparément et indépendamment de ses parents, ainsi, lorsque vous excluez une hypertable, ses tables de blocs seront toujours vidé. Ainsi, vous observez que toutes les tables de blocs sont toujours vidé.

Notez que l'exclusion des hypertables et des blocs ne fonctionnera pas pour restaurer correctement le vidage dans une instance TimescaleDB, car les métadonnées TimescaleDB ne correspondront pas à l'état réel de la base de données. TimescaleDB maintient des tables de catalogue avec des informations sur les hypertables et les morceaux et ce ne sont que des tables utilisateur supplémentaires pour pg_dump , il les videra donc (ce qui est important), mais lorsqu'ils seront restaurés, ils contiendront toutes les hypertables et tous les morceaux qui se trouvaient dans la base de données avant le vidage.

Vous devez donc exclure les données des tables que vous souhaitez exclure (pas les hypertables ou les blocs eux-mêmes), ce qui réduira le temps de vidage et de restauration. Il faudra ensuite déposer les hypertables exclues après la restauration. Vous excluez les données de la table avec pg_dump paramètre --exclude-table-data . Il y a un problème dans le référentiel TimescaleDB GitHub, qui explique comment exclure les données hypertables d'un vidage . Le problème suggère comment générer la chaîne d'exclusion :

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

Alternativement, vous pouvez trouver hypertable_id et exclure les données de toutes les tables de blocs préfixées par l'identifiant de l'hypertable. Trouver hypertable_id à partir de la table de catalogue _timescaledb_catalog.hypertable :

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

Disons que l'identifiant est 2. Videz ensuite la base de données en suivant les instructions :

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