MySQL 8.0 版本 lower_case_table_names 参数踩坑记

今天利用二进制包安装了一台 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官方文档:

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 的两种方式:

  1. 在初始化的时候设置 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
  1. 初始化前,linux 下修改文件 my.cnf ,在 [mysqld] 配置节点下添加 lower-case-table-names=1

猜你喜欢

转载自blog.51cto.com/5924778/2673853