问题描述
今天对我本地的数据库迁移服务器上,完成之后启动项目报错
说数据库中不存在 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 systemctl restart mysqld
原因分析:
根据提示使用 systemctl status mysqld.service
命令显示 mysqld.service
的状态信息,
退出状态码为 1
,这通常意味着在启动过程中遇到了某种错误,为了确定具体的错误原因,查看更详细的日志
# 查询 mysql 日志 sudo tail -n 100 /var/log/mysqld.log
从日志上说明 MySQL
服务器启动失败的原因是 lower_case_table_names
的设置不一致。MySQL
的 lower_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
这个参数,之前在本地使用的 Mysql
是 5.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
语句,然后执行这些语句来更改表名
方案二
卸载现有的MYSQL 再通过lnmp脚本安装.
卸载方式
lnmp环境单独卸载 msyql https://luoweihua.cn/1091.html
安装
1. 在安装脚本中先更改配置文件. 找到安装脚本:
/root/lnmp2.1/include/mysql.sh
2. 在my.cnf配置文件的Mysqld配置里添加
lower_case_table_names=1
注意: 这里有好几处,都添加一遍
3. 执行安装命令
cd /root/lnmp2.1/ ./install.sh db
# 连接 MySQL mysql -u root -p
5. 再通过以下命令查看下lower_case_table_names 的值是否为你所设置的
show variables like 'lower_case_table_names';