rails db
コマンドで次のエラーが出た場合の対処法を整理します。
rake aborted
ActiveRecord::ConcurrentMigrationError
Cannot run migrations because another migration process is currently running
環境
- ruby 2.4.5
- rails 5.2.2
- MySQL 5.7.17
経緯
以下コマンドの実行後、処理が固まったので Control + C
で一旦処理を中断。すると、それ以降の rails db
コマンドでエラーが出るようになってしまいました。
bundle exec rake db:migrate:reset RAILS_ENV=production
rake aborted
ActiveRecord::ConcurrentMigrationError
Cannot run migrations because another migration process is currently running
エラー内容
エラー内容は、「現在処理中のマイグレーションがある」というものです。先ほど中断したコマンドが悪さをしていそうですね。
対処法
MySQLにログインし、問題となっているマイグレーションプロセスを中断させます。
msql -h [YOUR_DB_ADDRESS] -u [YOUR_USER_NAME] -p
SHOW PROCESSLIST
コマンドで処理中のプロセスを一覧表示します。
USE [YOUR_DB_NAME];
SHOW PROCESSLIST;
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
| 93968 | YOUR_USER_NAME | xxx.xx.xx.xx:43364 | YOUR_DB_NAME | Sleep | 1639 | | NULL |
| 93972 | YOUR_USER_NAME | xxx.xx.xx.xx:43422 | YOUR_DB_NAME | Query | 1187 | Waiting for table metadata lock | ALTER TABLE `contracts` DROP COLUMN `code` |
| 93977 | YOUR_USER_NAME | xxx.xx.xx.xx:43430 | YOUR_DB_NAME | Query | 1095 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME` |
| 93979 | YOUR_USER_NAME | xxx.xx.xx.xx:43434 | YOUR_DB_NAME | Query | 1006 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME` |
| 93983 | YOUR_USER_NAME | xxx.xx.xx.xx:43482 | YOUR_DB_NAME | Query | 0 | starting | SHOW PROCESSLIST |
| 93987 | YOUR_USER_NAME | xxx.xx.xx.xx:43488 | YOUR_DB_NAME | Query | 80 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME` |
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
一番上の「Command: Sleep」になっているプロセスが怪しそうです。KILL
コマンドで問題のプロセスを強制終了させます。今回の場合は、ID: 93968
ですね。
KILL [ID];
もう一度 SHOW PROCESSLIST;
でプロセス一覧を表示し、他のプロセスが全て掃けていればOK。
これで rails db
コマンドも通ります。
bundle exec rake db:migrate RAILS_ENV=production