三周前升级到最新版本时迁移失败

1 个迁移失败!

迁移默认值失败
#<StandardError: 发生错误,所有后续迁移均已取消:

PG::UniqueViolation: 错误:重复键值违反唯一约束“index_user_emails_on_email”
详细信息:键(lower(email::text))=(talk@remobjects.com<mailto:talk@remobjects.com) 已存在。

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/postgresql/database_st


== 20211201221028 MigrateEmailToNormalizedEmail: 正在迁移====================
-- execute("UPDATE user_emails\nSET normalized_email = REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')\nWHERE (normalized_email IS NULL OR normalized_email <> (REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')))\n  AND (id >= -2 AND id < 7155)\n")
正在迁移 secondsite
Docker Manager:升级失败
#<RuntimeError: RuntimeError>

有人知道我该怎么做才能解决这个问题吗?

哦……我们在 PG 的主版本升级中遇到过这种情况。@saj 最近在这方面做了一些工作。

长话来说,在某些 PG 升级中,数据库的排序规则会发生变化,这是由于 libc 更改了某些内容。你只能重新索引。

你遇到的情况是:

  1. 你进行了一次主升级
  2. 你的索引变得有些损坏
  3. 插入了第二个用户 talk@remobjects.com——尽管索引不允许,但你现在有了一个重复的行。
  4. 我们触碰了该行,它凸显了这个问题,因为无法更新不相关的列

解决方法是:

  • 找到共享 talk@remobjects.com 电子邮件的两个用户的用户 ID。
  • 删除其中一个用户的电子邮件或重命名它
  • 按计划进行
  • 紧急对整个数据库进行重新索引以捕获其他问题

您的解决方案确实解决了问题,但“升级”已经过去(并且不再有更新);我需要执行什么特殊操作来重新运行这些迁移吗?我当然已经删除了重复的电子邮件。

是的,请务必运行数据库重新索引

尝试:

REINDEX DATABASE VERBOSE

至关重要的是,您必须这样做,以确保您的所有索引都处于良好状态。

1 个赞

有没有办法不时地检查论坛是否“健康”,以免遇到这类问题?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.