原作者: 阿里云高级技术专家 冷香
MySQL 8.0 简介
MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL,全新的版本升级策略,安全和账号管理加强,InnoDB 功能增强等,目前小版本已经 release 到 8.0.16,新的功能仍然在持续推出。
RDS MySQL 8.0 产品是阿里云推出的 MySQL 系列云产品之一,使用完全兼容 MySQL 8.0 的阿里云 AliSQL 8.0 分支,除了官方在 MySQL 8.0 推出的全新功能外,AliSQL 沉淀了许多在 Alibaba 集团电商业务和云上几十万客户在使用 MySQL 过程中遇到的问题和需求,以此来加固AliSQL, 提升 AliSQL 的性能和稳定性。
下面分别对 MySQL 8.0 和 AliSQL 8.0 相关的版本和功能做简短的介绍:
MySQL 8.0 版本更新
- 数据字典
MySQL 8.0 摒弃了 Server Layer 定义的 FRM 文件和其它非事务表,使用了一组 InnoDB 表来保存数据字典,支持事务特性。 - Atomic DDL
在 Data Dictionary 支持事务特性的基础上,8.0 增加了一个 DDL log 字典表,用来协调在 DDL 过程中,对数据字典,文件系统 和 事务系统的修改,做到原子性。
- 升级
从 8.0.16 开始,对于系统表的修改,抛弃了 mysql_upgrade工具,使用在系统重启的时候,进行升级。 - 安全和账号管理
账号方面,从 8.0 开始,支持 role 对权限进行便捷管理,以及新增多个系统权限,分别对应新增了 ROLE_EDGES,GLOBAL_GRANTS 两个系统表;mysql schema 下的涉及权限和用户相关的表更改成 InnoDB 引擎,支持事务特性,保证了账号管理语句的原子性。
认证方面,caching_sha2_password 作为默认的认证 plugin,以提升安全,但要注意并不能和 8.0 之前的client进行兼容。
链路加密,如果编译了OpenSSL 1.1.1 及以上,MySQL 8.0 SSL 将支持到 TLSv1.3 版本。
系统账号,在 8.0.16 新增 SYSTEM_USER 权限,用于区分 系统账号还是普通账户,可以对用户进行分类管理。
- Auto increment 持久化
在 InnoDB 引擎中,新增了一个引擎私有的系统表 innodb_dynamic_metadata,自增值就保存在这个表里,在对每张表进行修改 auto increment 值的时候,都使用 redo log 进行保护,在做 checkpoint 的时候,持久化到这个系统表中,保证下次重启后,auto increment 能够从持久化中恢复出来,并且不受事务上下文回滚而影响。
- 死锁检测
在高并发的情况下,InnoDB 引擎中对于事务锁的死锁检测,将是影响性能 scale 的重要因素,8.0 后提供了一个参数 innodb_deadlock_detect,用来打开或者关闭引擎的死锁检测,在业务能够明确相关风险的情况下,关闭死锁检测,能大幅提升并发能力。 - 临时表
在 InnoDB 引擎中,用户创建的临时表将统一到 ibtmp 文件的临时表空间中; 对于系统运行过程中产生内存临时表,8.0后启用了新的 TempTable 引擎,支持 blob 字段,功能上优于 memory engine。 - Lock
SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 新增了 NOWAIT 和 SKIP LOCKED 语法,减少长时间和非必要的阻塞。 - Instant add column
InnoDB 解决了长期困扰 DBA 的加字段要 copy 整张表数据的问题。现在可以快速的增加字段,只修改数据字典,而不用修改表中的记录本身。 - 并行查询
InnoDB 目前支持在 clustered index 上进行并行查询,提供 innodb_parallel_read_threads 参数控制session内的并行度。 - Redo优化
Redo的写入一直是 InnoDB 高并发情况下的瓶颈,8.0 开始:
1)用户线程可以并发的copy redo 日志到 log buffer中
2)用户线程可以以更松散的方式把 dirty block 加入到脏块链表中
3)独立的写线程完成 redo 的持久化
- Json加强
在Json上,8.0 增加了更多的功能性,详见 MySQL 8.0 的 document。 - Partial update on lob
InnoDB 继续优化 partial update on lob data,对于仅仅修改很少字节的 lob 字段,能够大幅减少 undo data,并提升效率。 - 优化器和对象相关
1)支持 invisible index,方便用户和 DBA 调试 statement。
2)descending indexes,提升降序扫描的效率。
3)Common table expressions,支持 with 语法完成。
4)Window functions,增加大量窗口函数
5)Regular expression,重新设计了正则表达式的支持。
AliSQL 8.0 功能介绍
除了 MySQL 8.0 官方的特性以外,AliSQL 8.0 在新功能,性能提升,稳定性保证,可诊断性上做了大量的改进:
- 诊断
Top SQL:
AliSQL 在 statement 级别上,增加了新的性能诊断指标,方便更快更准确的量化 SQL 的开销:
Include three categories:
1) CPU: Elapsed time, CPU time
2) LOCK: Server MDL lock time, Storage transaction lock time.
Mutex conflict(only for debug mode)
RWLOCK conflict(demonstrate the block/index->lock conflict)
3) IO: DATA File read and time
DATA File write and time
Log File write and time
Logical read, Physical read, Physical async read.
效果如下所示:
表和索引统计
新增表和索引级别的统计:
InnoDB IO 统计
- Sequence
AliSQL 8.0 增加对 Sequence 对象的支持,方便和高效的获取单调唯一值:
SYNTAX:
CREATE SEQUENCE SYNTAX:
CREATE SEQUENCE [IF NOT EXISTS] schema.seq
[START WITH <constant>]
[MINVALUE <constant>]
[MAXVALUE <constant>]
[INCREMENT BY <constant>]
[CACHE <constant> | NOCACHE]
[CYCLE | NOCYCLE]
;
SHOW SYNTAX:
SHOW CREATE SEQUENCE schema.seq;
QUERY SYNTAX:
SELECT [nextval | currval | *] FROM seq;
SELECT nextval(seq),currval(seq);
SELECT seq.currval, seq.nextval from dual;
- 大文件异步删除
InnoDB 大文件删除带来稳定性开销,所以 AliSQL 8.0 提供了异步删数据文件的机制:
参数设置:
INNODB_DATA_FILE_PURGE: Whether enable the async purge strategy
INNODB_DATA_FILE_PURGE_IMMEDIATE: Unlink data file rather than truncate
INNODB_DATA_FILE_PURGE_ALL_AT_SHUTDOWN: Cleanup all when normal shutdown
INNODB_DATA_FILE_PURGE_DIR: Temporary file directory
INNODB_DATA_FILE_PURGE_INTERVAL: Purge time interval (by milliseconds)
INNODB_DATA_FILE_PURGE_MAX_SIZE: Purge max size every time (by MB)
INNODB_PRINT_DATA_FILE_PURGE_PROCESS: Print the process of file purge worker
展示临时文件列表:
mysql> select * from innodb_purge_files;
+--------+---------------------+---------------+---------------+------------------------+--------------+
| log_id | start_time | original_path | original_size | temporary_path | current_size |
+--------+---------------------+---------------+---------------+------------------------+--------------+
| 36 | 2019-05-14 23:06:38 | ./test/t.ibd | 37748736 | purge/#FP_1557846107_1 | 20971520 |
+--------+---------------------+---------------+---------------+-----------------------+--------------+
- 隐含主键
AliSQL 针对用户没有建 PK 的表,默认添加一个隐含主键,以加速 slave 端的 SQL apply。
查看方法:
mysql> set show_ipk_info=on;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` int(11) DEFAULT NULL,
`__#alibaba_rds_row_id#__` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Implicit Primary Key by RDS',
KEY `__#alibaba_rds_row_id#__` (`__#alibaba_rds_row_id#__`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
- 事务超时
AliSQL 新增 kill_idle_transaction_timeout 参数,以便对超时的事务连接进行 kill,防止事务长时间未提交带来的系统风险。 - Rotate slow log
AliSQL 8.0 针对 slow log 收集过程中,对用户实例的影响,以及truncate带来的阻塞可能,提供了rotate slow log table的功能,影响更小,更快捷,并保证零数据丢失的收集方式。
set session rotate_log_table = on;
flush slow logs;
mysql> show variables like '%rotate_log_table%';
+----------------------------+---------------------------------+
| Variable_name | Value |
+----------------------------+---------------------------------+
| rotate_log_table | ON |
| rotate_log_table_last_name | ./mysql/slow_log_1556373907.CSV |
+----------------------------+---------------------------------+
- 审计日志
AliSQL 8.0 重新设计的 audit log 模块,提供了四种刷新策略,分别是:
ASYNCHRONOUS: Log asynchronously. Wait for space in the output buffer
PERFORMANCE: Log asynchronously. Drop requests for which there is
insufficient space in the output buffer
SEMISYNCHRONOUS: Log synchronously. Permit caching by the operating system
SYNCHRONOUS: Log synchronously. Call sync() after each request
提供适合不同业务模式的 audit log 配置供用户选择。
- 安全特性
AliSQL 针对 SSL 链路,静态编译了OpenSSL 1.0 版本,目前支持到 TLSv1.2 版本。 - 优化
AliSQL 针对 semi sync 和 MDL 进行了性能优化,提升了 semi sync 的性能,大幅减少了 MDL 锁阻塞的可能性。