共計 5540 個字符,預計需要花費 14 分鐘才能閱讀完成。
本篇內容主要講解“MySQL 5.7 新特性有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“MySQL 5.7 新特性有哪些”吧!
1. 背景
MySQL 5.7 在 2015-10-21 發布了 GA 版本,即 5.7.9,目前小版本已經到了 5.7.12。5.7 新增了許多新的 feature 和優化,接下來一個系列,我們就一起來嘗嘗鮮。首先這次主要是預覽 feature 的變化以及兼容性問題。后面的系列,會針對重要的 feature 展開來學習。
2 安全相關的特性
2.1 認證插件
mysql.user 表中的 plugin 更改成 not null,5.7 開始不再支持 mysql_old_password 的認證插件,推薦全部使用 mysql_native_password。從低版本升級到 5.7 的時候,需要處理兩個兼容性問題。
[兼容性]
需要先遷移 mysql_old_password 的用戶,然后進行 user 表結構的升級:
1. 遷移 mysql_old_password 用戶
MySQL 5.7.2 之前的版本,是根據 password 的 hash value 來判斷使用的認證插件類型,5.7.2 以后的版本,plugin 字段為 not null,就直接根據 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 表結構升級
通過 mysql_upgrade 直接進行升級,步驟如下[5.6- 5.7]:
stop MySQL 5.6 實例
替換 5.7 的 mysqld 二進制版本
使用 5.7 啟動實例
run mysql_upgrade 升級系統表
重啟 MySQL 5.7 實例
2.2 密碼過期
用戶可以通過 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 系統表就可以使用密碼過期新功能。
2.3 賬號鎖定
用戶可以通過以下語法進行賬號鎖定,阻止這個用戶進行登錄:
ALTER USER jeffrey @ localhost ACCOUNT LOCK; ALTER USER jeffrey @ localhost ACCOUNT UNLOCK;
[兼容性]
只需要通過 mysql_upgrade 升級 mysql.user 系統表就可以使用密碼過期新功能。
2.4 SSL 連接
如果 mysqld 編譯使用的 openssl,在啟動的時候,默認創建 SSL,RSA certificate 和 key 文件。
但不管是 openssl 還是 yassl,如果沒有設置 ssl 相關的參數,mysqld 都會在 data directory 里查找 ssl 認證文件,來盡量打開 ssl 特性。
[兼容性]
不存在兼容性的問題
2.5 安裝數據庫
5.7 開始建議用戶使用 mysqld –initialize 來初始化數據庫,放棄之前的 mysql_install_db 的方式,新的方式只創建了一個 root@localhost 的用戶,隨機密碼保存在~/.mysql_secret 文件中,并且賬號是 expired,第一次使用必須 reset password,并且不再創建 test db。
[兼容性]
不存在兼容性的問題
3 sql mode 變更
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 發生變更會導致 sql 的行為不一致。
4. online alter table
支持 online rename index 操作,in_place 并且不需要 table copy。
[兼容性]
不存在兼容性的問題
5. InnoDB 增強
5.1 varchar 長度變更支持 inplace
變更 varchar 類型字段的長度支持 inplace 方法,但有一個限制,即用于表示 varchar 字段長度的字節數不能發生變化,也就是支持比如 varchar 的長度在 255 以下變更或者 255 以上的范圍進行變更,因為從小于 255 變更到大于 255,其 size 的字節需要從 1 個增加到 2 個。
注意:減少 varchar 的長度,仍然需要 table copy。
5.2 優化 InnoDB 臨時表
因為 InnoDB 臨時表的數據不再不受 redo 保護,而 redo 只保護臨時表的元數據,所以大幅提升了臨時表的性能。
并且 InnoDB 臨時表的元數據保存在一個新的系統表中即 innodb_temp_table_info,
臨時表將建立一個統一的表空間,我們稱之為臨時表空間,其目錄地址可以通過參數 innodb_temp_data_file_path 來設置。系統在啟動的時候,都會新建這個表空間,重啟會刪除重建。
例如:
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 臨時表進行了比較大的變動,我們會專門進行一次詳細的介紹。
5.3 InnoDB 原生支持 DATA_GEOMETRY 類型
并且支持在 spatial data types 上建立 index,加速查詢。
5.4 buffer pool dump
buffer pool dump 和 load 支持一個新的參數 innodb_buffer_pool_dump_pct,即 dump 的比例,并且使用 innodb_io_capacity 來控制 load 過程中的 IO 吞吐量。
5.5 多線程 flush dirty
從 5.7.4 開始,innodb_page_cleaners 參數可以設置,支持多線程 flush dirty page,加快臟塊的刷新。
5.6 NVM file system
MySQL 一直使用 double write buffer 來解決一個 page 寫入的 partial write 問題,但在 linux 系統上的 Fusion-io Non-Volatile Memory (NVM) file system 支持原子的寫入。
這樣就可以省略掉 double write buffer 的使用,5.7.4 以后,如果 Fusion-io devices 支持 atomic write,那么 MySQL 自動把 dirty block 直接寫入到數據文件了。這樣減少了一次內存 copy 和 IO 操作。
5.7 InnoDB 分區表
MySQL 5.7 之前的版本,InnoDB 并不支持分區表,分區表的支持是在 ha_partition 引擎上支持的,從 5.7 開始,InnoDB 支持原生的分區表,并且可以使用傳輸表空間。
[兼容性]
mysql_upgrade 會掃描 ha_partition 引擎支持的 InnoDB 表,并升級成 InnoDB 分區表,5.7.9 之后,可以通過命令 ALTER TABLE … UPGRADE PARTITIONING. 進行升級。如果之前的版本大量使用了分區表,要注意使用 mysql_upgrade 會消耗非常長的時間來升級分區表。
5.8 動態調整 buffer pool size
MySQL 5.7.5 之后,可以 online 動態調整 buffer pool size,通過設置動態的參數 innodb_buffer_pool_size 來調整,并且根據 Innodb_buffer_pool_resize_status 狀態來查看 resize 的進度,因為 resize 的過程是以 chunk 為大小,把 pages 從一個內存區域 copy 到另一片內存的。
5.9 加快 recovery
MySQL 5.7.5 之前,在 recovery 的過程中,需要掃描所有的 ibd 文件,獲取元信息,5.7.5 之后,新加了一種 redo log 類型,即 MLOG_FILE_NAME,記錄從上一次 checkpoint 以來,發生過變更的文件,這樣在 recovery 的過程中,只需要打開這些文件就可以了。
[兼容性]
因為增加了新的 log record type,需要安全的關閉 5.7 之前的實例,清理掉 redo。
5.10 表空間管理
支持創建表空間,例如
CREATE TABLESPACE `tablespace_name` ADD DATAFILE file_name.ibd [FILE_BLOCK_SIZE = n]
并可以在創建表的時候,指定屬于哪個表空間,
[兼容性]
因為可以任意指定空間目錄,要注意升級過程中,不要漏掉目錄。
5.11 InnoDB Tablespace Encryption
支持 InnoDB 數據文件加密,其依賴 keyring plugin 來進行秘鑰的管理,后面我們單獨來介紹 InnoDB 加密的方法,并且 RDS 也實現了一種 InnoDB 數據文件透明加密方法,并通過 KMS 系統來管理秘鑰。例如:
create table t(id int) encryption= y
到此,相信大家對“MySQL 5.7 新特性有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!