Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL 8.0にアップデート!注意すべき点

MySQL 8.0 バージョンアップしたら、速度が2倍向上!便利な関数が使える!!等、色々なメリットがあります。 ・・が、 通常のサービスでデータベースがメジャーバージョンアップしたからといってサービスを停止して、バージョンアップってしないかなー?って思ってます。自分がやるのであれば、別のサーバ立てて旧バージョンからレプリケーション!可能な限り、ダウンタイムを減らしたいのでこの手法一点で進めます

ただ、今回は、かなり苦戦しています

次回、同じ状態にならないように、備忘録に残しておきます。

バックアップ

mysqldumpに注意!!

MySQL 8.0クライアントから、MySQL 5.7のDUMPファイルを取得する際、こんなエラーを食らいました

mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'aaaaa' AND TABLE_NAME = 'bbbbb';': Unknown table 'column_statistics' in information_schema (1109)

意味不明です。。。

・・がこちらは。。

column_statisticsが、mysql.column_statistics に名前が変わり、また、システムテーブルとして直接参照が不可能になったことが原因です。

こちら、mysqldumpのオプションに、--column-statistics=0を追記することで、エラーを回避できます。

オプションを記述した、mysqldumpの構文を例として載せておきます

mysqldump --column-statistics=0 --host=host1 --uadmin -ppasswd  --databases schema1 schema2 --column-statistics=0 --master-data --single-transaction --routines --default-character-set=utf8mb4 > /tmp/db_backup.dump

あ、一応、主題としては、サービスのダウンタイムを極力減らすためというところから話が派生しているので、今回の話題とは関係のないオプションも書いてます。

リストア

MySQL5.7のdumpファイルをMySQL 8.0にリストアすると、NO_AUTO_CREATE_USERがないよってエラーが出て停止しちゃったります。これは、sql_modeのNO_AUTO_CREATE_USERがMySQL 8.0で廃止されたためです。

ERROR 1231 (42000) at line 6918: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

かといって、中断されても困るので。ここは、エラーがでてもリストアを実行でききるforceオプションを設定しました。

こんな感じです(fオプションをつけます)

mysql -uadmin -ppasswd -f < /tmp/db_backup.dump

認証情報

MySQL 8.0の認証方式が(たぶん)変わりましたり。mysql_native_passwordがcaching_sha2_passwordに変更になり、それがデフォルトなっております。認証方式が変わっただけであればいいのですが、このデフォルト値の場合、クライアントも、caching_sha2_passwordも対応する必要があり、かつ、旧バージョンの接続クライアントの場合は、確実にエラーになります。おそらく、これでは、アプリ(プログラム)にも影響がでてくるので、認証方式は8.0 以前のmysql_native_passwordに変更しておくのが無難です

ALTER USER 'admin'@'%' identified WITH mysql_native_password BY 'passwd';

また、 my.cnfにもmysql_native_passwordの設定をしておきましょう!

[mysqld]

# 旧 MySQL Clientとの互換性確保
default_authentication_plugin=mysql_native_password

文字コード

あとで面倒なことにならないように、MySQL5.7で設定していた、my.cnfの文字コード設定と合わせておきましょう。

[mysqld]

# MySQL5.7の設定の互換性確保
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

今の所こんな感じですが、エラーをくらった時点で随時更新していきます(笑)

バージョンアップの道は長い。。

f:id:hit10231023:20180309104332j:plain