原作者: 阿裡雲進階技術專家 冷香
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 鎖阻塞的可能性。