今天利用二进制包安装了一台 MySQL 8.0.23 ,初始化时没提前在 my.cnf 里配置 lower_case_table_names=1。初始化后启动MySQL是正常的啦。想着添加 忽略大小写的 参数进 my.cnf ,添加后启动MySQL,启动不了,查看日志发现有如下报错信息:
[2021/3/18 10:23:27] 2021-03-18T10:23:04.224077+08:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. [2021/3/18 10:23:27] 2021-03-18T10:23:05.274659+08:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. [2021/3/18 10:23:27] 2021-03-18T10:23:05.308562+08:00 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0'). [2021/3/18 10:23:27] 2021-03-18T10:23:05.308950+08:00 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. [2021/3/18 10:23:27] 2021-03-18T10:23:05.309295+08:00 0 [ERROR] [MY-010119] [Server] Aborting [2021/3/18 10:23:27] 2021-03-18T10:23:05.861083+08:00 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL.
既然有问题,那就解决问题。
language先讲解下lower_case_table_names 参数吧。
lower_case_table_names 是 mysql 一个大小写敏感设置的属性,此参数不可以动态修改。
默认值:
-
unix,linux 下 默认值为 0
-
Windows 下默认值是 1
-
Mac OS 下默认值是 2
查看MySQL官方文档:
- 5.7 官方文档:Identifier Case Sensitivity:https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
- 8.0 官方文档:Identifier Case Sensitivity:https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html
MySQL 8.0 Release Notes - Changes in MySQL 8.0.17 (2019-07-22, General Availability) - Functionality Added or Changed有记录:
In MySQL 8.0, the lower_case_table_names variable can only be configured when the MySQL server is initialized.
查看官网 8.0 的文档(5.7.x 无此内容),可以看到:
在 Language Structure - Schema Object Names - Identifier Case Sensitivity 有记录:
lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.
#意思是只能在初始化时指定 lower_case_table_names 参数,初始化之后该参数不允许修改。
针对大小写配置问题,对照 8.0 和 5.7 的文档,你会发现,5.7 版本支持在初始化之后修改 lower_case_table_names 参数,而且还给出了在不同值下创建的数据库的迁移方案。
而到了 8.0,只支持初始化时指定该参数,初始化之后,如果修改了该参数,启动就会报错,因为不允许在初始化之后修改这个值了。
知道 MySQL 的规则就好办了
如果不需要数据迁移:
删除 data 目录下的所有文件,重新初始化并且指定 lower_case_table_names 值。
卸载 MySQL,然后重装,重装之后,在初始化数据库时指定 lower_case_table_names 值。
如果需要数据迁移,大致步骤如下:
先转化数据库名、表名、字段名为想要的大小写,然后导出数据。
用新的lower_case_table_names值重新初始化数据库。
创建新实例,导入之前导出的数据。
指定 lower_case_table_names 的两种方式:
- 在初始化的时候设置 lower_case_table_names=1 才有效,比如:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql --initialize --lower-case-table-names=1
- 初始化前,linux 下修改文件 my.cnf ,在 [mysqld] 配置节点下添加 lower-case-table-names=1