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 中打开 →

相关内容