【问题标题】:How to overcome Row size too large (> 8126) error on Google-Cloud MySQL5.7 Second Generation如何克服 Google-Cloud MySQL 5.7 第二代上的 Row size too large (> 8126) 错误
【发布时间】:2019-01-12 03:45:52
【问题描述】:

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

创建包含 300 列的表时出现以下错误。

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

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

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

【问题讨论】:

  • 您尚未共享表定义或有关表用途的任何信息。缺少任何特定信息,我会假设您的 300 列表未正确规范化。遵循database normalization的原则,不要做300列的表。
  • @BillKarwin 感谢您的快速回答。但这里要求保持数据为非规范化形式并基于它创建表。

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


【解决方案1】:

“垂直分区”

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

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

不要不要跨列展开一系列事物;相反,请使用另一个包含多行的表来处理重复。示例:address1、state1、country1、address2、state2、country2。

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

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

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

(我同意 Bill 的意见,希望了解有关您的架构的更多信息——因此我们可以更具体地了解如何为您提供帮助。)

【讨论】:

  • 感谢您的宝贵建议。我跟着这个,它对我有用。我创建了两个表并在每个表中定义了主键,方法是首先创建源位置的所有列值的 HASH,并在两个表中使用该 HashString 来匹配两个表中的行。
【解决方案2】:

你在这里没有太多选择。 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 与这个关于行大小的错误无关。

【讨论】:

  • innodb_file_format 和 innodb_default_row_format 选项在 GCP 上不可用
【解决方案3】:

为了在 Cloud SQL 实例上做你想做的事,首先运行这个来设置 innodb_strict_mode 变量:

SET innodb_strict_mode = 0 ;

之后你应该可以创建你的表了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2022-01-04
    • 2017-04-05
    • 2022-09-29
    • 2018-09-16
    • 2013-08-09
    相关资源
    最近更新 更多