この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
MySQL のアップグレード時に実行が必要な mysql_upgrade
MySQL にてテスト用のユーザーを作成しようとするとエラーが発生して、MySQL に新しいユーザーが作れない問題に遭遇しました。
どうやら「mysql_upgrade」コマンドを実行してくださいとのエラーメッセージだったので
Linuxにて「MySQL5.5」から「MySQL5.7」にバージョンアップする
https://www.t3a.jp/blog/infrastructure/mysql55-versionup/
上記の記事で、MySQL5.5 から MySQL5.7 にバージョンアップしたデータベースであることを思い出しました。そこで「mysql_upgrade」を実行時の注意点とメモ代わりに作業履歴を残します。
MySQLのバージョンアップ後のエラー
実際にエラーが発生したコマンドとエラーを見てみます。
コマンドの実行サンプル
1 2 |
mysql> CREATE USER 'hogehoge'@'%' IDENTIFIED BY 'j3yEQeK7v5nZ1F9D'; ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created with MySQL 50546, now running 50724. Please use mysql_upgrade to fix this error. |
エラーの通り、「mysql_upgrade」実行してください!とのことなので、「mysql_upgrade」コマンドは何かを公式ページで確認してみます。
mysql_upgrade はすべてのデータベースのすべてのテーブルに対して、MySQL サーバーの現在のバージョンとの非互換性を調べます。また、mysql_upgrade は、システムテーブルをアップグレードして、追加された可能性のある新しい権限または機能を利用できるようにします。
mysql_upgrade は、テーブルに非互換性がある可能性が見つかった場合はテーブルのチェックを実行し、問題が検出された場合はテーブルの修復を試みます。テーブルを修復できない場合は、手動でテーブルを修復する方法について、セクション2.11.4「テーブルまたはインデックスの再作成または修復」を参照してください。
mysql_upgrade は、MySQL をアップグレードするたびに実行するようにしてください。
引用元:4.4.7 mysql_upgrade — MySQL テーブルのチェックとアップグレード
https://dev.mysql.com/doc/refman/5.6/ja/mysql-upgrade.html
とりあえず MySQL をアップグレードするたびに「mysql_upgrade」コマンドは実行しないといけないようです。しかもデータが壊れる可能性があるので、バックアップ必須のコマンドです。
mysql_upgrade コマンドの実行
AWS で構築したテスト用サーバーでしたが、念のためバックアップを作成した上で、mysql_upgrade を実行したところ問題が解消しました。
mysql_upgrade コマンド
mysql_upgrade コマンドの実行サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@hostname]# mysql_upgrade -u root -p Enter password: Checking if update is needed. Checking server version. Running queries to upgrade MySQL server. Checking system database. mysql.columns_priv OK mysql.db OK mysql.engine_cost OK mysql.event OK mysql.func OK mysql.general_log OK mysql.gtid_executed OK (中略) Upgrade process completed successfully. Checking if update is needed. |
さいごに
MySQL をアップデートするなら、OS ごと最新サーバーを構築しなおすスタイルで作業していたので、mysql_upgrade コマンドの存在を初めて知りました(苦笑)。
みなさんは MySQL をアップグレードされる際には、mysql_upgrade コマンドの実行忘れが無いように十分にご注意ください。