【问题标题】:ERROR 1118 (42000) Row size too largeERROR 1118 (42000) 行大小太大
【发布时间】:2014-09-29 13:53:59
【问题描述】:

我知道这个问题已经被问过(并回答)了很多次,但似乎没有一个问题与我看到的相同......

给我问题的表只有两列:第一个字段是整数,第二个字段是长文本。这是 MySQL 5.5.30 的转储文件的一部分:

1 - MySQL dump 10.13  Distrib 5.5.30, for Linux (x86_64)
2 --
3 -- Host: localhost    Database: mydatabasename
4 -- ------------------------------------------------------
5 -- Server version   5.5.30-log

32 DROP TABLE IF EXISTS `large_file`;
33 /*!40101 SET @saved_cs_client     = @@character_set_client */;
34 /*!40101 SET character_set_client = utf8 */;
35 CREATE TABLE `large_file` (
36   `id` int(11) NOT NULL AUTO_INCREMENT,
37   `data` longtext,
38   PRIMARY KEY (`id`)
39 ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=latin1;
40 /*!40101 SET character_set_client = @saved_cs_client */;

43 -- Dumping data for table `large_file`
44 --
45 
46 LOCK TABLES `large_file` WRITE;
47 /*!40000 ALTER TABLE `large_file` DISABLE KEYS */;
48 INSERT INTO `large_file` VALUES(38,'GyUtMTIzNDVYQ... <large data> ...);
49 /*!40000 ALTER TABLE `large_file` ENABLE KEYS */;
50 UNLOCK TABLES;

如您所见,这个转储文件来自 MySQL 5.5.30,我可以将这些数据导入 5.5.30。但是,当我尝试导入 5.6.x 时,我收到 ERROR 1118 (42000) Row size too large 错误。

进入 large_file 表的数据(相对)大,值的大小范围从 15 MB 到大约 25 MB。数据全部为 ASCII(base 64 编码)。

其他发帖者的列数非常多,但我在此表中只有两列。

longtext 类型应该能够存储大约 4 GB,5.5.30 就是这种情况,但我发现迁移到 5.6.x 很困难。

谁能提供关于为什么会发生这种情况的见解?或者,我该如何解决?

提前致谢!

【问题讨论】:

  • 试试看这里 [link - stackoverflow][1] [1]: stackoverflow.com/questions/13283381/row-size-too-
  • 感谢@PrincipeDade 的指点。我认为这个问题与大量列有关。我只有两列,其中一列是大文本。据我了解,大文本字段中只有一小部分存储在行中,其余部分单独存储link
  • 这是一个演示该问题的测试文件。它包含一个数据库(名称:testdatabase)和一个表(名称:testtable)。表中有 2 列,表中有 1 行。 test file.
  • 要使用最后一条评论中链接的文件进行测试,请执行以下操作:gunzip -c db.sql.gz | mysql -u root
  • 相关(尚未答复)问题:stackoverflow.com/questions/25299370/…

标签: mysql sql


【解决方案1】:

检查 innodb_log_file_size 设置是否足够大 -- 10 倍于在表中的行中找到的最大 BLOB 数据大小加上其他可变长度字段的长度。

以下来自MySQL 5.6 Release Notes

InnoDB 笔记

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

    由于 MySQL 5.6 引入了重做日志 BLOB 写入限制,innodb_log_file_size 的值应设置为大于表行中发现的最大 BLOB 数据大小加上其他可变长度字段长度的 10 倍( VARCHAR、VARBINARY 和 TEXT 类型字段)。 不这样做可能会导致“行大小过大”错误。如果您的 innodb_log_file_size 设置已经足够大或者您的表不包含 BLOB 数据,则无需执行任何操作。 (错误 #16963396、错误 #19030353、错误 #69477)

【讨论】:

  • 布莱恩,非常感谢!这确实解决了问题。
  • 优秀的 +1 这解决了我从 5.1.60 转储并加载到 5.6.x 时遇到的问题
  • 增加到 20GB,不幸的是它不适合我。我们可以给 innodb_log_file_size 多少最大值?
  • 您的日志文件的总大小 (innodb_log_file_size * innodb_log_files_in_group) 不能超过 512GB 以下的最大值。日志文件大小的上限是缓冲池大小的 1/n,其中 N 是组中的日志文件数。 dev.mysql.com/doc/refman/5.6/en/…
【解决方案2】:

我在使用 MYSQL 5.7 (OSX 10.11) 时遇到了这个问题。

尽管可能并不理想,但以下方法有效。

my.cfn 中添加:

innodb_strict_mode = 0    

【讨论】:

  • 这里有同样的问题,我已经为此浪费了几个小时。它解决了我的问题。谢谢兄弟。
  • 这有什么缺点?导入后删除它似乎可行。
【解决方案3】:
ERROR 1118 (42000) at line 1852: 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.
[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

ubuntu 16.04 edit path : nano /etc/mysql/mysql.conf.d/mysqld.cnf

成功了!!…

Click To Document

【讨论】:

    【解决方案4】:

    在将 BLOB 数据从 5.5 导入到 5.6.22 时遇到了相同的问题,其中 blob 大约为:最大 70MB。然而,虽然增加 innodb_log_file_size 起到了作用,但就我而言,我不得不将其增加到 10GB(我尝试从 1GB 开始以 1GB 为增量),这是最大 BLOB 大小的 10 倍以上。

    【讨论】:

      【解决方案5】:

      如果启用 InnoDB 严格模式,则会显示此错误。

      SET GLOBAL innodb_strict_mode=OFF;
      

      更多详情Read

      【讨论】:

        猜你喜欢
        • 2014-12-31
        • 2016-02-23
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 2015-07-13
        • 2022-10-17
        相关资源
        最近更新 更多