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 |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

当我尝试向表中的行插入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.

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

我还看到人们通过切换行格式解决了这个问题,我将尝试一下,但是我想确切地了解是什么导致了此错误。

提前致谢!

Answers:


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。


小提示,您必须重新启动或停止然后重新启动,以使更改受到影响,重新加载无效
Hieu Vo 2015年

1
此重做大小限制从mysql 5.6.22放宽到总组合innodb_log_file_size(innodb_log_file_size * innodb_log_files_in_group)的10%。并且longblob的最大长度为4294967295(2 ^ 32-1)个字符,即大约4GB。要存储此longblob值,我们至少应有40GB的总innodb_log_file_size(innodb_log_file_size * innodb_log_files_in_group)。
卡西
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.