弊社で使っているMySQLを5.7からMySQL8.0に移行する作業を行いました。
その際にデータを移行していたところ、COLLATIONで少しつまづいたので解決方法を記載します。
COLLATIONの確認
デフォルトの照準順序はMYSQL5.7まではutf8mb3_general_ciだったが、MySQL8.0ではutf8mb4_0900_ai_ciになっていました。
RDSのパラメータグループでcollation_connectionとcollation_serverの値は変更できるので、utf8mb4_general_ciに変更しました。
ただ、default_collation_for_utf8mb4は変更できないので直接DBを変更するしか無いです。
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
補足
DBをインポートする際に、character_setは--default-character-setオプションで指定できますがdefault_collationは指定ができない。
mysql>use [DB名]
mysql>SELECT @@character_set_database, @@collation_database;
をすると、
@@character_set_database = utf8mb4
@@collation_database = utf8mb4_general_ci
になってると思います。
ただ、この状態でインポートしてもテーブルとカラムは、utf8mb4_general_ciになりません。
解決方法
mysql>SHOW TABLE STATUS;
mysql>SHOW FULL COLUMNS FROM [テーブル名]
### Collationカラム は utf8mb4_0900_ai_ci になる。
なぜ?????????
エクスポートしたファイルの中身を見てみると、CREATE文がCHARSETしか指定されておらず、COLLATEが指定されてない!
だから、Collationはグローバルデフォルトのutf8mb4_0900_ai_ciになっていた?のかもしれない。(正確にはわかりません。)
他に手段がないので、エクスポートしたファイルのCREATE文に CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
を追加しました。
RDSのtime_zoneのデフォルトはUTCになってました。
DBパラメータのtime_zoneをAsia/Tokyoに指定して、変更を保存をクリックする。
mysql>SHOW VARIABLES LIKE '%time_%';
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
余談
mysqldump: Got errno 28 on write
が出た時はファイルの容量が圧迫している可能性があります。
ls -al
でファイル容量を確認して削除できる大きいファイルを削除しましょう。