我从 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.
我在网上阅读了很多关于这个错误的东西,但没有一个能解决我的问题。
NB 这个错误不是来自表的创建,而是来自于插入具有相当大数据的行。
笔记:
- 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 兆字节)行时才会发生错误;创建表工作正常,并且在失败之前添加了大约 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