暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

MySQL 8.0 版本 lower_case_table_names 参数踩坑记

8443

今天利用二进制包安装了一台 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 的两种方式:

  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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论