从PostgreSQL 11逻辑复制迁移至15后,如何修复所有序列?
修复PostgreSQL逻辑复制后未被列拥有的序列
方法一:生成全量SETVAL脚本(推荐)
在源数据库执行以下SQL,它会生成所有未被列拥有的序列的SETVAL命令:
SELECT format( 'SELECT SETVAL(''%I.%I'', %L, %s);', n.nspname, c.relname, s.seq_last_value, s.seq_is_called ) FROM pg_sequence s JOIN pg_class c ON s.seqrelid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE NOT EXISTS ( SELECT 1 FROM pg_depend d WHERE d.objid = c.oid AND d.deptype = 'a' );
把查询结果复制到目标数据库执行,就能同步这些独立序列的当前值。如果需要一次性修复所有序列(包括已关联列的),直接去掉WHERE NOT EXISTS部分即可。
方法二:用pg_dump备份恢复序列数据
- 在源库导出所有序列的当前值数据:
pg_dump -h 源库IP -U 用户名 -d 目标库名 --data-only -t '*.sequence' -f sequence_data.sql
- 将导出的
sequence_data.sql文件传到目标库所在机器,执行恢复:
psql -h 目标库IP -U 用户名 -d 目标库名 -f sequence_data.sql
额外提示
如果后续需要长期避免序列同步问题,可以在源库为独立序列创建触发器,当序列被NEXTVAL调用时同步更新目标库的对应序列,但这种方式需要维护触发器逻辑,适合频繁使用独立序列的场景。一般迁移完成后一次性修复即可满足需求。
内容的提问来源于stack exchange,提问作者VKL
相关产品推荐
相关产品推荐

