目录
场景:
线上项目支持的过程中遇到mysql库表结构和数据由A库迁移到B库上提示Specified key was too long; max key length is 767 bytes报错,第一次遇到特此记录一下。
说明:
源库和目标库的版本一样。
从源库中导出单个一个表结构
注:直接在目标库中创建提示报错Specified key was too long; max key length is 767 bytes然而将primary key('seq_code','seq_key')去掉就创建成功了,因此定位到主键这里报错了
疑问:
mysql版本一样,相同的表结构为什么在源库中能创建,而在目标库中无法创建呢??
解决:
网上搜了Mysql InnoDB引擎表的索引,默认索引键前缀限制为767字节,当你建的索引长度为varchar类型时候,使用默认的varchar(255),而你的编码又字符集又是utf8mb4,4*255 > 767,显然太大,所以报错。
解决办法:
1.可以设置为:767/4大小以内;
2.可以调整 启用innodb_large_prefix,加大索引键长度限制。
验证:
show variables like '%innodb_large_prefix
源库的innodb_large_prefix变量的开关是启用的,而目标库的开关是关闭的,将目标库该属性设置成ON即可,由于是线上环境,执行无权限,让有权限的人设置一下即可。
set GLOBAL innodb_large_prefix = 'ON'