macOSでMySQLを5.7から8.0にバージョンアップする(Homebrew使用)
2018-09-22
先日Macにて、brew upgrade
したところ、ローカルのMySQLが5.7から8.0にバージョンアップされました。
バージョンアップしてくれたのはいいものの、そのままでは正常に動作しなかったため、バージョンアップ後にやるべき作業をまとめておきます。
事前注意
アップグレード作業の前に、現在の設定ファイルやテーブル等のデータはバックアップしておくことをお勧めします。
万一トラブルが起きた場合にデータが破損する可能性があります。
MySQL8.0バージョンアップ後に起動しない場合
バージョンアップ後にmysql.server start
したところ、以下のようになる場合があります。
$ sudo mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*.pid).
/usr/local/var/mysql/*.err
へエラーの詳細が記載されますので、それを確認します。
原因1: MySQL5.7のクラッシュ終了
以下と同様のエラーログが出ていた場合の対処法となります。
$ sudo cat /usr/local/var/mysql/*.err | grep ERROR | tail
yyyy-MM-ddTHH:mm:ss.ffffffZ 1 [ERROR] [MY-012526] [InnoDB] InnoDB: Upgrade after a crash is not supported. This redo log was created with MySQL 5.7.21. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html
yyyy-MM-ddTHH:mm:ss.ffffffZ 1 [ERROR] [MY-012930] [InnoDB] InnoDB: Plugin initialization aborted with error Generic error.
yyyy-MM-ddTHH:mm:ss.ffffffZ 1 [ERROR] [MY-011013] [Server] Failed to initialize DD Storage Engine.
yyyy-MM-ddTHH:mm:ss.ffffffZ 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
yyyy-MM-ddTHH:mm:ss.ffffffZ 0 [ERROR] [MY-010119] [Server] Aborting
クラッシュした後のアップグレードはサポートしていないという旨のエラーです。
前回、MySQL5.7でクラッシュして終了したまま、アップグレードしてしまったということです。
なので、もう一度MySQL5.7を起動し、正常終了させればOKです。
brew install mysql@5.7
MySQL5.7をバージョン指定でインストールし直します。
/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop
インストールしたバージョンのMySQLを起動・停止します。
$ sudo mysql.server start
Starting MySQL
... SUCCESS!
起動成功すれば対処完了です。
原因2: MySQL5.7の設定が残っている
以下と同様のエラーログが出ていた場合の対処法となります。
$ sudo cat /usr/local/var/mysql/*.err | grep ERROR | tail
yyyy-MM-ddTHH:mm:ss.ffffffZ 0 [ERROR] [MY-011071] [Server] unknown variable 'innodb_large_prefix=ON'
yyyy-MM-ddTHH:mm:ss.ffffffZ 0 [ERROR] [MY-010119] [Server] Aborting
MySQL8.0に存在しない設定が設定ファイルに記述されているのが原因です。
MySQL8.0では、多くの設定値が削除されています。その設定値の一覧はこちらに記載されています。それらのMySQL8.0で定義されていない設定値を削除しましょう。
macOSでは通常、以下の場所にMySQLの設定ファイルがあります。上のファイルから順に読み込まれます。
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
これらのファイルを確認し、ログに記載されている設定値や削除された設定値が記述されていないかを確認します。記述されていた場合、それを削除します。
$ sudo mysql.server start
Starting MySQL
... SUCCESS!
起動成功すれば対処完了です。
テーブルをアップグレードする
MySQL8.0へのアップグレードに合わせ、既に存在するシステムテーブルのデータもそのバージョンで動くようにアップグレードする必要があります。
まず、MySQLを起動します。
$ sudo mysql.server start
Starting MySQL
.. SUCCESS!
以下のコマンドを実行します。
$ sudo mysql_upgrade -u root -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
mysql.columns_priv OK
mysql.component OK
mysql.db OK
mysql.default_roles OK
mysql.engine_cost OK
mysql.func OK
mysql.general_log OK
mysql.global_grants OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.password_history OK
mysql.plugin OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.role_edges OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
Upgrading the sys schema.
Checking databases.
sample_database.sample_table1 OK
sample_database.sample_table2 OK
sample_database.sample_table3 OK
sys.sys_config OK
Upgrade process completed successfully.
Checking if update is needed.
Upgrade process completed successfully.
と表示されれば正常終了です。
mysql_upgrade
は全てのデータベースの全てのテーブルに対して、MySQLサーバーの現在のバージョンとの非互換性を調べ、追加された可能性のある新しい権限または機能を利用できるようにシステムテーブルをアップグレードします。
作業は以上です。
まとめ
何気なくbrew upgrade
しただけだったのですが、このように色々作業が求められることがあります。
brew upgrade
はできるだけ時間に余裕があるときに実行しようと思いました。