MySQL 8.0新增特性詳解
Mysql8.0的版本歷史
2016-09-12第一個(gè)DM(development milestone)版本8.0.0發(fā)布
2018-04-19第一個(gè)GA(General Availability)版本開始,8.0.11發(fā)布
2018-07-27 下一個(gè)GA版本,8.0.12發(fā)布
2018-10-22 下一個(gè)GA版本,8.0.13發(fā)布
2019-01-21 下一個(gè)GA版本,8.0.14發(fā)布
最新的GA版本為8.0.15,于2019-02-01發(fā)布
最近待GA的版本為8.0.16, 8.0.17,
從中可以看出,大概每1~3個(gè)月一個(gè)版本。
Mysql8.0中新增的特性
事務(wù)性數(shù)據(jù)字典
數(shù)據(jù)字典表以InnoDB表存儲(chǔ)字典數(shù)據(jù),位于mysql數(shù)據(jù)庫(kù)下,對(duì)外不可見(jiàn)。有專門的表空間mysql.idb,位于數(shù)據(jù)目錄下。但是可以通過(guò)informaction_schema下面的一些表來(lái)查詢字典數(shù)據(jù)。
在以前的版本中,字典數(shù)據(jù)以元數(shù)據(jù)文件、非事務(wù)表等來(lái)存儲(chǔ)。現(xiàn)在這些元數(shù)據(jù)文件被刪除了。比如:
.frm, .par, .trn, .isl, .db.opt等都在MySQL8.0中不存在了。
原子DDL
事務(wù)性數(shù)據(jù)字典的引入,使得原子DDL成為可能。作為事務(wù)要不提交,要不回滾。分為表級(jí)和非表級(jí)語(yǔ)句,表級(jí)支持InnoDB。非表級(jí)包括:create, drop等語(yǔ)句。
安全和賬號(hào)管理
Mysql系統(tǒng)數(shù)據(jù)庫(kù)下的權(quán)限表現(xiàn)在都是InnoDB的,以前是MyISAM的,對(duì)于多個(gè)用戶進(jìn)行操作時(shí)會(huì)出現(xiàn)部分成功,部分失敗的情況。現(xiàn)在要不成功,要不rollback。
新的caching_sha2_password認(rèn)證插件作為默認(rèn)的認(rèn)證插件,比mysql_native_password更安全,性能更好。但可能在現(xiàn)網(wǎng)會(huì)出現(xiàn)一個(gè)連接相關(guān)的問(wèn)題。
支持角色(role)
對(duì)于密碼管理更加嚴(yán)格控制,可以維護(hù)密碼歷史信息。啟用密碼重用策略。
資源管理
支持資源組的創(chuàng)建和管理,能將運(yùn)行的線程分配給特定的資源組。
InnoDB增強(qiáng)
自增列方面。現(xiàn)在自增列計(jì)數(shù)器會(huì)在每次值修改時(shí),將值寫到REDO LOG中,并且在CHECKPOINT時(shí)寫到存儲(chǔ)引擎私有的系統(tǒng)表中。這就消除了以往重啟實(shí)例自增列不連續(xù)的問(wèn)題。
當(dāng)索引損壞時(shí),會(huì)把損壞標(biāo)識(shí)寫到redo log。在checkpoint時(shí)會(huì)將內(nèi)存的損壞標(biāo)識(shí)數(shù)據(jù)寫到存儲(chǔ)引擎私有的系統(tǒng)表中。
InnoDB memcached插件支持多個(gè)get操作(在單個(gè)memcached查詢中獲取多個(gè)鍵值對(duì))和范圍查詢。
新的動(dòng)態(tài)變量innodb_deadlock_detect,可以禁用死鎖檢查。在高并發(fā)的系統(tǒng)中,無(wú)數(shù)個(gè)線程等待同一個(gè)鎖,死鎖檢查可能會(huì)引起系統(tǒng)宕機(jī)。有時(shí),禁用死鎖檢查更有效。當(dāng)死鎖發(fā)生時(shí),可以依賴innodb_lock_wait_timeout設(shè)置讓事務(wù)回滾。
新的information_schema.innodb_cached_indexes表可以報(bào)告每個(gè)索引在bufferpool中的索引頁(yè)的數(shù)量。
InnoDB臨時(shí)表現(xiàn)在創(chuàng)建在共享的臨時(shí)表空間中。
支持redo log和undo log的加密
對(duì)于select…for share和select…for update 鎖讀語(yǔ)句,支持nowait和skip locked選項(xiàng)。Nowait表示如果請(qǐng)求的行被去其他事務(wù)鎖住了立即返回。SKIP LOCKED則會(huì)從結(jié)果集中移除上鎖的行。
InnoDB存儲(chǔ)引擎使用MySQL的數(shù)據(jù)字典,而不是用自己的和引擎相關(guān)的數(shù)據(jù)字典。
mysql庫(kù)的系統(tǒng)表和數(shù)據(jù)字典表創(chuàng)建在單獨(dú)的InnoDB表空間中,文件名為mysql.ibd. 以前這些表都是創(chuàng)建在各自的InnoDB表空間中。
字符集支持
默認(rèn)字符集從latin1變成了utf8mb4. ?對(duì)于utf8mb4字符集增加了新的比較規(guī)則,比如utf8mb4_ja_0900_as_cs。
JSON增強(qiáng)
數(shù)據(jù)類型支持
MySQL支持將字符常量或者表達(dá)式作為數(shù)據(jù)類型的默認(rèn)值。包括能將表達(dá)式作為BLOB, TEXT, GEOMETRY, JSON等數(shù)據(jù)類型的默認(rèn)值,這在以前是不可以的。
優(yōu)化器
通用表表達(dá)式
在SELECT等語(yǔ)句前,使用WITH字句來(lái)對(duì)臨時(shí)結(jié)果集進(jìn)行命名。
窗口函數(shù)
MySQL現(xiàn)在支持窗口函數(shù),在一個(gè)查詢中對(duì)每行進(jìn)行計(jì)算。這些函數(shù)包括RANK(), LAG(), NTILE()。另外,有幾個(gè)聚合函數(shù)也能用作窗口函數(shù)。比如SUM(),AVG()。
橫向派生表(Lateral derived tables)
支持正則表達(dá)式
內(nèi)部臨時(shí)表
內(nèi)存內(nèi)部臨時(shí)表,默認(rèn)的存儲(chǔ)引擎從MEMORY變成了TempTable。TempTable對(duì)于VARCHAR和VARBINARY字段存儲(chǔ)更高效。
Internal_tmp_mem_storage_engine:該變量用來(lái)定義內(nèi)存內(nèi)部臨時(shí)表使用哪個(gè)引擎。允許取值有TempTable(默認(rèn))和MEMORY。
Temtable_max_ram: 內(nèi)存內(nèi)部臨時(shí)表超過(guò)這個(gè)值就會(huì)將數(shù)據(jù)存儲(chǔ)到磁盤上。
日志記錄
錯(cuò)誤日志模塊使用MySQL組件架構(gòu)重寫了,使用內(nèi)置的組件來(lái)實(shí)現(xiàn)錯(cuò)誤日志。
另外,還有一個(gè)可加載的JSON日志記錄器。 要控制啟用哪些日志組件,使用 log_error_services 系統(tǒng)變量。
備份鎖
引入了一種新的備份鎖(backup lock),它允許在online備份的時(shí)候進(jìn)行DML操作,同時(shí)可防止快照不一致。備份鎖由lock instance for backup和unlock instance語(yǔ)法支持。使用這些語(yǔ)句需要BACKUP_ADMIN權(quán)限。
原來(lái)的extrabackup等備份軟件是不是應(yīng)該改寫,不要使用flush table with read lock這樣的語(yǔ)句來(lái)上鎖。
當(dāng)有大事務(wù)時(shí),會(huì)hung住,無(wú)法備份。
如果采用lock instance for backup則沒(méi)有問(wèn)題。
復(fù)制增強(qiáng)
支持使用壓縮格式,對(duì)JSON文檔的部分更新記錄binlog,能節(jié)省空間。如果使用的STATEMENT格式的binlog,該功能自動(dòng)開啟,或者通過(guò)binlog_row_value_options系統(tǒng)變量設(shè)為PARTIAL_JASON來(lái)開啟。
連接管理
允許配置一個(gè)專門端口用于管理連接,當(dāng)連接數(shù)打滿時(shí)可以用于連接數(shù)據(jù)庫(kù)進(jìn)行管理。
需要設(shè)置admin_address,默認(rèn)該值為空。
使用的端口默認(rèn)為33062, 由admin_port來(lái)設(shè)置。
該端口的沒(méi)有連接數(shù)的限制。
需要有SERVICE_CONNECTION_ADMIN的權(quán)限
Create_admin_listener_thread系統(tǒng)變量用來(lái)決定是用普通連接的監(jiān)聽(tīng)線程還是采用自己專用的線程。默認(rèn)值為普通監(jiān)聽(tīng)線程。
操作如下:
mysql> show variables like 'admin_%';
+---------------+---------------+
| Variable_name | Value???????? |
+---------------+---------------+
| admin_address | 192.168.1.187 |???????? //這個(gè)IP地址是服務(wù)器的地址,不是客戶端的。一定要設(shè)置這個(gè)變量
| admin_port??? | 33062???????? |
+---------------+---------------+
2 rows in set (0.00 sec)
然后將max_connections調(diào)小,制造連接數(shù)打滿的場(chǎng)景。
mysql> set global max_connections=30;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name?? | Value |
+-----------------+-------+
| max_connections | 30??? |
+-----------------+-------+
1 row in set (0.00 sec)
nohup mysql -h192.168.1.187? -P3306 -uroot -p****** -NBe 'select sleep(2000)' &
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1040 (HY000): Too many connections
此時(shí),發(fā)現(xiàn)還可以用管理端口進(jìn)行連接,并且沒(méi)有數(shù)量限制。
mysql -h192.168.1.187? -P33062 -uroot -p******
插件
以前MySQL的插件可以用C和C++編寫。現(xiàn)在插件使用的MySQL頭文件是c++代碼,意味著現(xiàn)在的插件必須用C++,不能用C編寫。
數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。