本篇內(nèi)容主要講解“MySQL 5.7新特性有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“MySQL 5.7新特性有哪些”吧!
創(chuàng)新互聯(lián)專注于湘潭縣企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),購物商城網(wǎng)站建設(shè)。湘潭縣網(wǎng)站建設(shè)公司,為湘潭縣等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
MySQL 5.7在2015-10-21發(fā)布了GA版本,即5.7.9,目前小版本已經(jīng)到了5.7.12。5.7新增了許多新的feature和優(yōu)化,接下來一個系列,我們就一起來嘗嘗鮮。首先這次主要是預(yù)覽feature的變化以及兼容性問題。后面的系列,會針對重要的feature展開來學(xué)習(xí)。
mysql.user表中的plugin更改成not null,5.7開始不再支持mysql_old_password的認證插件,推薦全部使用mysql_native_password。從低版本升級到5.7的時候,需要處理兩個兼容性問題。
[兼容性]
需要先遷移mysql_old_password的用戶,然后進行user表結(jié)構(gòu)的升級:
1. 遷移mysql_old_password用戶
MySQL 5.7.2之前的版本,是根據(jù)password的hash value來判斷使用的認證插件類型,5.7.2以后的版本,plugin字段為not null,就直接根據(jù)plugin來判斷了。新的密碼從password字段中,保存到新的字段authentication_string中,password字段廢棄處理。
如果user是隱式的mysql_native_password。直接使用sql進行變更:
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41); FLUSH PRIVILEGES;
如果user是隱式的或者顯示的mysql_old_password, 首先通過以下sql進行查詢:
SELECT User, Host, Password FROM mysql.user WHERE (plugin = '' AND LENGTH(Password) = 16) OR plugin = 'mysql_old_password';
如果存在記錄,就表示還有使用mysql_old_password的user,使用以下sql進行用戶的遷移:
ALTER USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password BY 'DBA-chosen-password';
2. user表結(jié)構(gòu)升級
通過mysql_upgrade直接進行升級,步驟如下[5.6->5.7]:
stop MySQL 5.6實例
替換5.7的mysqld二進制版本
使用5.7啟動實例
run mysql_upgrade升級系統(tǒng)表
重啟MySQL 5.7實例
用戶可以通過 ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;這樣的語句來使用戶的密碼過期。
并新增加 default_password_lifetime來表示用戶密碼自動過期時間,從5.7.10開始,其默認值從0變更到了360,也就是默認一年過期。
可以通過以下兩種方法禁止過期:
1. SET GLOBAL default_password_lifetime = 0; 2. ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
[兼容性]
只需要通過mysql_upgrade升級mysql.user系統(tǒng)表就可以使用密碼過期新功能。
用戶可以通過以下語法進行賬號鎖定,阻止這個用戶進行登錄:
ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK; ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;
[兼容性]
只需要通過mysql_upgrade升級mysql.user系統(tǒng)表就可以使用密碼過期新功能。
如果mysqld編譯使用的openssl,在啟動的時候,默認創(chuàng)建SSL, RSA certificate 和 key 文件。
但不管是openssl還是yassl,如果沒有設(shè)置ssl相關(guān)的參數(shù),mysqld都會在data directory里查找ssl認證文件,來盡量打開ssl特性。
[兼容性]
不存在兼容性的問題
5.7開始建議用戶使用 mysqld --initialize來初始化數(shù)據(jù)庫,放棄之前的mysql_install_db的方式,新的方式只創(chuàng)建了一個root@localhost的用戶,隨機密碼保存在~/.mysql_secret文件中,并且賬號是expired,第一次使用必須reset password,并且不再創(chuàng)建test db。
[兼容性]
不存在兼容性的問題
5.7 sql_mode的默認值變更為:
mode_no_engine_substitution | mode_only_full_group_by | mode_strict_trans_tables | mode_no_zero_in_date | mode_no_zero_date | mode_error_for_division_by_zero | mode_no_auto_create_user
而在5.7之前,sql_mode的默認值都只有mode_no_engine_substitution。
所以在5.7默認的情況下,比如grant不存在的用戶的時候,會報一下錯誤:
ERROR 1133 (42000): Can't find any matching row in the user table
必須先使用create user,然后再使用grant user。
[兼容性]
默認sql mode發(fā)生變更會導(dǎo)致sql的行為不一致。
支持online rename index操作, in_place并且不需要table copy。
[兼容性]
不存在兼容性的問題
變更varchar 類型字段的長度支持inplace方法,但有一個限制,即用于表示varchar字段長度的字節(jié)數(shù)不能發(fā)生變化,也就是支持比如varchar的長度在255以下變更或者255以上的范圍進行變更,因為從小于255變更到大于255,其size的字節(jié)需要從1個增加到2個。
注意:減少varchar的長度,仍然需要table copy。
因為InnoDB臨時表的數(shù)據(jù)不再不受redo保護,而redo只保護臨時表的元數(shù)據(jù),所以大幅提升了臨時表的性能。
并且InnoDB臨時表的元數(shù)據(jù)保存在一個新的系統(tǒng)表中即innodb_temp_table_info,
臨時表將建立一個統(tǒng)一的表空間,我們稱之為臨時表空間,其目錄地址可以通過參數(shù)innodb_temp_data_file_path來設(shè)置。系統(tǒng)在啟動的時候,都會新建這個表空間,重啟會刪除重建。
例如:
mysql> show global variables like '%temp_data_file_path%'; +----------------------------+-----------------------+ | Variable_name | Value | +----------------------------+-----------------------+ | innodb_temp_data_file_path | ibtmp1:12M:autoextend | +----------------------------+-----------------------+
并且5.7存儲引擎默認都變更成InnoDB了:
mysql> show global variables like '%storage_engine%'; +----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+--------+
注意: 在開啟gtid的情況下,非auto commit或者顯示begin的context下,create 或者drop 臨時表,仍然和5.6一樣:
ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.
另外, insert into t select * from t也會遇到錯誤,不能在一個sql語句中reference兩次臨時表。
備注: 因為InnoDB臨時表進行了比較大的變動,我們會專門進行一次詳細的介紹。
并且支持在spatial data types上建立index,加速查詢。
buffer pool dump和load支持一個新的參數(shù)innodb_buffer_pool_dump_pct,即dump的比例,并且使用innodb_io_capacity 來控制load過程中的IO吞吐量。
從5.7.4開始,innodb_page_cleaners參數(shù)可以設(shè)置,支持多線程flush dirty page,加快臟塊的刷新。
MySQL 一直使用double write buffer來解決一個page寫入的partial write問題,但在linux系統(tǒng)上的Fusion-io Non-Volatile Memory (NVM) file system支持原子的寫入。
這樣就可以省略掉double write buffer的使用, 5.7.4以后,如果Fusion-io devices支持atomic write,那么MySQL自動把dirty block直接寫入到數(shù)據(jù)文件了。這樣減少了一次內(nèi)存copy和IO操作。
MySQL 5.7之前的版本,InnoDB并不支持分區(qū)表,分區(qū)表的支持是在ha_partition引擎上支持的,從5.7開始,InnoDB支持原生的分區(qū)表,并且可以使用傳輸表空間。
[兼容性]
mysql_upgrade會掃描ha_partition引擎支持的InnoDB表,并升級成InnoDB分區(qū)表,5.7.9之后,可以通過命令A(yù)LTER TABLE … UPGRADE PARTITIONING.進行升級。如果之前的版本大量使用了分區(qū)表,要注意使用mysql_upgrade會消耗非常長的時間來升級分區(qū)表。
MySQL 5.7.5之后,可以online動態(tài)調(diào)整buffer pool size,通過設(shè)置動態(tài)的參數(shù)innodb_buffer_pool_size來調(diào)整,并且根據(jù)Innodb_buffer_pool_resize_status狀態(tài)來查看resize的進度,因為resize的過程是以chunk為大小,把pages從一個內(nèi)存區(qū)域copy到另一片內(nèi)存的。
MySQL 5.7.5之前,在recovery的過程中,需要掃描所有的ibd文件,獲取元信息, 5.7.5之后,新加了一種redo log類型,即MLOG_FILE_NAME, 記錄從上一次checkpoint以來,發(fā)生過變更的文件,這樣在recovery的過程中,只需要打開這些文件就可以了。
[兼容性]
因為增加了新的log record type,需要安全的關(guān)閉5.7之前的實例,清理掉redo。
支持創(chuàng)建表空間,例如
CREATE TABLESPACE `tablespace_name` ADD DATAFILE 'file_name.ibd' [FILE_BLOCK_SIZE = n]
并可以在創(chuàng)建表的時候,指定屬于哪個表空間,
[兼容性]
因為可以任意指定空間目錄,要注意升級過程中,不要漏掉目錄。
支持InnoDB數(shù)據(jù)文件加密,其依賴keyring plugin來進行秘鑰的管理,后面我們單獨來介紹InnoDB加密的方法,并且RDS也實現(xiàn)了一種InnoDB數(shù)據(jù)文件透明加密方法,并通過KMS系統(tǒng)來管理秘鑰。例如:
create table t(id int) encryption='y';
到此,相信大家對“MySQL 5.7新特性有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!