DuplicateColumn 和 multisite:migrate 失败

从 2.9.0.beta2 升级到 2.9.0.beta4 失败,错误消息为 PG::DuplicateColumn: ERROR: column "bookmarkable_id" of relation "bookmarks" already existsRecovering from failed/partially applied upgrade 中的建议帮助我恢复了在线状态。我开了一个新话题,因为这个问题似乎专门针对(dockerized)多站点安装。

问题似乎是 multisite:migrate 试图再次运行之前迁移中已经运行过的同一个迁移。结果是 PG::DuplicateColumn: ERROR: column "bookmarkable_id" of relation "bookmarks" already exists。根据错误消息,这可能与多态书签功能有关,https://github.com/discourse/discourse/pull/16261 (ping @martin?)。

在遇到问题后,我的临时解决方案是:

  1. 在配置文件 containers/web_only.yml 中注释掉行 - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate
  2. 手动删除与书签相关的(部分应用的?)迁移:./launcher enter data 并使用 psql 登录到我的两个 Discourse 数据库并运行 ALTER TABLE bookmarks DROP COLUMN bookmarkable_id, DROP COLUMN bookmarkable_type;
  3. 重新运行重建:./launcher rebuild web_only 2>&1

现在 multisite:migrate 没有执行,我可能错过了什么?我很想听听大家的想法。不过,两个站点似乎都能正常工作。:crossed_fingers:

1 个赞

那么我认为我会做的就是再进行一次升级,然后就万事大吉了。

您对此有何看法?或者有什么关于运行多站点迁移的建议吗?您知道,我有点害怕运行我不理解的脚本。:slightly_smiling_face:

因为你至少有点知道如何修复它,而且下次升级时你就会完全忘记(如果你和我一样的话)。我很确定它会起作用,因为我认为其他人修复此问题时也看到了这一点。

1 个赞

说得通,看起来你从未运行过 post-migrate 来删除最初存在的列,我在 https://github.com/discourse/discourse/pull/16261 中删除了它们。我可能只需要在这里 discourse/db/migrate/20220322024216_add_bookmark_polymorphic_columns.rb at 037172beaae0743176eee653bd2cd4cd1ce5c7e9 · discourse/discourse · GitHub 重新添加它们之前检查一下这些列是否存在,我会为此提交一个 commit。

刚刚合并了一个应该有帮助的提交:

4 个赞