標籤:
轉自:
DBAplus社群
http://www.toutiao.com/m5762164771/
迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上) - 今日頭條(TouTiao.com)
http://toutiao.com/a6300616158581604609/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=4592472790&utm_medium=toutiao_ios
寫在前面
MySQL 5.7版本於2015年10月份左右GA,至今已經大半年了,但作為MySQL DBA的我卻一直沒時間follow它的特性,實在慚愧,以後會花時間來研究5.7版本的特性並針對部分最佳化功能做出壓力測試。
本系列基於5.7.12版本來講述MySQL的新特性,同時也建議大家跟蹤官方blog和文檔(http://dev.mysql.com/doc/refman/5.7/en/),以儘快知悉其新的變化。
MySQL 5.7的目標是成為發布以來最安全的MySQL伺服器,其在SSL/TLS和全面安全開發方面有一些重要的改變。
1、5.7版本的使用者表mysql.user要求plugin欄位非空,且預設值是mysql_native_password,並且不再支援mysql_old_password。
2、增加密碼到期功能
DBA可以設定任何使用者的密碼到期時間,具體詳見官方文檔《密碼到期策略》(http://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html)。
可能大家都有如果業務系統的帳號某一天突然到期了,業務受到影響怎麼辦? 別擔心,可以設定密碼永不到期。
default_password_lifetime=0
3、DBA可以通過對使用者加鎖/解鎖進一步控制其訪問db
例子:
4、SSL特性
MySQL 5.7版本提供了更為簡單的SSL安全訪問配置,並且預設串連就採用SSL的加密方式。細心的朋友在看官方文檔的時候,會注意到安裝步驟中多了一安裝SSL的步驟,具體關於SSL是什麼,請參考《圖解SSL和加密》(http://www.linuxidc.com/Linux/2016-04/130034.htm)。
以下推薦兩篇延伸閱讀,關於SSL特性我相信絕大多數資料庫都沒有開啟,薑承堯文章中的測試案例顯示弱開啟SSL效能開銷在25%左右。大家在嘗試新的特性的時候,根據自己的業務做評估。
《MySQL的SSL加密串連與效能開銷》
《SSL/TLS in MySQL 5.7》
5、使用更安全的初始化方式
逐步廢棄mysql_install_db的安裝方式使用initialize代替(mysql_install_db <5.7.6<= mysqld —initialize) ,使用initialize參數初始化資料庫有如下特性:
只建立一個 root帳號,並且產生一個臨時的標記為到期密碼
不建立其他帳號
不建立test 資料庫
特彆強調與—initialize不同,初始化的時候使用參數。
則會產生一個無密碼的root帳號。更詳細的請移步官方文檔(http://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html)。
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 屬性。
STRICT_TRANS_TABLES 意思是說要儲存的欄位的長度大於欄位定義的大小,直接報錯而非像5.6版本以及之前,截斷資料進行儲存,同時拋出一個warning。注意同一個會話調整 sql_mode必須退出之後在進入sql_mode才會生效。詳細瞭解SQL_MODE請移步《sql_mode官方文檔》(http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html)。注意5.7對於,‘00000000 00:00:00‘ 這類default值的影響。
7、online ddl支援rename index name
個人感覺這個功能比較雞肋,通常改變索引名稱的時候,本身索引的結構需要增刪欄位,建立的索引名稱也要修改合適的名稱。
8、新增內建的full text 外掛程式,支援中文、韓文、日文全文索引
之前的版本,只能依賴單詞之間空格進行分詞,對於依賴於語義分詞而非空格分詞的其他語言種類,5.7版本的引入支援解析中文、韓文、日文的全文索引--ngram full-text parser解決了該問題。具體請移步《ngram Full-Text Parser》(http://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html)。
9、動態修改varchar長度大小
可以通過ALTER TABLE語句以in place方式修改varchar的大小且無需table-copy。但存在限制:表示varchar長度的位元組數不能變化(如果變更前使用1個位元組表示長度,變更後也必須使用1個位元組表示),即只支援0~255內的或者255以上的範圍變更(增大),如果欄位的長度從254增到256時就不能使用in-place演算法,必須使用copy演算法,否則報錯。需要注意的是,減小varchar(N)長度的大小必須使用copy類型,如:
10、暫存資料表效能最佳化
MySQL 5.7對暫存資料表做了極大的改動,提升效能。
通過最佳化CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE語句的執行邏輯,提升暫存資料表的效能(這個是從官網翻譯的,還沒找到除了alter之外的其他資料說明詳細的最佳化過程)。
InnoDB暫存資料表中繼資料不再儲存於InnoDB系統資料表而是儲存在INNODB_TEMP_TABLE_INFO,包含所有使用者和系統建立的暫存資料表資訊。該表在第一次在其上運行select時被建立。
11、新增暫存資料表空間
為所有非壓縮的innodb暫存資料表提供一個獨立的資料表空間,預設的暫存資料表空間檔案為ibtmp1,位於資料目錄。我們可通過innodb_temp_data_file_path參數指定暫存資料表空間的路徑和大小。
MySQL每次重新啟動時,會重新建立暫存資料表空間。
注意:從5.7.5開始,新增一個系統選項internal_tmp_disk_storage_engine可定義磁碟暫存資料表的引擎類型為InnoDB,而在這以前,只能使用MyISAM。而在5.6.3以後新增的參數default_tmp_storage_engine是控制create temporary table建立的暫存資料表的儲存引擎,在以前預設是MEMORY,不要把這二者混淆了。
12、最佳化暫存資料表
從MySQL 5.7.2針對正常和壓縮的臨時及相關對象引入新的"non-redo" undo log,因為暫存資料表在資料庫崩潰後不需要恢複,也就無需redo logs,避免了寫relog相關的io,從而提高了效能。必須指出操作暫存資料表需要undo log用於MySQL運行時的復原、MVCC等。詳見《innodb-temporary-table-undo-logs》(https://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-table-undo-logs.html)。
13、支援新的DATA_GEOMETRY空間類型的資料
InnoDB現在支援MySQL-supported空間資料類型。之前的空間資料是以binary BLOB資料存放區的,現在空間資料類型被映射到了一個InnoDB內部資料類型DATA_GEOMETRY。
14、升級innochecksum
innochecksum--離線的InnoDB檔案校正工具,新增選擇項或擴充的功能,如:
支援使用指定校正演算法;
支援只重寫校正值而不進行驗證;
可指定允許的校正和不匹配量;
顯示各類頁的個數、匯出頁類型資訊、輸出至日誌、從標準輸入讀取資料等;
從5.7.2起可支援校正超過2G的檔案。
詳細的用法參考《innochecksum 官方文檔》(http://dev.mysql.com/doc/refman/5.7/en/innochecksum.html)。
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,提升效能。
更多新特性解析未完待續……敬請期待~
迄今最安全的MySQL?細數5.7那些驚豔與雞肋的新特性(上)【轉載】