暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

mysql 8.0版本之后的:“巨坑一”

原创 red_hope 2021-05-26
6488

首先,没有什么坑之说,标题嘛,互联网时代,总是要吸引一点眼球,但是如果处置不当或者不及早处置,那就绝对是大问题。
今天说一下:表名称大小写敏感
我们一般知道,如果遇到这个问题,可以在my.cnf设置:

lower_case_table_names=1

但是,笔者在前面升级到8.24的版本后,设置这个参数,数据库启动不来了?

第一步:启动数据库

一开始,没有设置这个参数,启动数据库:

[root@eoms01 ~]# service mysql start
Starting MySQL...... SUCCESS! 
[root@eoms01 ~]# 

起来了,很顺利。

第二步:启动应用

image.png

[See nested exception: java.sql.SQLSyntaxErrorException: Table 'lining.QRTZ_LOCKS' doesn't exist]

报错了,是的,表不存在的报错,要么是表真正不存在,要么就是大小写敏感了。

额外:关于表名大小写敏感

在windows环境下,如果不设置,表名大小写是不敏感的,但是到了linux环境,笔者是redhat 7.6环境,大小写就敏感了。

第三步:解决问题

当然,想到的第一个解决办法,就是在my.cnf配置文件中增加设置来规避:

lower_case_table_names=1

参数设置很容易,准生产,可以随时重启:

[root@eoms01 ~]# service mysql start
Starting MySQL...... SUCCESS! 

[root@eoms01 ~]# service mysql start
Starting MySQL.... ERROR! The server quit without updating PID file (/home/mysql/mysql8024/mysql.pid).
[root@eoms01 ~]#

WHAT?居然启动不起来了,经过参数调整比对,发现就是刚才添加的lower_case_table_names=1参数引发的
同时,查看error.log 日志:

2021-05-26T01:13:55.667317Z 0 [System] [MY-010116] [Server] /home/mysql/mysql8024/bin/mysqld (mysqld 8.0.24) starting as process 40855
2021-05-26T01:13:55.685028Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-05-26T01:13:55.908565Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-05-26T01:13:55.920942Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2021-05-26T01:13:55.921420Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2021-05-26T01:13:55.922394Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-05-26T01:13:56.452869Z 0 [System] [MY-010910] [Server] /home/mysql/mysql8024/bin/mysqld: Shutdown complete (mysqld 8.0.24)  MySQL Community Server - GPL.

提示数据字典无法初始化,看来新版本已经不允许修改了:
Different lower_case_table_names settings for server (‘1’) and data dictionary (‘0’).
2021-05-26T01:13:55.921420Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

看官方怎么说

看一下官方怎么说的:
https://dev.mysql.com/doc/refman/8.0/en/dynindex-sysvar.html
image.png

我们查一下这个文章,对升级还是很有帮助的,只是,一个大版本的升级,我们希望是向下兼容的,另外,完全搞懂一个复杂系统的参数设置,也是相当困难的,因此需要大量测试,以帮助平台规避这些问题:
image.png
这一篇文章的地址是:
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html
原文是英文,有关大小写的兼容性问题,好了,话不多数,查看官方文档,是这样描述的:

Incompatible change: As of MySQL 8.0.11, it is prohibited to start the server with a lower_case_table_names setting that is different from the setting used when the server was initialized. The restriction is necessary because collations used by various data dictionary table fields are based on the lower_case_table_names setting that was defined when the server was initialized, and restarting the server with a different setting would introduce inconsistencies with respect to how identifiers are ordered and compared.

翻译过来:

不兼容的更改:从MySQL 8.0.11开始,禁止lower_case_table_names 使用与初始化服务器时使用的设置不同的设置来启动服务器 。该限制是必要的,因为各种数据字典表字段使用的归类基于lower_case_table_names 初始化服务器时定义的 设置,并且使用其他设置重新启动服务器会导致标识符排序和比较方式的不一致。

也就是说,从MySQL 8.0.11开始,如果数据库已经投产了,再发现这个问题,修改这个参数,已经不可能了,为什么这样?以前可以随时修改的参数,现在不行了。其实仔细想想也是,我们在做数据维护的时候,一些基础配置,例如cdb字符集,虽然提供修改功能,可以强制修改,但是修改后可能会给命中bug留下隐患,与其这样,软件开发商有时候就干脆不让修改了。

更多不兼容的特性,请官方文章中搜索:Incompatible change 查看。
还好在测试阶段,重新初始化也就可以解决了,参考:
https://www.modb.pro/db/59882。

最后修改时间:2021-05-26 10:37:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论