天天看點

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

<b></b>

寫在前面

mysql 5.7版本于2015年10月份左右ga,至今已經大半年了,但作為mysql dba的我卻一直沒時間follow它的特性,實在慚愧,以後會花時間來研究5.7版本的特性并針對部分優化功能做出壓力測試。

本系列基于5.7.12版本來講述mysql的新特性,同時也建議大家跟蹤官方blog和文檔,以盡快知悉其新的變化。

mysql 5.7的目标是成為釋出以來最安全的mysql伺服器,其在ssl/tls和全面安全開發方面有一些重要的改變。

1、5.7版本的使用者表mysql.user要求plugin字段非空,且預設值是mysql_native_password,并且不再支援mysql_old_password。

2、增加密碼過期功能

dba可以設定任何使用者的密碼過期時間,具體詳見官方文檔《密碼過期政策》(

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

可能大家都有如果業務系統的賬号某一天突然過期了,業務受到影響怎麼辦? 别擔心,可以設定密碼永不過期。

default_password_lifetime=0

3、dba可以通過對使用者加鎖/解鎖進一步控制其通路db

例子:

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

4、ssl特性

mysql 5.7版本提供了更為簡單的ssl安全通路配置,并且預設連接配接就采用ssl的加密方式。細心的朋友在看官方文檔的時候,會注意到安裝步驟中多了一安裝ssl的步驟,具體關于ssl是什麼,請參考《圖解ssl和加密》

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

以下推薦兩篇延伸閱讀,關于ssl特性我相信絕大多數資料庫都沒有開啟,姜承堯文章中的測試案例顯示弱開啟ssl性能開銷在25%左右。大家在嘗試新的特性的時候,根據自己的業務做評估。

《mysql的ssl加密連接配接與性能開銷》

《ssl/tls in mysql 5.7》

5、使用更安全的初始化方式

逐漸廢棄mysql_install_db的安裝方式使用initialize代替(mysql_install_db &lt;5.7.6&lt;= mysqld  —initialize) ,使用initialize參數初始化資料庫有如下特性:

隻建立一個 root賬号,并且生成一個臨時的标記為過期密碼

不建立其他賬号

不建立test 資料庫

特别強調與—initialize不同,初始化的時候使用參數。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

則會生成一個無密碼的root賬号。

6、sql_mode的變化

官方文檔上表述,5.7 版本預設的sql_mode="only_full_group_by, strict_trans_tables, no_zero_in_date, no_zero_date, error_for_division_by_zero, no_auto_create_user, and no_engine_substitution" 。而實際上我自己的測試環境中預設添加了strict_trans_tables 屬性。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

strict_trans_tables 意思是說要存儲的字段的長度大于字段定義的大小,直接報錯而非像5.6版本以及之前,截斷資料進行存儲,同時抛出一個warning。注意同一個會話調整 sql_mode必須退出之後在進入sql_mode才會生效。詳細了解sql_mode請移步《sql_mode官方文檔》。注意5.7對于null,'00000000 00:00:00' 這類default值的影響。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

7、online ddl支援rename index name

個人感覺這個功能比較雞肋,通常改變索引名稱的時候,本身索引的結構需要增删字段,建立的索引名稱也要修改合适的名稱。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

8、新增内置的full text 插件,支援中文、韓文、日文全文索引

之前的版本,隻能依賴單詞之間空格進行分詞,對于依賴于語義分詞而非空格分詞的其他語言種類,5.7版本的引入支援解析中文、韓文、日文的全文索引--ngram full-text parser解決了該問題。具體請移步《ngram full-text parser》。

9、動态修改varchar長度大小

可以通過alter table語句以in place方式修改varchar的大小且無需table-copy。但存在限制:表示varchar長度的位元組數不能變化(如果變更前使用1個位元組表示長度,變更後也必須使用1個位元組表示),即隻支援0~255内的或者255以上的範圍變更(增大),如果字段的長度從254增到256時就不能使用in-place算法,必須使用copy算法,否則報錯。需要注意的是,減小varchar(n)長度的大小必須使用copy類型,如:

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

10、臨時表性能優化

mysql 5.7對臨時表做了極大的改動,提升性能。

通過優化create table, drop table, truncate table,和alter table語句的執行邏輯,提升臨時表的性能(這個是從官網翻譯的,還沒找到除了alter之外的其他資料說明詳細的優化過程)。

innodb臨時表中繼資料不再存儲于innodb系統表而是存儲在innodb_temp_table_info,包含所有使用者和系統建立的臨時表資訊。該表在第一次在其上運作select時被建立。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

11、新增臨時表空間

為所有非壓縮的innodb臨時表提供一個獨立的表空間,預設的臨時表空間檔案為ibtmp1,位于資料目錄。我們可通過innodb_temp_data_file_path參數指定臨時表空間的路徑和大小。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

mysql每次重新啟動時,會重新建立臨時表空間。

注意:從5.7.5開始,新增一個系統選項internal_tmp_disk_storage_engine可定義磁盤臨時表的引擎類型為innodb,而在這以前,隻能使用myisam。而在5.6.3以後新增的參數default_tmp_storage_engine是控制create temporary table建立的臨時表的存儲引擎,在以前預設是memory,不要把這二者混淆了。

迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)

12、優化臨時表

從mysql 5.7.2針對正常和壓縮的臨時及相關對象引入新的"non-redo" undo log,因為臨時表在資料庫崩潰後不需要恢複,也就無需redo logs,避免了寫relog相關的io,進而提高了性能。必須指出操作臨時表需要undo log用于mysql運作時的復原、mvcc等。

13、支援新的data_geometry空間類型的資料

innodb現在支援mysql-supported空間資料類型。之前的空間資料是以binary blob資料存儲的,現在空間資料類型被映射到了一個innodb内部資料類型data_geometry。

14、更新innochecksum

innochecksum--離線的innodb檔案校驗工具,新增選擇項或擴充的功能,如:

支援使用指定校驗算法;

支援隻重寫校驗值而不進行驗證;

可指定允許的校驗和不比對量;

顯示各類頁的個數、導出頁類型資訊、輸出至日志、從标準輸入讀取資料等;

從5.7.2起可支援校驗超過2g的檔案。

15、online ddl語句重建普通表和分區表

optimize table、alter table … force、alter table … engine=innodb等ddl操作使用inplace算法,減少了重建時間和對應用的影響。

16、針對fusion-io nvm檔案系統的優化

linux系統中fusion-io non-volatile memory (nvm)檔案系統提供了原子寫能力,使innodb的doublewrite變得備援。是以,mysql5.7.4以後,如果fusion-io裝置支援原子寫, mysql系統會自動關閉doublewrite,減少io,提升性能。

更多新特性解析未完待續……敬請期待~

作者介紹  楊奇龍

前阿裡資料庫團隊資深dba,主要負責淘寶業務線,經曆多次雙十一,有海量業務通路db架構設計經驗。

目前就職于有贊科技,負責資料庫運維工作,熟悉mysql性能優化,故障診斷,性能壓測。

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-06-27</b>