text 型のカラムが多いテーブルを更新しようとした際に、以下のエラーメッセージが表示されました。
Row size too large (> 8126).
Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.
In current row format, BLOB prefix of 768 bytes is stored inline.
環境は AWS の RDS で、MySQL のバージョンは「5.6.35-log MySQL Community Server」です。
ROW_FORMATをDYNAMICに変更する
エラーメッセージの通り、ROW_FORMAT を DYNAMIC に変更すればいいのですが、それには innodb_file_format の設定を変更する必要があります。
RDS の場合はパラメータグループで、MySQL サーバ起動している場合は my.cnf で設定の変更が可能です。
1 2 3 4 5 6 7 8 9 | mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_file%'; +--------------------------+----------+ | Variable_name | Value | +--------------------------+----------+ | innodb_file_format | Antelope | | innodb_file_format_check | ON | | innodb_file_format_max | Antelope | | innodb_file_per_table | ON | +--------------------------+----------+ |
Antelope を Barracuda にすればいいのですが、RDS の場合は innodb_file_format_max の設定項目が表示されなかったので変更できないかもしれません。
ただ、今回の問題に対しては innodb_file_format の設定変更だけで大丈夫です。
Barracuda に変更したら、ROW_FORMAT を変更します。
1 | mysql> ALTER TABLE [テーブル名] ROW_FORMAT=DYNAMIC; |
変更後のテーブルの状態を確認
変更前と変更後のテーブルの状態を確認してみます。
1 | mysql> SHOW TABLE STATUS LIKE '[テーブル名]'; |
変更前は Row_format が Compact になっていますが、変更後は Dynamic になっているのが確認できます。
この状態で更新をすれば、冒頭のエラーは出なくなりました。
テキスト型のカラムが多いテーブルを作成して使う場合は、意識しておいた方がいいですね。