Mysql因为索引的column超过767bytes导致无法索引的情况

最近在安装gitlab的时候,使用mysql作后端,进行数据库初始化的时候发现

Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.

经过多方寻找,发现根本原因在于mysql的innodb引擎有一些限制,如果非要使用mysql作为gitlab的后端,需要进行一些额外配置。
注意,官方的说法是建议使用 Postgresq 作为gitlab的后端

如果一定要用mysql,需要进行如下配置

  1. 修改mysql的全局变量
    mysql> SET storage_engine=INNODB;
    如果你的mysql < 5.7.7,并且希望使用utf8mb4字符集,需要运行如下
    mysql> SET GLOBAL innodb_file_per_table=1, innodb_file_format=Barracuda, innodb_large_prefix=1;
  2. 将上述的变量修改放到${mysql}/my.cnf中,注意增加如下内容
    innodb_file_per_table=1
    innodb_file_format=Barracuda
    innodb_large_prefix=1

注意上述方法有时不一定奏效,这个时候需要将表的数据替换成utf8mb4

使用命令:
mysql> SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` ROW_FORMAT=DYNAMIC;') AS 'Copy & run these SQL statements:' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="gitlabhq_production" AND TABLE_TYPE="BASE TABLE" AND ROW_FORMAT!="Dynamic";
把所有row_format修改为Dynamic

接着依次执行

1 mysql> SET foreign_key_checks = 0;

2 mysql> SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS 'Copy & run these SQL statements:' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="gitlabhq_production" AND TABLE_COLLATION != "utf8mb4_general_ci" AND TABLE_TYPE="BASE TABLE";

3 mysql > SET foreign_key_checks = 1;

一般的,如果设定到指定row_format=dynamic,这个时候就不会报Index column size too large的错误。
相似的问题设定,请以这个处理方法为参考。

!!!!!!数据宝贵,谨慎操作

参考文献

官方手册《MySQL setup guide》 https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/database_mysql.md

猜你喜欢

转载自blog.csdn.net/zjx923759789/article/details/83020696