一个警告引发的思考 | 小册免费学

339 阅读5分钟

大家好,这篇主要讲的是运行项目的一个警告引发的对于MySQL5.7+和MySQL8.0+的思考。

背景

之前主要在学习MySQL、Spring Framework,现在学习MyBatis,属于ORM框架,其极其重要的作用之一是在数据库(尤其是MySQL)和SpringFramework之间架起了桥梁。对于业务项目来说,MyBatis成功把数据库(比如MySQL)作为一个database class来进行交互,完美地诠释了万物皆可封装成类来交互的愿景。

笔者做电商项目的时候,通过分库分表的方式将数据部署在不同的服务器上,但由于各表之间会有联表的需求,所以就面临着是在服务端进行联表还是在数据库进行。由于数据库极其容易成为瓶颈,因此联表操作是在服务端进行了,这也意味着,对于数据库的操作基本只是简单的单表增删改查,因而用mybatis-generator-maven-plugin插件生成代码。

所以,开始学习MyBatis的时候才惊觉自己对此一窍不通哈哈哈,运行项目的时候,一般警告是没什么影响的,但这次的警告有点意思,一起来看看。

Tue Apr 27 17:42:23 CST 2021 WARN: Establishing SSL connection without 
server's identity verification is not recommended. According to MySQL 
5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be 
established by default if explicit option isn't set. For compliance with 
existing applications not using SSL the verifyServerCertificate property 
is set to 'false'. You need either to explicitly disable SSL by setting 
useSSL=false, or set useSSL=true and provide truststore for server 
certificate verification.

英文不太好的朋友可以看看我的翻译:

没有服务器的身份验证建立来建立SSL连接是不推荐的。在使用MySQL5.5.45+, 5.6.26+ and 5.7.6+的时候如果没有明确设置,默认要求建立SSL连接。为了和现有的没有使用SSL的应用兼容,验证服务器证书属性应该要被设置为false。你要么通过显式设置useSSL=false来使其不可用,要么就设置useSSL=true并且为服务器证书验证提供信任库。

解决方案

在警告中已经明确地告知了你解决方案。

一是设置useSSL=false,因为是练手项目,并没有配置证书,所以在我的项目中就改成如下写法:value="jdbc:mysql:// localhost:3306/mybatis?useSSL=false"

二是设置useSSL=true并且为服务器证书验证提供信任库。

三是换MySQL的版本号,因为笔者的版本8.0.23,如果用的是MySQL5.5.45+, 5.6.26+ and 5.7.6+,则不需要进行设置,因为它会默认建立SSL连接。

延伸

按道理,解决了问题,文章也就该结束了,但这个问题最有价值的是,突然意识到MySQL的版本从5.7突然之间有了个巨大的飞跃,到了8.0版本,感觉就像是华为的Mate10突然就到了Mate20的感觉,这里面必然会有知识可以挖掘,那我们就一起看看吧。

官方Oracle给出的解释如下:

Due to the many new and important features we were introducing in this MySQL version, we decided to start a fresh new series. As the series numbers 6 and 7 had actually been used before by MySQL, we went to 8.0.

哎,上面说的是,序列6和7已经被使用过了?是的,仔细看上面的5.+版本,可以发现有5.6.+和5.7.+版本,并且这一版本添加了许多重要和新的特性,所以就从8.0.+开始了。

那么,添加了什么新的且重要的特性呢?

MySQL8.0.+添加的新特性

1、增加了窗口函数

支持窗口函数是常见的用户请求,那什么是窗口函数呢?窗口函数有点像是SUM()COUNT()那样的聚合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要GROUP BY的。

这些是MySQL支持的窗口函数:COUNT, SUM, AVG, MIN, MAX, BIT_OR, BIT_AND, BIT_XOR, STDDEV_SAMP, 和VAR_SAMP等。有兴趣自己查下哈!

2、支持降序索引

在MySQL8.0.+之前降序索引的实现是通过正序+倒序查询实现。优点一是顺序遍历查找比倒序后退查找要快,优点二是在需要使用ASC/DESC排序时使用索引。

3、提高了可靠性

  • 1、MySQL8.0将其元数据存储到InnoDB中,这是一个经过验证的事务存储引擎。系统表(如用户和权限)以及数据字典表现在驻留在InnoDB中。

  • 2、MySQL8.0消除了一个潜在的不一致来源。由于MySQL采用统一Server层+不同的底层引擎插件的架构模式,在Server层为每个表创建了frm文件,以保存与表定义相关的元数据信息。然而某些引擎(例如InnoDB)本身也会存储元数据,这样不仅产生了元数据冗余,而且由于Server层和引擎层分别各自管理,在执行DDL之类的操作时,很难做到crash-safe,更别说让DDL具备事务性了。为了解决这些问题(尤其是DDL无法做到atomic),从MySQL8.0开始取消了FRM文件及其他server层的元数据文件(frm, par, trn, trg, isl,db.opt),所有的元数据都用InnoDB引擎进行存储, 另外一些诸如权限表之类的系统表也改用InnoDB引擎。

  • 3、MySQL 8.0确保原子崩溃安全DDL。使用此,用户保证将任何DDL语句完全完全执行。这在复制的环境中尤其重要,否则可能存在主从(节点)超出同步的情况,导致数据漂移。

由于真的增加了很多特性,但是平时基本用不到,所以请感兴趣的朋友去看参考链接,里面有更详细的描述。

参考链接:

1、What’s New in MySQL 8.0? (Generally Available)

2、MySQL 8.0 FAQ: General

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情