本文将和大家一起分享下5.7的新特性,不過我們要先從即将被删除的特性以及建議不再使用的特性說起。根據這些情況,我們在新版本及以後的版本中,應該不再使用,避免未來産生相容性問題。
本文是基于MySQL-5.7.7-rc版本,未來可能 還會發生更多變化。
1、即将删除的特性
1.1、InnoDB monitoring features,詳見:WL#7377(通路位址:http://dev.mysql.com/worklog/task/?id=7377,下面的其他WL,可以自行替換)
【建議】可以動态修改 innodb_status_output、innodb_status_output_locks 兩個參數的值列印相關資訊,或者直接檢視INFORMATION_SCHEMA下的相關表。
1.2、old-password,4.1之前的就密碼認證模式已經禁用,old_passwords參數不可用,WL#8006
【建議】盡快更新舊密碼串,同時更新MySQL版本,不要告訴我,你還在用4.1甚至更早的版本。
1.3、部分SQL文法不可用
1.3.1、ALTER TABLE … IGNORE。
1.3.2、INSERT DELAY特性,但保留這個文法。WL#6073
1.3.3、ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE SQL MODES 等幾個SQL MODE合并到STRICT中。不過可能會導緻replication失敗,是以還在考慮中。WL#7467
1.3.4、不再支援YEAR(2),建議盡快更新成YEAR(4)。WL#6263
【建議】盡可能使用标準SQL文法,不再使用MySQL特有的,或者不是那麼嚴格要求的文法,避免以後版本更新遇到更多麻煩。
1.4、一些參數不可用
1.4.1、不再支援一些指令的簡短寫法,必須要求寫全了,例如mysqldump –compr表示 mysqldump –compress,以後必須将整個參數寫完整。WL#6978
1.4.2、删除timed_mutexes。WL#7436
1.4.3、不能再禁用InnoDB引擎,因為系統表也都改成InnoDB了。WL#7976
1.4.4、性能提升有限,删除innodb_use_sys_malloc、innodb_additional_mem_pool_size。WL#7628
1.4.5、意義不大,删除innodb_mirrored_log_groups。WL#6808
1.4.6、已經有新的系統參數代替了,删除innodb_file_io_threads。WL#7149
1.4.7、删除系統參數storage_engine,改用default_storage_engine。WL#7148
1.4.8、删除mysql_upgrade中的–basedir和–datadir系統參數。WL#7010
1.5、一些用戶端工具
mysqlaccess、mysql_convert_table_format、mysql_fix_extensions、mysql_find_rows.sh、mysql_setpermission、msql2mysql、mysqlbug、mysql_zap and mysql_waitpid、mysqlhotcopy将不再使用。
【建議】沒什麼好說的,順應潮流跟上新版本吧,該放棄的就放棄,不要抱殘守缺了,這些工具也基本上都用不上的。
下一期,我們講講5.7中不再建議使用的特性, 也就是未來可能會被删除的特性。
2、預計取消的特性
2.1、用戶端互動協定中,EOF協定包不建議再使用了,建議改成OK協定包。WL#7766
2.2、不建議使用SHOW PROFILE指令,或直接從INFORMATION_SCHEMA.PROFILING中檢視,建議利用PERFORMANCE_SCHEMA中的幾個視圖檢視。WL#6802
2.2、基于DES算法的加解密函數不建議使用, 取而代之的是用基于AES的加解密函數。WL#8126
2.4、同上,還不建議使用ENCODE()/DECODE()函數。WL#6984
2.5、采用ALTER USER來為使用者修改密碼,不建議再使用SET PASSWORD修改密碼。WL#6409
2.6、和InnoDB相關的4個系統參數innodb_large_prefix、innodb_file_format、innodb_file_format_check、innodb_file_format_max不再建議使用。WL#7703
2.7、不再建議在EXPLAIN後面加上EXTENDED/PARTITIONS關鍵字。WL#7027
2.8、不再建議使用collation_database、character_set_database系統參數。WL#2.11
2.9、不再建議使用sync_frm系統參數。WL#8216
2.10、不再建議使用@@session.gtid_executed系統變量。WL#7518
本文是基于MySQL-5.7.7-rc版本,未來可能 還會發生更多變化。本節開始講5.7版本中的新特性。
1、安全性
a. 使用者表 mysql.user 的 plugin字段不允許為空, 預設值是 mysql_native_password,而不是 mysql_old_password,不再支援舊密碼格式;
b. 增加密碼過期機制,過期後需要修改密碼,否則可能會被禁用,或者進入沙箱模式;
c. 使用 mysql_install_db 初始化時,預設會自動生成随機密碼,并且不建立除 root@localhost 外的其他賬号,也不建立 test 庫;
【新特性實踐】
執行 mysql_install_db 進行新執行個體初始化:
可以看到提示 mysql_install_db 已經不再推薦使用了,建議改成 mysqld –initialize 完成執行個體初始化。
改成 mysqld –initialize 後,如果 datadir 指向的目标目錄下已經有資料檔案,則會有類似提示:
是以,需要先確定 datadir 目标目錄下是空的,避免誤操作破壞已有資料。
另外,在初始化時如果加上 –initial-insecure,則會建立空密碼的 root@localhost 賬号,否則會建立帶密碼的 root@localhost 賬号,密碼直接寫在 log-error 日志檔案中(在5.6版本中是放在 ~/.mysql_secret 檔案裡,更加隐蔽,不熟悉的話可能會無所适從)
初始化完畢後,如果沒使用新版本的用戶端登入,還會報告類似下面的錯誤:
上面的錯誤提示意思是需要用目前版本的用戶端登入,因為新使用者登入後需要立刻修改密碼,否則無法繼續後續的工作:
修改完密碼後,就可以繼續使用舊版本的用戶端工具了。
1、SQL MODE變化
a. 預設啟用 STRICT_TRANS_TABLES 模式;
b. 對 ONLY_FULL_GROUP_BY 模式實作了更複雜的特性支援,并且也被預設啟用;
c. 其他被預設啟用的sql mode還有 NO_ENGINE_SUBSTITUTION;
【iMySQL建議】
對廣大MySQL使用者而言,以往不是那麼嚴格的模式還是很友善的,在5.7版本下可能會覺得略為不适,慢慢習慣吧。比如向一個20字元長度的VARCHAR列寫入30個字元,在以前會自動截斷并給個提示告警,而在5.7版本下,則直接抛出錯誤了。個人認為這倒是一個好的做法,避免各種奇葩的寫法。
因為 uname 字段的長度為 40 個字元。
2、優化online操作,例如修改buffer pool、修改索引名(非主鍵)、修改REPLICATION FILTER、修改MASTER而無需關閉SLAVE線程 等衆多特性。
可以線上修改buffer pool對DBA來說實在太友善了,執行個體運作過程中可以動态調整,避免事先配置設定不合理的情況,不過 innodb_buffer_pool_instances 不能修改,而且在 innodb_buffer_pool_instances 大于 1 時,也不能将 buffer pool 調整到 1GB 以内,需要稍加注意。
如果是加大buffer pool,其過程大緻是:
如果是縮減buffer pool,其過程則大緻是:
實際測試時,發現線上修改 buffer poo 的代價并不大,SQL指令送出完畢後都是瞬間完成,而背景程序的耗時也并不太久。在一個并發128線程跑tpcc壓測的環境中,将 buffer pool 從32G擴充到48G,背景線程耗時 3秒,而從 48G 縮減回 32G 則耗時 18秒,期間壓測的事務未發生任何鎖等待。
再來看下線上修改非主鍵索引名,直接用 ALTER TABLE RENAME INDEX 文法即可。
例如下面的SQL文法:
可以看到,幾乎瞬間完成,盡管我在執行這個SQL時正跑着64個并發tpcc壓測。
1、支援多源複制(Multi-source replication),這對采用分庫分表的同學絕對是個超級重磅福音。可以把多個MASTER的資料歸并到一個執行個體上, 有助于提高SLAVE伺服器的使用率。不過如果是同一個表的話,會存在主鍵和唯一索引沖突的風險,需要提前做好規劃。
MySQL 5.7的多源複制采用多通道的模式,例如用以下方法可以建立多個複制通道,将多個MASTER上的資料複制到同一個SLAVE節點中去:
其他和複制相關的SQL指令和以往也基本一樣,隻需在加上 FOR CHANNEL ‘CHANNEL-NAME’ 子句即可。
此外,還支援線上修改replication filter規則,不過不是太建議使用filter規則,是以不重點介紹了。執行下面的SQL指令可以完成filter規則修改:
2、支援多線程複制(Multi-Threaded Slaves, 簡稱MTS),在5.6版本中實作了SCHEMA級别的并行複制,不過意義不大,因為我們線上大部分執行個體的讀寫壓力基本集中在某幾個資料表,基本無助于緩解複制延遲問題。倒是MariaDB的多線程并行複制大放異彩,有不少人因為這個特性選擇MariaDB(比如我也是其一,呵呵)。
MySQL 5.7 MTS支援兩種模式,一種是和5.6一樣,另一種則是基于binlog group commit實作的多線程複制,也就是MASTER上同時送出的binlog在SLAVE端也可以同時被apply,實作并行複制。關于MTS的更多詳細介紹可以檢視姜承堯的分享 MySQL 5.7 并行複制實作原理與調優,我這裡就不重複說了。
值得一提的是,經過對比測試,5.7采用新的并行複制後,仍然會存在一定程度的延遲,隻不過相比5.6版本減少了86%,相比MariaDB的并行複制延遲也小不少。
發表回複
自動判斷底層I/O裝置是否可以支援原子IO(AIO),檢測到的話,會自動關閉 double write buffer,進一步提升性能。
支援 innodb_page_cleaners 選項可設定多個page cleaner線程提高髒頁重新整理效率。
可通過設定 innodb_undo_log_truncate 等選項自動删除不用的 undo log。
加強InnoDB read-only模式的性能。
支援一個表上有多個觸發器,這樣一來,原先已有觸發器表也可以支援用 pt-osc 了。
新增 log_syslog 選項,可将MySQL日志列印到系統日志檔案中。
InnoDB和MyISAM引擎的分區表也支援ICP特性。
支援對線上某個連接配接直接檢視執行計劃,比如 EXPLAIN FOR CONNECTION 1024。
支援線上(INPLACE)增加 VARCHAR 列的長度。不過 0-255 長度是一個區間,256 以上是另一個區間,不能跨越255這個坎,比如把長度從 100 擴充成 1000(因為 255 長度以内額外用1個位元組表示,大于 255 長度則需要額外2個位元組表示)。另外還不支援線上縮小 VARCHAR 的長度。
以及更多關于性能上的改善提升,包括用戶端連接配接效率提升、批量資料加載效率提升、sort buffer中存儲的非排序字段是壓縮模式的(提高記憶體使用率)、UNION ALL不再産生臨時表、解析器重構、查詢優化器進一步完善(比如增加可控CBO規則)等等。
以上内容出自http://imysql.com,感覺葉老師的分享!
相關的參考資料:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=205236417&idx=1&sn=15281c834348911cea106478aa819175&3rd=MzA3MDU4NTYzMw==&scene=6#rd
http://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html#mysql-nutshell-removals