gpt4 book ai didi

MySQL 错误 : Index column size too large. The maximum column size is 767 bytes

转载 作者:行者123 更新时间:2023-12-04 14:59:42 24 4
gpt4 key购买 nike

我通过 AWS 论坛和 Stack Overflow 试图找到以下错误的解决方案,但没有成功:索引列太大。最大列大小为 767 字节

我正在运行一个 WordPress 网站,在 postmeta 表中有 150 万条记录。我最近在 postmeta 表中添加了一个索引,所有测试都正常。但是,今天我的服务器发生了事故(僵尸网络扫描减少了我的 RDS 积分),并重新启动了我的 Lightsail 实例和我的 RDS MySQL 实例。重新启动后,我注意到该站点无法正常工作,并且在进一步调查后发现 postmeta 表返回错误 Index column size too large。最大列大小为 767 字节

我在 MySQL 8.0.20 上运行

表格是:

    Engine = InnoDB  
Charset = utf8mb4
Collation = utf8mb4_0900_ai_ci
Row Format = Compact

许多现有的“解决方案”都在谈论重新创建表格,但我需要表格中当前存在的数据。不幸的是,这个问题出现在我最旧的 AWS RDS 快照中,因此备份似乎不是一个选项。

每次我尝试运行 ALTERSELECT 语句时,我都会遇到同样的错误,索引列大小太大。最大列大小为 767 字节。我试过:

  • 更改 ROWFORMAT=DYNAMIC
  • 将字符集和记录转换为 utf8
  • meta_value 列从 255 更改为 191
  • 删除自定义索引
  • 倾倒 table

我可以看到默认的 ROWFORMAT 现在是“DYNAMIC”,但是这个表在 MySQL 5.7 上运行时仍然是“COMPACT”

我还尝试将 AWS RDS MySQL 从 8.0.20 更新到 8.0.23,但是更新失败,因为它在 PrePatchCompatibility.log 中报告表已损坏。
引用:https://dba.stackexchange.com/questions/234822/mysql-error-seems-unfixable-index-column-size-too-large#answer-283266

还有一些关于修改环境和文件系统,运行“innodb_force_recovery”的其他建议。
https://dba.stackexchange.com/questions/116730/corrupted-innodb-table-mysqlcheck-and-mysqldump-crash-server
但是,作为 RDS 实例,我无权访问实例的这个较低级别。

我怀疑这个问题是列长度和 utf8mb4,但是我的首要任务是从当前表中获取数据。
我也知道将 ROWFORMAT 更改为 DYNAMIC 应该可以解决此问题 - 但是会出现相同的错误。

引用:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

我也尝试过“RDS Export to S3”选项,但没有成功。

请帮忙,我不知道还能尝试什么。

最佳答案

我遇到并解决了同样的问题。情况是这样的。

在旧版 MySQL 表格式中,VARCHAR 或 blob 列上索引的最大大小为 767 字节(不是字符)。这些 wp_somethingmeta WordPress 表具有 VARCHAR(255) 数据类型的键列(如 meta_key)。当 utf8mb4 是字符集时,每个字符最多可以占用 767 个字节中的四个。这意味着必须将索引定义为前缀。元键(191)。

是什么让 MySQL 表成为遗留表?

  1. MyISAM 访问方法,或
  2. 旧版本(5.5,早期 5.6)的 MySQL,仅支持较旧的 InnoDB Antelope ondisk 表格式而不是更新的 Barracuda文件格式,或
  3. InnoDB 和 ROW_FORMAT 是 COMPACT (或 REDUNDANT )。

因此,要摆脱 varchar(255) 列上的前缀索引,表需要是 InnoDB 并使用 DYNAMIC(或 COMPRESSED)ROW_FORMAT。

无需从头开始重建旧表。你可以通过说来转换它

ALTER TABLE whatever ENGINE=InnoDB, ROW_FORMAT=DYNAMIC;

然后您就不会再遇到前缀键 (191) 问题。

在你做这种事情之前备份你的数据库。你知道的。

并且,升级到最新版本的 MySQL 或 MariaDB。严重地。 MySQL 5.6 长期支持于 1-February-2021 结束,越新的版本越好。 (GoDaddy!我在看着你。)

关于MySQL 错误 : Index column size too large. The maximum column size is 767 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67215504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com