恢复Django-mailer数据库时MySQL Error 1118(行大小太大)

Gre*_*eys 7 mysql django innodb django-mailer

我从django应用程序中转储了一个正在运行的生产数据库,并尝试将其迁移到我的本地开发环境.生产服务器运行MySQL 5.1,本地我运行5.6.

在迁移django-mailer的"messagelog"表时,我遇到了可怕的错误1118:

ERROR 1118 (42000) at line 2226: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

我在网上看到了很多关于这个错误的东西,但没有一个能解决我的问题.

注意:此错误不是来自表的创建,而是来自插入具有相当大数据的行.

笔记:

  1. innodb_file_format和innodb_file_format_max变量设置为Barracuda.
  2. 在创建表时,ROW_FORMAT设置为DYNAMIC.
  3. 该表没有很多列.架构如下:

    +----------------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | message_data | longtext | NO | | NULL | | | when_added | datetime | NO | | NULL | | | priority | varchar(1) | NO | | NULL | | | when_attempted | datetime | NO | | NULL | | | result | varchar(1) | NO | | NULL | | | log_message | longtext | NO | | NULL | | +----------------+------------+------+-----+---------+----------------+

同样,只有当我尝试插入一个非常大的(message_data大约5兆字节)行时才会发生错误; 创建表工作正常,在失败之前添加大约500,000行.

我没有想法; 我尝试过DYANMIC和COMPRESSED行格式,并且我检查了相关innodb变量的值:

mysql> show variables like "%innodb_file%"; +--------------------------+-----------+ | Variable_name | Value | +--------------------------+-----------+ | innodb_file_format | Barracuda | | innodb_file_format_check | ON | | innodb_file_format_max | Barracuda | | innodb_file_per_table | ON | +--------------------------+-----------+

创建代码(来自SHOW CREATE TABLE)看起来像:

CREATE TABLE `mailer_messagelog` ( `id` int(11) NOT NULL AUTO_INCREMENT, `message_data` longtext NOT NULL, `when_added` datetime NOT NULL, `priority` varchar(1) NOT NULL, `when_attempted` datetime NOT NULL, `result` varchar(1) NOT NULL, `log_message` longtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=869906 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

kla*_*ske 19

根据这个问题的答案之一,您的问题可能是由MySQL 5.6中的更改引起的(请参阅http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-上的InnoDB说明)6-20.html):

InnoDB备注

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

由于为MySQL 5.6引入了重做日志BLOB写入限制,innodb_log_file_size设置应该比表中行中找到的最大BLOB数据大小加上其他可变长度字段的长度(VARCHAR,VARBINARY和TEXT类型字段).如果您的innodb_log_file_size设置已足够大或您的表不包含BLOB数据,则无需任何操作.

注意在MySQL 5.6.22中,重做日志BLOB写入限制放宽到总重做日志大小的10%(innodb_log_file_size*innodb_log_files_in_group).

(Bug#16963396,Bug#19030353,Bug#69477)

如果你换成innodb_log_file_size50M以上的东西会有帮助吗?(更改该变量需要一些步骤才能正常工作:

https://dba.stackexchange.com/questions/1261/how-to-safely-change-mysql-innodb-variable-innodb-log-file-size).