1. MySQL8.0的版本歷史
2016-09-12第一個DM(development milestone)版本8.0.0發布
2018-04-19第一個GA(General Availability)版本開始,8.0.11發布
2018-07-27 下一個GA版本,8.0.12發布
2018-10-22 下一個GA版本,8.0.13發布
2019-01-21 下一個GA版本,8.0.14發布
最新的GA版本為8.0.15,於2019-02-01發布
最近待GA的版本為8.0.16, 8.0.17,
從中可以看出,大概每1~3個月一個版本。
2. MySQL8.0中新增的特性
事務性數據字典
數據字典表以InnoDB表存儲字典數據,位於mysql數據庫下,對外不可見。有專門的表空間mysql.idb,位於數據目錄下。但是可以通過informaction_schema下面的一些表來查詢字典數據。
在以前的版本中,字典數據以元數據文件、非事務表等來存儲。現在這些元數據文件被刪除了。比如:
.frm, .par, .trn, .isl, .db.opt等都在MySQL8.0中不存在了。
原子DDL
事務性數據字典的引入,使得原子DDL成為可能。作為事務要不提交,要不回滾。分為表級和非表級語句,表級支持InnoDB。非表級包括:create, drop等語句。
安全和賬號管理
Mysql系統數據庫下的權限表現在都是InnoDB的,以前是MyISAM的,對於多個用戶進行操作時會出現部分成功,部分失敗的情況。現在要不成功,要不rollback。
新的caching_sha2_password認證插件作為默認的認證插件,比mysql_native_password更安全,性能更好。但可能在現網會出現一個連接相關的問題。
支持角色(role)
對於密碼管理更加嚴格控制,可以維護密碼歷史信息。啟用密碼重用策略。
資源管理
支持資源組的創建和管理,能將運行的線程分配給特定的資源組。
InnoDB增強
自增列方面。現在自增列計數器會在每次值修改時,將值寫到REDO LOG中,並且在CHECKPOINT時寫到存儲引擎私有的系統表中。這就消除了以往重啟實例自增列不連續的問題。
當索引損壞時,會把損壞標識寫到redo log。在checkpoint時會將內存的損壞標識數據寫到存儲引擎私有的系統表中。
InnoDB memcached插件支持多個get操作(在單個memcached查詢中獲取多個鍵值對)和范圍查詢。
新的動態變量innodb_deadlock_detect,可以禁用死鎖檢查。在高並發的系統中,無數個線程等待同一個鎖,死鎖檢查可能會引起系統宕機。有時,禁用死鎖檢查更有效。當死鎖發生時,可以依賴innodb_lock_wait_timeout設置讓事務回滾。
新的information_schema.innodb_cached_indexes表可以報告每個索引在bufferpool中的索引頁的數量。
InnoDB臨時表現在創建在共享的臨時表空間中。
支持redo log和undo log的加密
對於select…for share和select…for update 鎖讀語句,支持nowait和skip locked選項。Nowait表示如果請求的行被去其他事務鎖住了立即返回。SKIP LOCKED則會從結果集中移除上鎖的行。
InnoDB存儲引擎使用MySQL的數據字典,而不是用自己的和引擎相關的數據字典。
mysql庫的系統表和數據字典表創建在單獨的InnoDB表空間中,文件名為mysql.ibd. 以前這些表都是創建在各自的InnoDB表空間中。
字符集支持
默認字符集從latin1變成了utf8mb4. 對於utf8mb4字符集增加了新的比較規則,比如utf8mb4_ja_0900_as_cs。
JSON增強
數據類型支持
MySQL支持將字符常量或者表達式作為數據類型的默認值。包括能將表達式作為BLOB, TEXT, GEOMETRY, JSON等數據類型的默認值,這在以前是不可以的。
優化器
通用表表達式
在SELECT等語句前,使用WITH字句來對臨時結果集進行命名。
窗口函數
MySQL現在支持窗口函數,在一個查詢中對每行進行計算。這些函數包括RANK(), LAG(), NTILE()。另外,有幾個聚合函數也能用作窗口函數。比如SUM(),AVG()。
橫向派生表(Lateral derived tables)
支持正則表達式
內部臨時表
內存內部臨時表,默認的存儲引擎從MEMORY變成了TempTable。TempTable對於VARCHAR和VARBINARY字段存儲更高效。
Internal_tmp_mem_storage_engine:該變量用來定義內存內部臨時表使用哪個引擎。允許取值有TempTable(默認)和MEMORY。
Temtable_max_ram: 內存內部臨時表超過這個值就會將數據存儲到磁盤上。
日志記錄
錯誤日志模塊使用MySQL組件架構重寫了,使用內置的組件來實現錯誤日志。
另外,還有一個可加載的JSON日志記錄器。 要控制啟用哪些日志組件,使用 log_error_services 系統變量。
備份鎖
引入了一種新的備份鎖(backup lock),它允許在online備份的時候進行DML操作,同時可防止快照不一致。備份鎖由lock instance for backup和unlock instance語法支持。使用這些語句需要BACKUP_ADMIN權限。
原來的extrabackup等備份軟件是不是應該改寫,不要使用flush table with read lock這樣的語句來上鎖。
當有大事務時,會hung住,無法備份。
如果采用lock instance for backup則沒有問題。
復制增強
支持使用壓縮格式,對JSON文檔的部分更新記錄binlog,能節省空間。如果使用的STATEMENT格式的binlog,該功能自動開啟,或者通過binlog_row_value_options系統變量設為PARTIAL_JASON來開啟。
連接管理
允許配置一個專門端口用於管理連接,當連接數打滿時可以用於連接數據庫進行管理。
需要設置admin_address,默認該值為空。
使用的端口默認為33062, 由admin_port來設置。
該端口的沒有連接數的限制。
需要有SERVICE_CONNECTION_ADMIN的權限
Create_admin_listener_thread系統變量用來決定是用普通連接的監聽線程還是采用自己專用的線程。默認值為普通監聽線程。
操作如下:
1 mysql> show variables like 'admin_%'; 2 3 +---------------+---------------+ 4 5 | Variable_name | Value | 6 7 +---------------+---------------+ 8 9 | admin_address | 192.168.1.187 | //這個IP地址是服務器的地址,不是客戶端的。一定要設置這個變量 10 11 | admin_port | 33062 | 12 13 +---------------+---------------+ 14 15 2 rows in set (0.00 sec)
然后將max_connections調小,制造連接數打滿的場景。
1 mysql> set global max_connections=30; 2 3 Query OK, 0 rows affected (0.00 sec) 4 5 mysql> show variables like 'max_connections'; 6 7 +-----------------+-------+ 8 9 | Variable_name | Value | 10 11 +-----------------+-------+ 12 13 | max_connections | 30 | 14 15 +-----------------+-------+ 16 17 1 row in set (0.00 sec) 18 19 nohup mysql -h192.168.1.187 -P3306 -uroot -p****** -NBe 'select sleep(2000)' & 20 21 mysql: [Warning] Using a password on the command line interface can be insecure. 22 23 ERROR 1040 (HY000): Too many connections
此時,發現還可以用管理端口進行連接,並且沒有數量限制。
mysql -h192.168.1.187 -P33062 -uroot -p******
插件
以前MySQL的插件可以用C和C++編寫。現在插件使用的MySQL頭文件是c++代碼,意味着現在的插件必須用C++,不能用C編寫。
HDC.Cloud 華為開發者大會2020 即將於2020年2月11日-12日在深圳舉辦,是一線開發者學習實踐鯤鵬通用計算、昇騰AI計算、數據庫、區塊鏈、雲原生、5G等ICT開放能力的最佳舞台。
歡迎報名參會(https://www.huaweicloud.com/HDC.Cloud.html?utm_source=&utm_medium=&utm_campaign=&utm_content=techcommunity)