Database JUNKY

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

MySQL 異なるバージョン間でのmysqldumpおよびリストアについて

異なるバージョン、もしくは、異なる サーバ間で、データベースのdump (mysqldump) および restore リストアを実施した時に、リストア先にデータベースもテーブルもないはずなのに、キー重複(Duplicate entry)が起きたりしたことはありませんか? え?、なにもないはずなのに。。。って。オカルトですよね。

この原因って、dump時の文字コードが原因している場合が多いですって話です。。。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

今回は、MySQL5.7のdumpをMySQL8.0にリストアしているのですが、MySQL 5.7の文字コードデフォルトをutf-8に設定していたんですね。そして、MySQL 8.0のデフォルトは、utf8mb4 どうやらmysqldumpは、utf-8でdumpされるようなのです。この状態で、リストアするとdumpファイルの中に書かれているSQLvalue値がいい感じに丸められてしまい、ユニーク索引などを設定している箇所で、キー重複を起こしてしまうんですね。。

解決方法

mysqldumpのオプションで、-default-character-set=binary を指定することでこの問題は解決されます。

mysqldump

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

リストア

mysql -uadmin -ppasswd --default-character-set=binary < /tmp/schema1.dump

こんな感じでやれば、面倒なエラーを回避することは可能!!!

。。。と言いたいところなのですが、これがどうも、JSONカラムには対応していないようで。。。闇が深いです。。

結局・・

結局私は、

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

にしてしまいました。。今の所、無念

f:id:hit10231023:20180309104332j:plain