タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

Aurora MySQL で utf8mb4 なダンプデータをインポートしようとして ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes.

よく知られているのが、 innodb_large_prefix=1innodb_file_format=Barracuda にする、ROW_FORMATDYNAMICCOMPRESSED にする必要があることです。 しかしその設定は満足しているのに、なぜ?という場面がありました。

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