Aurora MySQL で utf8mb4 なダンプデータをインポートしようとして ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes.
よく知られているのが、 innodb_large_prefix=1
と innodb_file_format=Barracuda
にする、ROW_FORMAT
は DYNAMIC
か COMPRESSED
にする必要があることです。
しかしその設定は満足しているのに、なぜ?という場面がありました。
show variables where Variable_name in ('innodb_large_prefix', 'innodb_file_format', 'innodb_default_row_format'); show variables like "chara%";
+---------------------------+-----------+ | Variable_name | Value | +---------------------------+-----------+ | innodb_default_row_format | dynamic | | innodb_file_format | Barracuda | | innodb_large_prefix | ON | +---------------------------+-----------+ 3 rows in set (0.00 sec) +--------------------------+------------------------------------------------------------------+ | Variable_name | Value | +--------------------------+------------------------------------------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | utf8mb4 | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.2.0.1106.0/share/charsets/ | +--------------------------+------------------------------------------------------------------+ 8 rows in set (0.00 sec)
原因
dumpファイルで ROW_FORMAT=COMPRESSED が指定されていました。
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=50853 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Aurora MySQL では COMPRESSED
に対応していません。
Amazon RDS MySQL DB インスタンスから DB クラスターにデータを移行するAmazon Aurora MySQL - AWS Database Migration Service
このため、このダンプファイルはAuroraでは ROW_FORMAT
の不備という扱いになりまいた。
対策
少々乱暴ですがダンプファイルを書き換えることで対応しました。
Linuxの場合
$ sed -i -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql
macの場合
$ sed -i "" -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql