綺麗に死ぬITエンジニア

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はできるだけ時間に余裕があるときに実行しようと思いました。

筆者について

「もりやませーた」として活動している、フリーランスエンジニアです。1992年生まれ、神奈川県在住、既婚。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

SQL Apple