MySQL8 设置大小写敏感

问题描述

今天对我本地的数据库迁移服务器上,完成之后启动项目报错

在这里插入图片描述

说数据库中不存在 quartz_LOCKS 这张表

在这里插入图片描述

我打开服务器上面的数据上面展示的表名是 quartz_LOCKS,然后通过查询 lower_case_table_names 配置可知

show variables like 'lower_case_table_names';

在这里插入图片描述

lower_case_table_names=0,表示 表名区分大小写,且按照用户指定存储

lower_case_table_names 各参数含义:

  • 0:表名区分大小写,且按照用户指定存储
  • 1:表不区分大小写,使用小写存储
  • 2:表不区分大小写,按照用户指定存储

按理说只要将 lower_case_table_names 的值设置为 1 或者 2 就行了

接着我去修改了服务器上 my.cnf (或者 my.ini)文件

在这里插入图片描述

添加以下配置:

[mysqld]  
lower_case_table_names = 1

在这里插入图片描述

接着再重启 mysql

# 重启 mysql
systemctl restart mysqld

在这里插入图片描述

mysql 启动失败


原因分析:

根据提示使用 systemctl status mysqld.service 命令显示 mysqld.service 的状态信息,

在这里插入图片描述

退出状态码为 1,这通常意味着在启动过程中遇到了某种错误,为了确定具体的错误原因,查看更详细的日志

# 查询 mysql 日志
sudo tail -n 100 /var/log/mysqld.log

在这里插入图片描述

从日志上说明 MySQL 服务器启动失败的原因是 lower_case_table_names 的设置不一致。MySQLlower_case_table_names 配置项决定了表名在存储和比较时是否应该转换为小写,这个设置必须在服务器和数据字典之间保持一致,否则服务器将无法正确启动

[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').

指出服务器期望 lower_case_table_names 设置为 1(意味着表名在存储和比较时应转换为小写),但是数据字典(即已有的数据库表元数据)的 lower_case_table_names 设置是 0(意味着表名区分大小写)

mysqld.log 日志文件打印的信息来看,导致 Mysql 启动失败的原因就是因为设置了 lower_case_table_names=1 这个参数,之前在本地使用的 Mysql5.7 版本的,而服务器上面的 Mysql 版本确是 8.0

查看 Mysql 官方文档可知

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.

Mysql-8.0 版本时,lower_case_table_names 变量是一个系统变量,它只能在 MySQL 服务器初始化时设置,并且一旦服务器初始化完成,就不应该再更改这个设置。这是因为在 MySQL 的数据字典和文件系统层面,这个设置影响到了表名和目录名的大小写敏感性和转换规则。如果在服务器运行时改变这个设置,可能会导致数据不一致和其他严重问题


解决方案:

通过分析可知 Mysql8 在初始化之后是不能修改 lower_case_table_names 这个参数的

那要解决这个问题有两种方案,要么就是更改现有的表明,要么就初始化数据库,更改配置

  • 方案一

如果你的表比较少的话,可以通过 RENAME TABLE 语句来更改它们,例如:将 my_table 更新为 MY_TABLE

RENAME TABLE my_table TO MY_TABLE;

但是,如果你有很多表需要更改,这种方法可能会很繁琐

也可以编写一个脚本来查询数据库中的所有表名,并自动为它们生成 RENAME TABLE 语句,然后执行这些语句来更改表名

  • 方案二

初始化数据库,再更改 lower_case_table_names 配置,在初始化数据时,需要清空数据库中所有的数据并恢复到初始状态,所以务必做好数据备份

在初始化数据库时需要先将数据库关闭

# 关闭 mysql
systemctl stop mysqld

Mysql 数据库的数据库存储在 /var/lib/mysql 下,在重新初始化数据库之前,需要删除现有的数据目录

sudo rm -rf /var/lib/mysql

在这里插入图片描述

注意:此操作不可逆,务必做好数据备份

再重新创建一个新的数据目录

sudo mkdir /var/lib/mysql

在这里插入图片描述

授权 Mysql 对于 /var/lib/mysql 目录的所有权

sudo chown -R mysql:mysql /var/lib/mysql

在这里插入图片描述

初始化数据库

sudo mysqld --initialize

在这里插入图片描述

到此为止初始化的步骤已经完成,接着就去修改 /etc/my.cnf 文件中的 lower_case_table_names 配置

在这里插入图片描述

在 /var/log/mysqld.log 这个文件中查找 Mysql 的密码

cat /var/log/mysqld.log

在这里插入图片描述

rtAVCTaNg0*b

再启动 Mysql

# 启动 mysql
systemctl start mysqld

在这里插入图片描述

连接 Mysql

# 连接 MySQL 
mysql -u root -p

在这里插入图片描述

修改 root 密码

ALTER  USER  'root'@'localhost'  IDENTIFIED BY 'password';

在这里插入图片描述

再通过以下命令查看下 lower_case_table_names 的值是否为你所设置的

show variables like 'lower_case_table_names';

在这里插入图片描述

可以看到已经成功修改为 1

  • 24
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值