最近在安装gitlab的时候,使用mysql作后端,进行数据库初始化的时候发现
Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.
经过多方寻找,发现根本原因在于mysql的innodb引擎有一些限制,如果非要使用mysql作为gitlab的后端,需要进行一些额外配置。
注意,官方的说法是建议使用 Postgresq 作为gitlab的后端
如果一定要用mysql,需要进行如下配置
- 修改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;
- 将上述的变量修改放到
${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