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

Rails 4.2升级至5.2后执行迁移报ActiveRecord::ConcurrentMigrationError

解决Rails 4.2升级到5.2后迁移报ActiveRecord::ConcurrentMigrationError的问题

我之前升级Rails版本时也碰到过一模一样的问题!尤其是用mysql2适配器的时候,不管是旧数据库还是全新空白库,跑迁移就报这个并发错误,折腾了好一阵才搞定。下面是我亲测有效的解决方案:

先搞懂为什么会报错

Rails 5.x开始引入了迁移锁机制,新增了ar_internal_metadata系统表来记录迁移状态、环境信息和迁移锁,防止多个进程同时跑迁移。而从4.2直接升级到5.2时,这个表可能没被正确创建,或者之前的异常迁移留下了未释放的锁,导致系统误以为有其他迁移在运行。

具体解决步骤

1. 检查并修复ar_internal_metadata表

首先登录你的mysql数据库,执行以下命令:

SELECT * FROM ar_internal_metadata;
  • 如果提示表不存在,手动创建它:
    CREATE TABLE ar_internal_metadata (
      key VARCHAR(255) NOT NULL PRIMARY KEY,
      value VARCHAR(255),
      created_at DATETIME NOT NULL,
      updated_at DATETIME NOT NULL
    );
    
  • 然后插入环境标识记录(根据你的环境替换development):
    INSERT INTO ar_internal_metadata (key, value, created_at, updated_at) VALUES ('environment', 'development', NOW(), NOW());
    

2. 释放迁移锁

如果表已经存在,但还是报错,大概率是有未释放的迁移锁。可以直接用Rails自带的命令解锁:

rails db:migrate:unlock

或者手动在数据库里删除锁记录:

DELETE FROM ar_internal_metadata WHERE key = 'migration_lock';

3. 检查数据库连接配置

Rails 5.2对mysql2的配置要求更严格,确保config/database.yml里的编码设置正确,推荐用utf8mb4:

development:
  adapter: mysql2
  database: your_app_development
  username: root
  password:
  host: localhost
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci

字符集不兼容也可能导致系统表创建异常,进而触发迁移锁错误。

4. 开发环境终极方案:重置数据库

如果上面的步骤都没用,而且开发环境的数据不重要,直接重置数据库从头来:

rails db:drop db:create db:migrate

这样能确保Rails 5.2初始化所有必要的系统表,避免升级带来的遗留问题。

生产环境注意事项

如果是生产环境,绝对不要随便drop数据库!一定要先备份数据,然后手动检查ar_internal_metadata表的状态,先尝试解锁迁移,再逐步排查。如果需要创建表,也要确保在低峰期操作,避免影响业务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:27