麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
3383
2023-04-24
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小时内删除侵权内容。