MySQLアップデート後にデータベース起動できなくなったので、対処してみる
バージョン
- MySQL: 5.7→8.0へバージョンアップ
- Rails: 3.1
発生した問題
以下エラーにより、local開発環境でRailsを使ってMySQLに対してマイグレーションができなくなった。
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
よくあるマイグレーションエラー時の対処法として以下が紹介されるが、実行しても同じエラーが発生する。
% touch /tmp/mysql.sock
% brew services restart mysql@8.0
以下より、そもそもMySQLを起動できてなさそう。
% brew services list
Name Status User File
mysql@8.0 stopped s_u ~/Library/LaunchAgents/homebrew.mxcl.mysql@8.0.plist
ゴールは、「MySQLを起動して、RailsでMySQLに対してマイグレーションできるようにする」こと。
調査
上記のサイトがかなり参考になる!
5.7系時代のredoログを残したまま8系にアップグレードしたことが原因であるようです。
redoログファイルを削除し、MySQLを再起動してみます。
エラーログを確認してみる。<MYPC_NUMBER>の箇所は使用しているPCごとに異なる。
% cat /opt/homebrew/var/mysql/<MYPC_NUMBER>.err
すると以下が表示される。参考のサイトとほぼ同じエラーメッセージが出てることが分かる。
2024-12-09T16:51:59.202349Z 1 [ERROR] [MY-012526] [InnoDB] Upgrade is not supported after a crash or shutdown with innodb_fast_shutdown = 2. This redo log was created with MySQL 5.7.43, and it appears logically non empty. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html
解決法
redoログファイル(ib_logfile0・ib_logfile1)が存在することを確認する。
% ls -l /opt/homebrew/var/mysql/
total 799872
-rw-r----- 1 s_u admin 196608 12 9 12:31 #ib_16384_0.dblwr
-rw-r----- 1 s_u admin 8585216 12 6 00:52 #ib_16384_1.dblwr
drwxr-x--- 34 s_u admin 1088 12 9 12:33 #innodb_redo
drwxr-x--- 2 s_u admin 64 12 9 12:33 #innodb_temp
-rw-r----- 1 s_u admin 42722 12 4 01:50 MYPC-slow.log
-rw-r----- 1 s_u admin 39601015 12 10 01:55 MYPC.err
-rw-r----- 1 s_u admin 56 10 7 2022 auto.cnf
-rw-r----- 1 s_u admin 180 12 4 01:50 binlog.000001
-rw-r----- 1 s_u admin 11970727 12 9 12:33 binlog.000002
-rw-r----- 1 s_u admin 32 12 4 01:50 binlog.index
-rw------- 1 s_u admin 1676 10 7 2022 ca-key.pem
-rw-r--r-- 1 s_u admin 1112 10 7 2022 ca.pem
-rw-r--r-- 1 s_u admin 1112 10 7 2022 client-cert.pem
-rw------- 1 s_u admin 1676 10 7 2022 client-key.pem
drwxr-x--- 645 s_u admin 20640 12 6 00:52 coinbook_development
drwxr-x--- 645 s_u admin 20640 12 6 00:52 coinbook_test
-rw-r----- 1 s_u admin 22718 12 9 12:33 ib_buffer_pool
-rw-r----- 1 s_u admin 50331648 12 9 12:35 ib_logfile0
-rw-r----- 1 s_u admin 50331648 12 9 12:35 ib_logfile1
-rw-r----- 1 s_u admin 146800640 12 9 12:33 ibdata1
drwxr-x--- 8 s_u admin 256 12 4 01:49 mysql
-rw-r----- 1 s_u admin 50331648 12 6 01:52 mysql.ibd
-rw-r----- 1 s_u admin 6 12 4 01:49 mysql_upgrade_info
drwxr-x--- 112 s_u admin 3584 12 4 01:49 performance_schema
-rw------- 1 s_u admin 1680 10 7 2022 private_key.pem
-rw-r--r-- 1 s_u admin 452 10 7 2022 public_key.pem
-rw-r--r-- 1 s_u admin 1112 10 7 2022 server-cert.pem
-rw------- 1 s_u admin 1680 10 7 2022 server-key.pem
drwxr-x--- 3 s_u admin 96 12 4 01:49 sys
-rw-r----- 1 s_u admin 16777216 12 6 01:52 undo_001
-rw-r----- 1 s_u admin 33554432 12 6 01:52 undo_002
redoログファイルを削除する。
% rm /opt/homebrew/var/mysql/ib_logfile0
% rm /opt/homebrew/var/mysql/ib_logfile1
MySQLをstop→startで再起動する。
% brew services stop mysql@8.0
Stopping `mysql@8.0`... (might take a while)
==> Successfully stopped `mysql@8.0` (label: homebrew.mxcl.mysql@8.0)
% brew services start mysql@8.0
==> Successfully started `mysql@8.0` (label: homebrew.mxcl.mysql@8.0)
MySQLを起動できた!
% brew services list
Name Status User File
mysql@8.0 started s_u ~/Library/LaunchAgents/homebrew.mxcl.mysql@8.0.plist
これで無事マイグレーションもできるようになる!🎉
Discussion