MySQL区分大小写参数配置
一、背景简述
在云环境中,我们经常会遇到以下几个场景:
1、MySQL5.7及以下修改区分大小写参数,导致大写表无法识别,影响业务对表/库的操作,间接导致备份失败;
2、MySQL8.0修改区分大小写参数,导致MySQL服务器无法启动。
lower_case_table_names 值
◆ 0 表名存储为给定的大小;比较是区分大小写的
◆ 1 表名存储在磁盘是小写的;比较的时候是不区分大小写
◆ 2 表名存储为给定的大小写;比较的时候是小写的
注:Unix、Linux下lower_case_table_names默认值为0;Windows下默认值是1;Mac OS X下默认是2
二、MySQL区分大小写配置
2.1 MySQL5.7及以下版本
(1)异常分析
让我们先来回答背景中的第一个问题,假设MySQL默认是区分大小写的,即小写的表a与大写的表A是完全不同的两个表。那么为了区分表a与表A,两张表的元数据信息肯定是不同的!!!换句话来说,如果表a与表A的元数据完全相同,那么MySQL靠什么去识别或者区分a与A呢?所以当你去直接修改lower_case_table_names参数的时候,不会报错a表与A表冲突。
进一步思考,不难发现,既然表a与表A的识别元数据不同,如果我们把区分大小写改成不区分大小写,会出现什么问题呢?没错,表a可以被MySQL识别,当MySQL读取表A的时候,会报错表不存在!!!
(2)解决方案
先补充一个知识点:MySQL区分大小写lower_case_table_names参数是一个静态参数,即必须修改配置文件,重启才能生效。那么为了保证我的业务库从区分大小写修改成不区分大小写 后,业务能够稳定运行,需要该怎么做呢?我想你肯定想到了,既然在区分大小写的模式下,a表与A表元数据识别是不同的,那么我把她修改成不区分大小写模式下,MySQL能够识别的不就行了?答案是:对的。
所以,如果你想将区分大小写修改成不区分大小写,必须先将所有大写表或库名全部修改成小写,然后再更改lower_case_table_names参数,即可完美解决问题!!!当然上述案例中的,需要将大A修改成小a之外的任何不重复的字符串即可,因为小a已经存在了。
[mysqld] lower_case_table_names=1
2.2 MySQL8.0版本
(1)MySQL8.0修改lower_case_table_names
云业务环境中,我们经常会遇到用户直接按照MySQL5.7及以下的方法修改已经完成初始化的MySQL8.0的lower_case_table_names参数,最终导致云数据库启动失败!!!下面就让我们一起来谈讨分析一下~
(2)异常分析
通过对官网文档的翻阅,不难发现MySQL8.0安装初始化之后是不支持更改lower_case_table_names参数的,官网介绍是:In MySQL 8.0, the lower_case_table_names variable can only be configured when the MySQL server is initialized.
官网参考链接:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html
(3)解决方案
解决方案:在初始化的时候就要配置好lower_case_table_names这个变量的值!!!这样初始化完成后,lower_case_table_names值就是你定义的默认值!!!
[mysqld] lower_case_table_names=1
注:如上述初始化之前,固化配置文件lower_case_table_names参数值!!!
作者:UStarGao
链接:https://www.starcto.com/mysql/256.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UCloud云平台推荐
随便看看
- 2021-07-11了解UK8S原理与单节点测试环境部署
- 2021-01-23MySQL YUM安装教程
- 2021-08-09MongoDB副本集搭建教程
- 2021-04-24Zabbix-Server实现监控主机服务器
- 2021-03-20Docker应用程序数据管理与持久化