MySQL 5.7.22 → MySQL 8.0.11 にアップデートしたときのメモ。OS は CentOS 7、MySQL は yum で入れている。
まずはバックアップ用の dump ファイルを作成。失敗したら 5.7 を再インストールしてこのファイルからリストアする(何度も失敗した…)。
mysqldump --all-databases -u root -p > dump_all
次に mysql を停止。
systemctl stop mysqld
mysql のレポジトリの参照先を変更する。まずはどのリポジトリが有効になっているか確認。
yum repolist all | grep mysql
…
mysql55-community/x86_64 MySQL 5.5 Community Server 無効
mysql55-community-source MySQL 5.5 Community Server - Sou 無効
mysql56-community/x86_64 MySQL 5.6 Community Server 無効
mysql56-community-source MySQL 5.6 Community Server - Sou 無効
!mysql57-community/x86_64 MySQL 5.7 Community Server 有効: 267
mysql57-community-source MySQL 5.7 Community Server - Sou 無効
mysql80-community/x86_64 MySQL 8.0 Community Server 無効
mysql80-community-source MySQL 8.0 Community Server - Sou 無効
mysql57-community
が有効になっているので yum-config-manager
を使って mysql80-community
に変更。
yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql80-community
yum repolist all | grep mysql
…
mysql55-community/x86_64 MySQL 5.5 Community Server 無効
mysql55-community-source MySQL 5.5 Community Server - Sou 無効
mysql56-community/x86_64 MySQL 5.6 Community Server 無効
mysql56-community-source MySQL 5.6 Community Server - Sou 無効
!mysql57-community/x86_64 MySQL 5.7 Community Server 無効
mysql57-community-source MySQL 5.7 Community Server - Sou 無効
mysql80-community/x86_64 MySQL 8.0 Community Server 有効: 17
mysql80-community-source MySQL 8.0 Community Server - Sou 無効
そして更新。
yum update
更新完了したら mysql を起動し、mysql_upgrade
を実行。
systemctl start mysqld mysql_upgrade -u root -p
アップグレードが正常完了して一般ユーザで接続して正常にクエリ実行できればOK。
[追記:2018/10/22]
ちなみに、マイナーバージョンアップデート時も mysql_upgrade
を実行したほうがよさそう。8.0.12 → 8.0.13 にアップデートしたら以下エラーログが出力されていた。 mysql_upgrade
で解決。
[ERROR] [MY-013142] [Server] Column count of mysql.user is wrong. Expected 50, found 49. Created with MySQL 80012, now running 80013. Please use mysql_upgrade to fix this error.
PHP から接続してみたところ、以下エラーが発生した。
SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers
明示的に文字コードを設定してあげないとダメっぽい。/etc/my.cnf
に以下2行を追加。
[mysqld] collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4
mysql再起動後に再度接続したら今度は以下のエラーが発生。
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
旧mysqlと新mysqlで認証方式が異なるためのエラーになってしまうみたい(参考)。/etc/my.cnf
に以下を追加して認証方式を mysql_native_password
に設定。
[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
default_authentication_plugin=mysql_native_password
mysql再起動後、PHPから正常に接続できたことを確認。ふう。
余談。上記で
collation-server = utf8mb4_unicode_ci
を設定しているけれど、この設定ではSQLを投げたときに「バンド」「ハント」を区別しないため検索結果がおかしくなる。きちんと区別するためには以下を設定したほうがよい(参考:MySQLの文字コードとCollation)。
collation-server = utf8mb4_general_ci
追記:日本語環境であれば、ひらがなカタカナを区別できる以下を使ったほうがよい(参考)。
collation-server = utf8mb4_ja_0900_as_cs_ks
余談。8.0 からクエリキャッシュがなくなった。
MySQL 8.0 : クエリーキャッシュのサポート終了 | Yakst
そのため、/etc/my.cnf
に query_cache_type=1
などと書いてあると以下のようなエラーが出て MySQL が起動しないので注意。
[ERROR] [MY-011071] [Server] unknown variable 'query_cache_type=1'