MySQL8.0修改lower_case_table_names参数导致重启失败

网友投稿 3882 2023-04-24

MySQL8.0修改lower_case_table_names参数导致重启失败

MySQL8.0修改lower_case_table_names参数导致重启失败

​事件起因:在测试一个数据迁移工具时,源端***19c数据迁移到目标端MySQL8.0,提示迁移目标端  Unknown database 'SBTEST',报错如下:

于是查看了目标端MySQL的Databases:

发现目标端是存在sbtest这个库,但是只能小写访问,继续检查大小写敏感配置

mysql> select @@lower_case_table_names;+--------------------------+| @@lower_case_table_names |+--------------------------+| 0 |+--------------------------+1 row in set (0.00 sec)

可见目标端的MySQL8.0未开启忽略大写的配置,***的对象名称默认是大写,迁移工具迁移时未进行对象名称转小写,导致迁移失败,程序报错 这时的想法那手动改下lower_case_table_names不就行了,于是就有了如下的操作:修改MySQL配置文件:

#my.cnf配置中增加如下配置lower-case-table-names=1

重启我的MySQL8.0 docker容器并查看日志:

咦,居然重启失败并报错,我记得之前MySQL5.7上是可以修改成功的,于是在MySQL5.7上复现了一下该修改操作:

mysql> select @@version,@@default_storage_engine;+------------+--------------------------+| @@version | @@default_storage_engine |+------------+--------------------------+| 5.7.37-log | InnoDB |+------------+--------------------------+1 row in set (0.00 sec)mysql> select @@lower_case_table_names;+--------------------------+| @@lower_case_table_names |+--------------------------+| 0 |+--------------------------+1 row in set (0.00 sec)

配置文件中添加:lower-case-table-names=1后重启MySQL5.7的Docker容器

查看配置生效了:

-- linux未设置默认是0

The default value of this variable is platform-dependent (see lower_case_file_system). On Linux and other Unix-like systems, the default is 0. On Windows the default value is 1. On macOS, the default value is 2. On Linux (and other Unix-like systems), setting the value to 2 is not supported; the server forces the value to 0 instead.

-- 禁止使用与服务器初始化时使用的设置不同的lower_case_table_names启动服务器

-- 在初始化服务器之前,有必要将lower_case_table_names配置为所需的设置

It is therefore necessary to configure lower_case_table_names to the desired setting before initializing the server. In most cases, this requires configuring lower_case_table_names in a MySQL option file before starting the MySQL server for the first time.

原来需要MySQL8.0初始化的时候就需要设置好,并且后续不支持修改。于是我又重新用Docker部署了一个新的MySQL8.0数据库继续测试。

参数说明

lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的。lower_case_table_names=1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写。lower_case_table_names=2 表名存储为给定的大小写,但是比较的时候是小写的 。Unix,Linux下lower_case_table_names默认值为 0 ;Windows下默认值是 1 ;Mac OS X下默认值是 2。

总结

可见我们在使用MySQL8.0前需要根据自己的使用场景评估是否要开启忽略大小写,如果需要开启忽略大小写,初始化前需要把lower-case-table-names=1写入到my.cnf配置文件中,这样才不会影响后续的使用。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅析MySQL模式匹配查询(标准SQL模式匹配和正则模式匹配)
下一篇:我们如何做SQL监控
相关文章