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

问题描述 投票:-1回答:3

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

创建一个包含300列的表时,我收到以下错误。

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

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

我尝试创建一个表,其中一些列的组合作为文本类型,其他一些作为blob类型,但它不起作用。即使修改innodb_log_file_size也是不可能的,因为Google Cloud-SQL平台不允许这样做。

innodb google-cloud-sql mysql-5.7
3个回答
1
投票

“垂直分区”

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

而不是一个表,有多个表具有相同的PRIMARY KEY,除了一个可能是AUTO_INCREMENTJOIN他们在一起根据需要收集列。你甚至可以让VIEWs隐藏你拆分桌子的事实。我建议根据应用程序通过一些逻辑分组对列进行分组,以及“一起”需要哪些列。

不要在列之间展示一系列事物;相反,让另一个表有多行来处理重复。示例:address1,state1,country1,address2,state2,country2。

除真正的固定长度列外,不要使用CHARBINARY。大多数都很短。此外,大多数CHAR列应该是CHARACTER SET ascii,而不是utf8。 (想想,country_code,zipcode, md5。)

innodb_log_file_size只与您的问题间接相关。它的价值是什么?

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

(我希望Bill能够获得有关您的架构的更多信息 - 所以我们可以更具体地说明如何帮助您。)


1
投票

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

像VARCHAR,VARBINARY,BLOB和TEXT这样的可变长度列可以更长,因为超出行大小限制的数据可以存储在额外的页面上。要利用此功能,必须启用Barracuda表格式,然后选择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与关于行大小的错误无关。


0
投票

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

SET innodb_strict_mode = 0 ;

之后你应该能够创建你的表。

© www.soinside.com 2019 - 2024. All rights reserved.