迁移Postgres的Sequence(序列)

2021-05-19 11:42:13 浏览数 (1)

序列(Sequence)的当前值(Currval)无法通过pg_dump导出,又不能对源实例做修改,得这么办才行。


在结构导出时,序列(Sequence)的当前值无法通过pg_dump导出,只能通过事后查询该序列的当前值并写入目标库。

查询序列的当前值,有两种办法:

  1. select currval('seqname') 仅获得当前会话最后一次生成的值。实际执行中,必须先执行nextval后才能执行currval,这样会修改源数据库,不可取
  2. select last_value from seqname 获得所有会话中最后一次生成的值

修改目标库序列的当前值,也有两种办法:

  1. select setval('seqname', val) 修改序列当前值(原子操作
  2. alter sequence seqname restart with val 修改序列当前值(阻塞性事务,会阻塞其他会话的nextval操作)

建议采用的方案

既可以干净地获取源值,又能低成本地设置到目标。

  1. select last_value from seqname 获得源库当前值
  2. select setval('seqname', val) 在目标库设置目标值

0 人点赞