You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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备份恢复序列数据

  1. 在源库导出所有序列的当前值数据:
pg_dump -h 源库IP -U 用户名 -d 目标库名 --data-only -t '*.sequence' -f sequence_data.sql
  1. 将导出的sequence_data.sql文件传到目标库所在机器,执行恢复:
psql -h 目标库IP -U 用户名 -d 目标库名 -f sequence_data.sql

额外提示

如果后续需要长期避免序列同步问题,可以在源库为独立序列创建触发器,当序列被NEXTVAL调用时同步更新目标库的对应序列,但这种方式需要维护触发器逻辑,适合频繁使用独立序列的场景。一般迁移完成后一次性修复即可满足需求。

内容的提问来源于stack exchange,提问作者VKL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:38:17