MySQL

MySQLで「Row size too large」のエラーが出た時の対策

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 で設定の変更が可能です。

Antelope を Barracuda にすればいいのですが、RDS の場合は innodb_file_format_max の設定項目が表示されなかったので変更できないかもしれません。

ただ、今回の問題に対しては innodb_file_format の設定変更だけで大丈夫です。

Barracuda に変更したら、ROW_FORMAT を変更します。

変更後のテーブルの状態を確認

変更前と変更後のテーブルの状態を確認してみます。

変更前は Row_format が Compact になっていますが、変更後は Dynamic になっているのが確認できます。

この状態で更新をすれば、冒頭のエラーは出なくなりました。

テキスト型のカラムが多いテーブルを作成して使う場合は、意識しておいた方がいいですね。