【问题标题】:Cannot add field...row size...greater than maximum allowed size无法添加字段...行大小...大于最大允许大小
【发布时间】:2017-04-24 12:48:09
【问题描述】:

我在 MySQL 日志中看到以下错误:

[Warning] InnoDB: Cannot add field `wd_field_ft_95_240` in table `tmp`.`#sql_1_0` because after adding it, the row size is 8155 which is greater than maximum allowed size (8126) for a record on index leaf page.

tmp 数据库是某种内部 MySQL 结构吗?这是我需要关心的事情吗?

【问题讨论】:

    标签: mysql innodb temp-tables


    【解决方案1】:

    一些 MySQL 查询会创建 internal temporary tables 来保存部分结果。

    从 MySQL 5.7.6 开始,内部临时表的默认存储引擎是 InnoDB,如您所见,它对行大小的限制非常小(尽管 BLOB/TEXT 列可以超出该限制)。

    对于内部临时表,您可以返回旧的 5.7 之前的默认存储引擎:

     internal_tmp_disk_storage_engine=MyISAM
    

    这是此错误中提到的解决方法:“Bug #77398 row size too large in mysql 5.7 query

    【讨论】:

    • 这只是一个[警告]吗?它会导致查询失败吗?还是它只是阻止它以最佳优化运行查询?我在错误日志中看到了这些条目,但这并不是说查询也失败了。
    • 我相信它会导致查询失败。运行查询的客户端收到错误。我不确定为什么服务器将其记录为警告。
    【解决方案2】:

    请告诉我们SHOW CREATE TABLE。我敢打赌你有很多列声明VARCHAR(255)。我还敢打赌,这些列中的大多数永远不需要 255 个字符。缩小它们。

    如果这还不够,请将 few 更改为 TEXT;数据将在页面外存储,不会严重影响 8K 限制。

    如果这还不够,我们可以谈谈“垂直分区”。此时,请向我们展示导致错误的查询。如果您正在使用SELECT *,请将其更改为仅指定您真正需要的列。

    不要使用 MyISAM,这是一个倒退。而且它会在下一个版本中消失,因此未来的迁移会受到影响。

    【讨论】:

    • 你对MySQL的开发有发言权吗?我正在尝试将数据库从 5.5 迁移到 5.7,这是一场噩梦。新的和更好的固然很好,但放弃向后兼容性会使采用变得更加困难。
    • @AuntJemima - Pancakes 女士,我在开发中没有直接 发言权。这里需要进一步说明的是 8.0 进一步改变了临时表的处理方式;我不知道它是否能解决你的问题。同时,Bill 的建议很简单(一次性修复 my.cnf,加上重新启动),我希望它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多