个性化阅读
专注于IT技术分析

如何解决MySQL常规错误:1030从存储引擎得到了139错误

本文概述

你将随机遇到这种错误, 在这种情况下, 插入语句将失败, 从而导致致命错误139。这通常在生产中发生, 当用户在表的某个字段中插入大量文本时(尽管该字段可能是键入LONGTEXT)。当Innodb无法将给定行的所有可变长度列存储在单个数据库页面上时, 将触发此错误。

在本文中, 我们将向你展示如何绕过此限制并向你说明为什么会发生这种情况。

为什么会这样?

Innodb有一个已知的最大行大小限制, 该限制略小于数据库页面的一半(实际数学值为16K-(页面标题+页面尾部)/ 2)。对于默认页面大小为16kb。行大小限制为8000字节左右。此限制是InnoDB在页面上存储两行的结果。但是, 如果使用压缩, 则可以在页面上存储一行。如果完整的行大小超过了此限制, InnoDB将选择可变长度的列进行页外存储。

值得一提的是, 此限制适用于值的字节大小, 而不适用于字符大小。这意味着, 如果将具有所有多字节字符的500个字符串插入VARCHAR(500)列, 则还将选择该值进行页外存储。这意味着从本地字符集转换为utf8后, 你可能会遇到此错误, 因为它可能会大大增加大小。例如, 如果你的表中至少有8列文本(TEXT, LONGTEXT), 每列超过768个字节, 那么本地存储将至少有8448个字节。这超出了限制, 因此你将面临例外。

简而言之, 使用当前配置, InnoDB无法存储许多数据。解决此问题的最佳方法是将MySQL安装的默认格式从压缩或冗余更改为动态或压缩。

注意

在等于或低于5.5的MySQL版本上, 你通常会遇到此异常(MySQL 5.7引入了innodb_default_row_format选项, 该选项默认为DYNAMIC, 因此在较新的版本中, 你将永远不会看到此异常)。

1.验证Barracuda格式是否可用

解决此问题的方法是将出现问题的表的行格式设置为DYNAMIC, 但是, 当表的格式设置为”羚羊”时, 此选项不可用。要验证你的MySQL服务器是否启用了Barracuda格式, 你可以使用PHPMyAdmin之类的工具来检查任何表的行格式选项:

Barracuda格式(动态和压缩)

如果看不到DYNAMIC或COMPRESSED选项, 则需要按照通常设置为Antelope的步骤#2将innodb_file_format更改为Barracuda。如果没有像PHPMyAdmin这样的工具, 则可以打开mysql终端, 并使用以下命令获取信息:

show variables like "%innodb_file%";

有此问题的mysql版本应输出如下内容:

innodb_file mysql

如你所见, 文件格式设置为Antelope, 它不支持动态行格式。

2.将文件格式更改为Barracuda

你需要做的第一件事是找到Mysql的配置文件(unix中的my.cnf或Windows中的my.ini), 并在mysqld块上添加具有以下值的新2个选项:

# The MySQL server
[mysqld]

innodb_file_per_table = 1
innodb_file_format = barracuda

注意

如果添加这些选项后, mysql服务器无法启动, 则不支持该格式, 这意味着问题的解决方案也不是。你将被迫升级MySQL服务器版本以使DYNAMIC和COMPACT行格式可用。

重新启动mysql服务器并重复第一步, 以查看DYNAMIC和COMPACT行格式是否可用或在mysql终端中再次运行以下指令:

show variables like "%innodb_file%";

现在应该输出:

InnoDB文件格式Barracuda

使用具有Barracuda作为值的innodb_file_format, 你将能够在存在此存储引擎问题的表上使用所需的动态行格式。

3.将表的行格式更改为DYNAMIC

现在你已经配置了Barracuda文件格式, 只需使用PHPMyAdmin中的工具更改表行格式(转到表, 然后进行操作并搜索Table选项并更改row_format选项):

Barracuda格式(动态和压缩)

或者, 如果你无法使用工具, 请在mysql命令行上使用说明:

ALTER TABLE `mytable` ROW_FORMAT=DYNAMIC;

修改表的行格式之后, 在数据库中保存大量数据的行不再是问题, 并且你也不会看到此异常。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何解决MySQL常规错误:1030从存储引擎得到了139错误

评论 抢沙发

评论前必须登录!