MySQL中Index column size too large错误场景


点击标题下「蓝色微信名」可快速关注

技术社群的这篇文章《故障分析 | ERROR 1709: Index column size too large 引发的思考》给我们讲解了MySQL数据库中索引列长度的问题,MySQL对索引的长度有限制,如果用惯了Oracle,确实有些不解。

MySQL索引键长度相关的历史文章,

《小白学习MySQL - 索引键长度限制的问题》

1背景

某日同事突然找到我说测试环境中有张表无法访问,SELECT、DML 和 DDL 执行均报错 ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

其实看到 767 这个数字,大家可能会猜想这估计和 compact/redundant
 行格式有关系,后续也确实证实了和这个有点关系。

问题发生了就要想办法处理,当时第一反应是能不能有些“特殊操作”调整一下元数据,但能力有限无法实现。由于是测试环境,数据没那么重要,而且还是单节点,后续处理无非是利用备份重做这套库;若不想重做,而且该表不重要,也可以直接废弃该表,但是 xtrabackup 备份可能会报错。

既然问题一旦发生,只能通过备份恢复来解决,那么我们应该探究一下如何提前避免该问题。

2原因探究

以下为测试环境复现过程:

MySQL 5.6.21 原地升级至 5.7.20

先调整数据库配置文件,以下为简要升级步骤:

shell>/mysql/mysql-5.7.20/bin/mysqld_safe ... &<br>shell>/mysql/mysql-5.7.20/bin/mysql_upgrade ...<br>mysql>shutdown;<br>shell>/mysql/mysql-5.7.20/bin/mysqld_safe ... &<br>