我从 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.
我在网上阅读了很多有关此错误的内容,但都没有解决我的问题。
注意:这个错误是not来自表的创建,而是插入具有相当大数据的行。
Notes:
- innodb_file_format 和 innodb_file_format_max 变量设置为 Barracuda。
- ROW_FORMAT 在表创建时设置为 DYNAMIC。
-
该表没有太多列。架构如下:
+----------------+------------+------+-----+---------+----------------+
| 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 MB)时才会发生错误;创建表工作正常,并且在失败之前添加了大约 500,000 行。
我没有主意了;我尝试过动态和压缩行格式,并且我已经三次检查了相关 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