MySQL 異なるバージョン間でのmysqldumpおよびリストアについて
異なるバージョン、もしくは、異なる サーバ間で、データベースのdump (mysqldump) および restore リストアを実施した時に、リストア先にデータベースもテーブルもないはずなのに、キー重複(Duplicate entry)が起きたりしたことはありませんか? え?、なにもないはずなのに。。。って。オカルトですよね。
この原因って、dump時の文字コードが原因している場合が多いですって話です。。。
プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
- 作者: 矢野啓介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/02/18
- メディア: 単行本(ソフトカバー)
- 購入: 34人 クリック: 578回
- この商品を含むブログ (129件) を見る
今回は、MySQL5.7のdumpをMySQL8.0にリストアしているのですが、MySQL 5.7の文字コードデフォルトをutf-8に設定していたんですね。そして、MySQL 8.0のデフォルトは、utf8mb4 どうやらmysqldumpは、utf-8でdumpされるようなのです。この状態で、リストアするとdumpファイルの中に書かれているSQLの value値がいい感じに丸められてしまい、ユニーク索引などを設定している箇所で、キー重複を起こしてしまうんですね。。
解決方法
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
にしてしまいました。。今の所、無念