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
相关产品推荐
相关产品推荐

