犬ターネット

MySQL 5.7 → MySQL 8.0 に更新した&メモ

2018-04-23 mysql php

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.cnfquery_cache_type=1 などと書いてあると以下のようなエラーが出て MySQL が起動しないので注意。

[ERROR] [MY-011071] [Server] unknown variable 'query_cache_type=1'

MySQL で SSL 接続

拘束、ダメージ、ジャンク、コピーバンド