MySQLの行サイズエラー


11

MacbookでMySQLサーバーを実行しています(テスト用)。バージョンはHomebrewの5.6.20です。「行サイズが大きすぎます」というエラーが発生し始めましたが、このテストケースまで減らすことができました。テーブル:

mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| stuff | longtext | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

テーブルのステータス:

mysql> show table status where Name = 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |   5242880 |              2 | 2014-08-28 23:51:12 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

列にstuff5033932バイトを超える行をテーブルに挿入しようとすると、エラーが発生します。

mysql> select length(stuff) from test;
+---------------+
| length(stuff) |
+---------------+
|       5033932 |
+---------------+

mysql> update test set stuff = concat(stuff, 'a');
ERROR 1118 (42000): 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.

私はこのエラーを探してみましたが、ほとんどの回答にはTEXT列が多すぎることが含まれており、それぞれに768バイトがインラインで格納されています。ご覧のとおり、それは私には当てはまりません。また、5033932の数は、テーブルにある列の数に関係なく同じままです。元のアプリケーションでは5つの列があり、列サイズが5033932を超えても更新は失敗しました。

行の形式を切り替えることで問題を解決する人もいるので、少し試してみますが、このエラーの原因を正確に理解したいと思います。

前もって感謝します!

回答:


12

5.6.20リリースノートの変更:

外部に保存された大きなBLOBフィールドに対するREDOログの書き込みは、最新のチェックポイントを上書きする可能性があります。5.6.20パッチは、REDOログBLOB書き込みのサイズをREDOログファイルサイズの10%に制限します。5.7.5パッチは、制限を課すことなくバグに対処します。MySQL 5.5の場合、バグは既知の制限のままです。

MySQL 5.6で導入されたREDOログBLOB書き込み制限の結果、innodb_log_file_sizeは、テーブルの行にある最大BLOBデータサイズに他の可変長フィールド(VARCHAR、VARBINARY)の長さを加えた値の10倍を超える値に設定する必要があります。 、およびTEXTタイプのフィールド)。そうしないと、「行サイズが大きすぎます」というエラーが発生する可能性があります。

(強調鉱山)

のデフォルトinnodb_log_file_sizeは50331648です。つまり、データタイプに関係なく作成できる最大のBLOB / TEXT値は5033164に近く、正確な値は5033932であることがわかりました。内部的に計算にはファッジファクターが含まれていると思います。

したがって、innodb_log_file_sizeより大きなBLOB / TEXTデータを格納する場合は、増やす必要があります。さいわい、5.6では、InnoDBの以前のバージョンよりもログファイルサイズの変更がはるかに簡単です。my.cnfに新しい値で行を追加し、mysqldを再起動します。


ちょっとした注意、変更を
有効に

1
このREDOサイズの制限は、mysql 5.6.22の合計のinnodb_log_file_size(innodb_log_file_size * innodb_log_files_in_group)の10%に緩和されています。また、ロングブロブの最大長は4294967295(2 ^ 32-1)文字、つまり約4GBです。このlongblob値を格納するには、innodb_log_file_size(innodb_log_file_size * innodb_log_files_in_group)を組み合わせた最小40GBが必要です。
kasi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.