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コマンドを生成して直接適用する。

使用する場面

論理レプリケーションによるアップグレード/移行の切り替え時、アプリケーションをサブスクライバに向ける直前に。

注意

パブリッシャがまだ書き込みを受け付けている間に実行すると、値は直ちに古くなり、切り替え後に重複キーエラーが発生する。書き込みを停止してから実行するか、安全マージンを加える。DDLもレプリケートされない: スキーマ変更(ALTER TABLE、新しいインデックス)は両側に個別に、サブスクライバから先に適用する。pg_sequencesは読み取り権限のないシーケンスのlast_valueにNULLを返すため、所有者またはスーパーユーザーとしてコマンドを実行する。

DBAtlas で開く →

関連項目