本文概述
- 为什么会这样?
- 1.验证Barracuda格式是否可用
- 2.将文件格式更改为Barracuda
- 3.将表的行格式更改为DYNAMIC
在本文中, 我们将向你展示如何绕过此限制并向你说明为什么会发生这种情况。
为什么会这样? 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之类的工具来检查任何表的行格式选项:
文章图片
如果看不到DYNAMIC或COMPRESSED选项, 则需要按照通常设置为Antelope的步骤#2将innodb_file_format更改为Barracuda。如果没有像PHPMyAdmin这样的工具, 则可以打开mysql终端, 并使用以下命令获取信息:
show variables like "%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%";
现在应该输出:
文章图片
使用具有Barracuda作为值的innodb_file_format, 你将能够在存在此存储引擎问题的表上使用所需的动态行格式。
3.将表的行格式更改为DYNAMIC 现在你已经配置了Barracuda文件格式, 只需使用PHPMyAdmin中的工具更改表行格式(转到表, 然后进行操作并搜索Table选项并更改row_format选项):
文章图片
或者, 如果你无法使用工具, 请在mysql命令行上使用说明:
ALTER TABLE `mytable` ROW_FORMAT=DYNAMIC;
修改表的行格式之后, 在数据库中保存大量数据的行不再是问题, 并且你也不会看到此异常。
【如何解决MySQL常规错误(1030从存储引擎得到了139错误)】编码愉快!
推荐阅读
- 如何在Symfony 3中将数字转换为单词(数字拼写)
- 如何在Symfony 3中使用php创建Word文件
- 如何在WinForms中使用C#检索CPU的温度
- 如何从控制器执行symfony命令
- 如何在WinForms中使用C#检索主板信息
- 在Android上将Canvas移植到OpenGL
- 如何在Android上将OpenGL ES 1.0代码转换为OpenGL Es 2.0()
- 如何在android上定义glsl的“time”参数
- 使用OpenGL ES 2.0在Android上创建Audio wave