2020年1月13日,MySQL官方发布了今年的第一个8.0版本-8.0.19,自2018年4月19日发布第一个稳定版本8.0.11到如今已经历了近两年共9个小版本的迭代,产品稳定性持续增强。极具吸引力的是官方在8.0版本上对MGR bug 的持续修复和功能完善,以及对数据库整体性能的提升,使得不少企业在生产开始使用8.0版本。对于银行业而言,虽然基本上还是采用其上一个版本-5.7,但研究、测试并使用8.0势在必行。
相较5.7,MySQL8.0至今新增特性将近300个,本文对其中几个重大特性进行详细说明,方便读者更迅速地了解MySQL8.0 。预计阅读完本篇文章大约5分钟。
下面将以下重点新特性展开介绍:
- 哈希连接(Hash Join)
- 克隆插件 (Clone Plugin)
- 在JSON函数中使用多值索引(JSON functions using multi-valued indexes)
- MySQL shell (管理MGR的MySQL客户端 )
- Innodb Cluster (来自官方的MGR产品解决方案)
- MGR 在复制上的提升
- 其他新特性列举
1
哈希连接(Hash Join)
MySQL中表连接一直以来只支持block-nested loop 算法,这一窘境在最新的8.0.18版本支持了期望已久的Hash Join,对与多表连接中连接字段没有索引的场景下特别适合。这样再也不担心被驱动表连接字段忘记加索引导致线上SQL拖垮整个系统了。
目前MySQL对Hash Join支持的条件如下:
1. 每个连接当中,至少有一个等值连接条件;
2. 在笛卡尔积场景下没有等值条件也会用上hash join。
可以global 或者 session 对系统变量optimizer switch中hash join = on/off 进行控制(在8.0.19这个小版本已经弃用)。
通过join_buffer_size可以调整hash连接表是否在内存或者落盘实现,这对整个速度会有比较大的影响。
下面是在MySQL8.0中是否启用hash_join场景下SQL执行的变化。
2
克隆插件(Clone Plugin)
从8.0.17 官方引入了一个重量级功能克隆插件,可以对当前实例进行数据克隆到本地或者远程。这是官方提供的原生的物理备份功能,其原理类似Percona公司的物理备份工具Xtrabackup。这对于数据库运维将是极大的解放,增加从库或者MGR添加节点只需要执行几条命令就可以了。对于自动化平台的开发降低难度,将不再关心搭建从库的细节。
- 本地数据克隆,生成在指定目录下:
- 远程数据克隆,数据源实例被称为Recipient ,数据接收实例被称为Donor。
- 数据远程克隆主要流程:
- Init阶段: 开启备份锁,阻止DDL操作。
- File Copy :对数据文件进行copy,copy文件前开启page tracking功能,记录此时checkpoint的LSN作为起始LSN。
- Page Copy :在数据文件copy完成后,开始redo 归档获取当前checkpoint的LSN,同时停掉page copy。page copy 时会将开始拷贝数据文件之后所有page的修改的page发送到Donor。
- Redo Copy :停掉redo 归档,把所有日志传到Donor端获取Binlog的GTID信息。
- Done。
- 克隆数据目前的一些限制:
- 在clone过程中会block DDL操作。
- 作为Donor数据接收者数据库版本必须一致。
- clone不能复制配置文件。
- 目前只支持innodb表,sys库用其他引擎的表将不会被复制。
- 需要重启节点,并不保证任何情况下可以重启。
3
在JSON函数中使用多值索引
(JSON functions using multi-valued indexes)
在MySQL8.0.17新版本开始支持json数组多值索引。正如名字表示对文档属性支持多个值创建索引,极大增强MySQL的NoSQL特性。根据官方资料,多值索引属于函数索引在引擎层通过虚拟列实现的。这个新特性可以使用在mongodb之类的文档数据库,可以考虑使用MySQL存储文档型数据,减少技术学习成本。
4
MySQLshell (管理MGR的MySQL客户端 )
mysql-shell 是MySQL官方提供的一个高级MySQL客户端。提供了类似MySQL的函数,兼容 js 和 python 脚本。X DevAPI 提供了同时操作关系型和文档型数据。Admin API 则提供了管理MGR 集群工具,加节点和获取集群信息只需要几条命令即可完成。最重要的是当我们从5.7升级8.0 的时候可以使用mysql-shell提供的升级检查工具 util.checkForServerUpgrade() 进行升级检查,这样我们很容易的知道目前5.7里哪些是8.0不兼容的。方便升级前处理好不兼容的问题,使我们平滑升级到8.0。
5
Innodb Cluster(来自官方的MGR产品解决方案)
InnoDB Cluster 是 把MGR /mysql-shell /mysql-router 三个组件集成在一起,MGR 解决了高可用,mysql-shell 解决了集群配置管理,mysql-router作为failover 接入层。这是一套MySQL官方提供的原生高可用管理解决方案。下面是InnoDB Cluster 整体架构图。
- 其中最重要的是MGR提供了基于强一致协议的节点数据同步和故障转移。
- mysql-router 轻量级中间件,提供应用程序的连接可用节点实现故障转移。
- mysql-shell 可以通过 Admin API 来配置管理InnodbCluster 。
6
MGR在复制上的提升
- 组复制引入了大量消息碎片层,增强了Paxos 引擎单线程消息传递至内核XCom,在高并发大消息时线程忙于处理消息而延迟参与故障检测导致增加故障检测器的误报几率。
- XCom的消息缓存可通过参数调整,增强更大的消息负载。
- 组复制节点由于网络瞬断时节点自动再加入集群。
- 新增可替换二进制日志密钥的SQL命令,可以不停机替换binlog加密密钥。
- binlog将能携带分区表更改元数据。
- 引入克隆组件,增强了节点自动恢复,极大方便了MGR节点增加。
7
其他新特性列举
- 重构SQL分析器 (SQLParaser)
- 行锁增加SKIP LOCKED 和 NOWAIT特性选项
- 新增事务CATS特性 (Michigan大学提供)
- 在线修改undo log 数量
- 直方图 histogram
- 认证插件由sha256password改成caching_sha2_password
- 新增角色role功能,将权限打包分组二次授权
- 消除了buffer pool mutex (Percona的贡献)
- 倒序索引
- 不可见索引(在不确定索引是否可以删除前,可以用不可见索引特性测试,避免“搞事情”)
- 数据字典全部采用InnoDB引擎储存,支持DDL原子性,crash safe, metadata 管理更完善
- 快速在线加新列(腾讯互娱DBA团队贡献)
- 并行redo log, 并提供redo log的I/O性能。可在线调整redo log buffer
- redo日志归档
- 新增倒序索引,不可见索引, 函数索引
- 支持会话级别SET_VAR动态调整部分参数
- 自增列持久化
- 增强JSON性能,功能
- 增加redo/undo log加密
- 增加resource group功能
- 默认字符集改成了utf8mb4(连接字符集,表字符集)
- 通用表达式CTE
- 窗口函数
- SET PERSIST 持久化设置的参数
- Writeset 并行(relay log 阶段可以合并事务做到高效回放)
- restart功能 (配合clone plugin)
- 取消QC
- 备份锁(lock instance for backup)
- Mysql8.0引入一个管理端口:admin_port默认33062
总结
MySQL 8.0 新特性我只列举一些比较重要的,要是想了解更多可以参考官方文档。从上面文章可以了解到mysql8.0已经几乎是一个全新的版本,新特性增加了很多,也遗弃很多功能和参数。这对于管理员和开发人员来讲都需要一些时间成本来了解。mysql8.0 小版本GA已经有9个小版本,处于比较稳定的状态了,尤其是对于MGR的增强也是越来越完善。正如大家知道的金融行业数据一致性的要求是各个行业最高的,所以MGR的强一致的特性是极具吸引力的。