DBAtlas · Атлас эксплуатации баз данных

Синхронизировать значения последовательностей на подписчике при логической репликации

PostgreSQLЛогическая репликация

Команда

# Generate the setval script on the publisher and apply it on the subscriber (at cutover, after writes are stopped):
psql -h <publisher_host> -d <db> -XAtc "SELECT format('SELECT setval(%L, %s, %s);', quote_ident(schemaname) || '.' || quote_ident(sequencename), COALESCE(last_value, start_value), (last_value IS NOT NULL)::text) FROM pg_sequences;" | psql -h <subscriber_host> -d <db> -X

Что делает

Поскольку логическая репликация не переносит значения последовательностей (включая identity), скрипт читает последнее значение каждой последовательности на издателе, генерирует и сразу применяет команды setval, устанавливающие то же значение на подписчике.

Когда использовать

При переключении в ходе обновления/миграции через логическую репликацию, непосредственно перед перенаправлением приложения на подписчика.

Внимание

Если запустить, пока издатель ещё принимает запись, значения сразу устаревают, и после переключения возникают ошибки duplicate key; запускайте после остановки записи или добавьте запас. DDL тоже не реплицируется: применяйте изменения схемы (ALTER TABLE, новые индексы) на обеих сторонах отдельно, сначала на подписчике. pg_sequences возвращает NULL в last_value для последовательностей, которые вы не можете читать; выполняйте команду от владельца или суперпользователя.

Открыть в DBAtlas →

Связанные материалы