如何为大型二进制数据配置MySQL 5.6 LONGBLOB

时间:2014-08-13 03:13:39

标签: mysql sql row innodb

在我提出一个问题之前:我使用MySQL 5.5数据库的MySQL Workbench 6.1从一台机器到另一台机器上的5.6进行数据导出/导入。两台机器都是ubuntu,其中一台是32位而另一台是64位。

我转储数据没问题,但是当我尝试加载它时,我得到了:

  

ERROR 1118(42000)在第1807行:行大小太大(> 8126)。将某些列更改为TEXT或BLOB或使用ROW_FORMAT = DYNAMIC或ROW_FORMAT = COMPRESSED可能会有所帮助。在当前行格式中,760字节的BLOB前缀以内联方式存储。

这是表创建:

CREATE TABLE `file_content` (
  `fileid` bigint(20) NOT NULL,
  `content` LONGBLOB NOT NULL,
  PRIMARY KEY (`fileid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我有以下相关的my.cnf设置......

  

max_allowed_pa​​cket的= 1G
  innodb_file_per_table = 1
  innodb_file_format =梭鱼

我花了很多谷歌搜索时间试图找出问题所在。顺便说一句,如果我删除主键(这里没问题,但另一个有外键的表在这个表中抱怨。

幸运的是,我有ssh访问框,所以我可以看到实际的mysqldb.log。为什么我发现真的很有趣......

  

2014-08-12 20:42:12 25246 [错误] InnoDB:总blob数据长度(14179167)大于重做日志文件大小(3072)的10%。请增加innodb_log_file_size。

因此将重做日志文件大小增加到10倍LONGBLOB大小解决了我的问题。但这是否意味着要插入1G LONGBLOB(即由于数据包大小而实际最大值),我需要一个10G innodb_log_file_size。

任何人都可以解释"重做日志大小错误"变成"行大小太大(> 8126)"错误。

BTW我无法控制这个数据库的结构,所以没有"为什么要在数据库中存储大的blob"。

TIA

3 个答案:

答案 0 :(得分:77)

此问题的原因是MySQL 5.6.20中的更改可以在更改日志中读取:

  

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

要解决您的问题,您必须在my.ini部分下方的[mysqld]中增加innodb_log_file_size选项的值。其默认值为48M。将其设置为

[mysqld]
innodb_log_file_size=256M

在我的案例中有所帮助。

更改do this safelyinnodb_log_file_size值时要小心:

  
      
  1. 您需要干净地正常关闭服务器。
  2.   
  3. 离开   (不要删除)日志文件,名为ib_logfile0,   ib_logfile1,依此类推。
  4.   
  5. 检查错误日志以确保没有   问题关闭。
  6.   
  7. 然后重新启动服务器并查看错误日志   输出仔细。您应该看到InnoDB打印消息说明了   日志文件不存在。它将创建新的然后开始。
  8.   
  9. 在这   您可以验证InnoDB是否正常工作,然后您可以删除   旧的日志文件。
  10.   

答案 1 :(得分:1)

对于那些无法在XAMPP中找到它的人:
起初,我找不到正确的文件来编辑innodb_log_file_size

实际文件:xampp/mysql/bin/my.ini

答案 2 :(得分:0)

只需在以下位置导航:xampp \ mysql \ bin \ my.ini,然后尝试将innodb_log_file_size的大小更改为256 MB