--背景知识:
MySQL8.0 新增了data dictionary的概念,数据初始化的时候在linux下默认使用lower-case-table-names=0的参数,数据库启动的时候读取的my.cnf文件中的值。若二者值不一致则在mysql的错误日志中记录报错信息。
在MySQL 5.7之前则允许数据库初始化和启动的值不一致且以启动值为准。
在MySQL 官方提供的RPM包中默认是使用lower-case-table-names=0,不太适合生产环境部署。在生产环境建议使用官方的二进制包。
--官方解释:
After initialization, is is not allowed to change this setting.So "lower_case_table_names" needs to be set together with --initialize .
--解决办法:
在mysql数据库初始化的时候指定不区分大小写,在数据库实例启动的时候也要指定不区分大小写。即数据库初始化时lower_case_table_names的值和数据库启动时的值需要一样。
在实际开发生产的应用中多是不区分大小写的即lower-case-table-names=1。
--操作步骤:
/usr/local/mysql/bin/mysqld --user=mysql --lower-case-table-names=1 --initialize-insecure --basedir=/usr/local/mysql --datadir=/data/mysql/node1
my.cnf
[mysqld]
lower_case_table_names = 1
[root@localhost system]# find / -name mysqld.service
/sys/fs/cgroup/systemd/system.slice/mysqld.service
/etc/systemd/system/multi-user.target.wants/mysqld.service
/usr/lib/systemd/system/mysqld.service
2、比较粗暴的方法
mysql8的大小写敏感配置比较坑,根据官方文档可以发现,该配置只能在数据库初始化之前配置。之后添加该配置会导致mysql服务无法启动。
如果这个操作是初始化数据库之后,也就是安装后运行过服务,那就可能会出错。
错误类似于Job for mysqld.service failed because the control process exited with error...
然后就无法启动 mysql 服务了,除非打开 vim /etc/my.cnf把追加的lower_case_table_names=1删除掉。
将数据库下所有数据保存备份,如果你不在意数据的话直接删除数据
1 停止MySQL
systemctl stop mysqld.service
2 删除 MySQL的数据
rm -rf /var/lib/mysql
3 修改/etc/my.cnf
vi /etc/my.cnf
增加
[mysqld]
#1表示不区分大小写,0区分大小写
lower_case_table_names = 1
4 启动 mysql
systemctl daemon-reload
systemctl restart mysqld.service
在重新初始化之后所有账号数据都会被重置,这里需要查看重新初始化的root账户登陆密码:
查看临时密码grep "A temporary password" /var/log/mysqld.log
登陆mysql修改账户信息即可!
重启mysql 出现问题 查看 /var/log/mysql.log日志