Ajouter une table à une publication et rafraîchir la souscription (REFRESH PUBLICATION)
PostgreSQLRéplication logiqueCommande
-- Publisher:
ALTER PUBLICATION pub_app ADD TABLE orders;
-- PG15+: all tables in a schema: ALTER PUBLICATION pub_app ADD TABLES IN SCHEMA app_schema;
SELECT pubname, schemaname, tablename FROM pg_publication_tables WHERE pubname = 'pub_app';
-- Subscriber (the table structure must already exist):
ALTER SUBSCRIPTION sub_app REFRESH PUBLICATION WITH (copy_data = true);
SELECT srrelid::regclass AS table_name, srsubstate FROM pg_subscription_rel ORDER BY 1;Ce que fait la commande
Ajoute une nouvelle table à la publication côté publisher ; côté subscriber, REFRESH PUBLICATION inclut les nouvelles tables dans la souscription et lance la copie initiale (tablesync) avec copy_data = true. srsubstate : i = init, d = copie des données, f = copie terminée, s = synchronisé, r = prêt.
Quand l'utiliser
Lorsqu'une nouvelle table est ajoutée à une réplication logique en cours, ou qu'une table est retirée de la publication.
Attention
Même avec des publications FOR ALL TABLES ou TABLES IN SCHEMA, le subscriber ne prend pas en compte une nouvelle table tant que REFRESH n'est pas exécuté. REFRESH échoue si la table n'existe pas sur le subscriber ; le DDL n'est pas répliqué. Si une table publiée n'a ni PRIMARY KEY ni REPLICA IDENTITY, les UPDATE/DELETE échouent sur le publisher. La copie initiale d'une grande table retient longtemps un slot et un snapshot sur le publisher.
Voir aussi
- Surveiller la réplication logique (pg_stat_subscription, erreurs d'apply, retard des slots)
- Résoudre un conflit de réplication logique (disable_on_error, SKIP)
- Synchroniser les valeurs des séquences vers le subscriber en réplication logique
- Supprimer une souscription et nettoyer un slot logique orphelin sur le publisher