Добавить таблицу в публикацию и обновить подписку (REFRESH PUBLICATION)
PostgreSQLЛогическая репликацияКоманда
-- 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;Что делает
Добавляет новую таблицу в публикацию на издателе; на подписчике REFRESH PUBLICATION включает новые таблицы в подписку и запускает начальное копирование (tablesync) с copy_data = true. srsubstate: i = init, d = копирование данных, f = копирование завершено, s = синхронизировано, r = ready.
Когда использовать
Когда в работающую логическую репликацию добавляется новая таблица или таблица удаляется из публикации.
Внимание
Даже с публикациями FOR ALL TABLES или TABLES IN SCHEMA подписчик не подхватывает новую таблицу, пока не выполнен REFRESH. REFRESH завершается ошибкой, если таблицы нет на подписчике; DDL не реплицируется. Если у опубликованной таблицы нет PRIMARY KEY или REPLICA IDENTITY, UPDATE/DELETE на издателе завершаются ошибкой. Начальное копирование большой таблицы надолго удерживает слот и снимок на издателе.
Связанные материалы
- Мониторинг логической репликации (pg_stat_subscription, ошибки apply, отставание слота)
- Разрешить конфликт логической репликации (disable_on_error, SKIP)
- Синхронизировать значения последовательностей на подписчике при логической репликации
- Удалить подписку и очистить осиротевший логический слот на издателе