如何克服Google Cloud MySQL5.7 Second Generation上的行大小太大(> 8126)错误

时间:2018-08-04 14:00:52

标签: innodb google-cloud-sql mysql-5.7

Google Cloud MySQL Engine仅支持InnoDB存储引擎。

创建具有300列的表时出现以下错误。

  

[Err] 1118-行大小太大(> 8126)。

将某些列更改为TEXTBLOB可能会有所帮助。在当前行格式中,0字节的BLOB前缀是内联存储的。

我尝试创建一个表,其中包含一些列作为文本类型,另一些列作为blob类型的组合,但是它不起作用。 甚至无法修改innodb_log_file_size,因为在Google Cloud-SQL平台上不允许这样做。

3 个答案:

答案 0 :(得分:1)

您在这里没有太多选择。 InnoDB的默认页面大小为16KB,您必须设计表格,以便页面至少容纳两行。这就是每行8126字节的限制。

像VARCHAR,VARBINARY,BLOB和TEXT这样的可变长度列可以更长,因为超出行大小限制的数据可以存储在额外的页面上。要利用此优势,必须启用梭子鱼表格式,然后选择ROW_FORMAT = DYNAMIC。

在配置中:

[mysqld]
innodb_file_per_table = ON
innodb_file_format = Barracuda
innodb_default_row_format = DYNAMIC;

我不知道这些设置是否已在Google Cloud SQL中启用,或者是否允许您更改这些设置。

阅读https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html了解更多信息

同样,DYNAMIC行格式的优点仅适用于可变长度数据类型。如果您有300个固定长度的列(例如CHAR),则无济于事。

顺便说一下,innodb_log_file_size与此有关行大小的错误无关。

答案 1 :(得分:1)

“垂直分区”

具有很多列的表正在推动多个限制;你打了其中一个。有几种合理的解决方法,垂直分区可能是最好的方法,尤其是在TEXT / BLOB中。

具有多个具有相同PRIMARY KEY的表,而不是单个表,只是一个 可能是AUTO_INCREMENT。根据需要将它们JOIN一起收集列。您甚至可以用VIEWs来隐藏拆分表的事实。我建议根据应用程序对列进行分组,并根据需要对这些列进行“合计”。

不要不要跨列显示事物数组;相反,要有另一个具有多行的表来处理重复。例如:地址1,州1,国家1,地址2,州2,国家2。

除真正固定长度的列外,请勿使用CHARBINARY。其中大多数都很短。另外,大多数CHAR列应为CHARACTER SET ascii,而不是utf8。 (请考虑,country_code,邮政编码, md5。)

innodb_log_file_size仅与您的问题间接相关。有什么价值?

直接相关的是innodb_page_size,其默认值为16K,几乎没有人改变过。我希望Cloud Engines禁止对其进行更改。

(我和Bill在一起,希望获得有关您的架构的更多信息-因此我们可以更具体地介绍如何帮助您。)

答案 2 :(得分:0)

为了在Cloud SQL实例上执行您想做的事情,首先运行此命令以设置innodb_strict_mode变量:

SET innodb_strict_mode = 0 ;

之后,您应该可以创建表格了。