MySQL的行大小错误

geo*_*liu 11 mysql innodb

我在我的 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    |                |
+-------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

表状态:

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 |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
Run Code Online (Sandbox Code Playgroud)

当我尝试将一行插入到该stuff列超过 5033932 字节的表中时出现的错误。

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.
Run Code Online (Sandbox Code Playgroud)

我已经搜索过这个错误,大多数答案都涉及有太多的 TEXT 列,每个列都有 768 字节的内联存储。如您所见,对我而言并非如此。此外,无论我在表中有多少列,数字 5033932 都保持不变。在我原来的应用中,有五列,当列大小超过5033932时,更新仍然失败。

我也看到人们通过切换行格式来解决这个问题,我会尝试一下,但我想确切地了解导致此错误的原因。

提前致谢!

Bil*_*win 12

5.6.20 发行说明中的​​更改:

大型外部存储的 BLOB 字段的重做日志写入可能会覆盖最近的检查点。5.6.20 补丁将重做日志 BLOB 写入的大小限制为重做日志文件大小的 10%。5.7.5 补丁解决了该错误,但没有施加限制。对于 MySQL 5.5,该错误仍然是一个已知限制。

由于为 MySQL 5.6 引入了重做日志 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。