使用AWS DMS迁移后PostgreSQL主键序列丢失

时间:2019-04-11 12:54:57

标签: postgresql amazon-rds

我最近使用AWS Migration Service将自托管的Postgres数据库迁移到AWS RDS。
Postgres版本:10.6

我注意到我所有的主键都不再设置为“序列”,并且当我尝试手动添加序列时,它从1开始而不是继续进行已设置的计数。

我在数据库中使用Rails,因此我的SQL技能很低。我通常可以找到解决插入和更新问题的方法,但这不是我有很多经验的领域。

我的问题分为两部分:

  1. 如何修复单个表?在继续之前,我想了解并测试我在做什么。
  2. 有没有一种方法可以将此修复程序应用于我拥有的每个表,而无需手动修改每个表?

2 个答案:

答案 0 :(得分:1)

除非您错过了什么,并且迁移可以再次进行处理(使用不同的参数?我从未使用过AWS Migration Service,但我认为它应该保留列的serial-iness ...),您会我也需要重新创建序列。


大约一年前,我遇到过类似情况,并写了this answer on SO

这是要点:

CREATE SEQUENCE foo_a_seq OWNED BY foo.a;
SELECT setval('foo_a_seq', coalesce(max(a), 0)) FROM foo;
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); 

这将创建一个序列foo_a_seq,其nextvalmax中的foo.a值高一个(如果没有{ {1}}条记录。

我还继续设置了1以便快速应用于所有需要的表/列:

foo

像这样使用它:

Function

答案 1 :(得分:1)

@a_horse_with_no_name指示我正确的方向并与AWS聊天后,至少在使用AWS Database Migration Service(DMS)的情况下,我可以回答自己的问题。

问题是,DMS仅关注数据本身,而不关注模式(在我看来,这是主要的疏忽,特别是如果您使用相同的数据库技术,但这是另一个问题)。 因此,架构本身不会迁移。该文档并没有真正弄清楚这一点。

要解决此问题:

  1. 停止(如果仍然存在)现有的AWS DMS迁移
  2. 删除现有的已迁移数据库,并创建一个新的空模式以供使用
  3. 按照https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Installing.html此处的步骤安装和设置Amazon Schema Conversation Tool(SCT)
  4. 一旦您连接到两个数据库,请按照此处的步骤https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Converting.html“转换”您的架构(我对此数据库执行了整个“公共”架构,以确保覆盖所有内容
  5. 创建或修改您的AWS DMS迁移,确保目标表准备模式=“ TRUNCATE”并在目标数据库上禁用外键。如果要进行修改,请确保在询问您“重新启动”时是否恢复

我尚未测试的是如何处理我正在迁移实时数据库的事实。因此,完成迁移后,序列在目标数据库上可能已过期。我相信我稍后可以进入SCT并仅迁移序列,但我尚未对此进行测试。