クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
データベース

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

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 を変更します。

mysql> ALTER TABLE [テーブル名] ROW_FORMAT=DYNAMIC;

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

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

mysql> SHOW TABLE STATUS LIKE '[テーブル名]';

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

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

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

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/09/21 11:58:20時点 Amazon調べ-詳細)

あなたにオススメ