MySQL 8.0.2 新特性 UNDO表空間管理的靈活性提升

神諭丶發表於2017-09-07
一篇自己翻譯的文章,原文來自MySQL Server官方團隊部落格:
原文連結:http://mysqlserverteam.com/mysql-8-0-2-more-flexible-undo-tablespace-management/

同時也釋出在了老葉茶館:
https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=2653930802&idx=1&sn=db6c9acab8fb41da004f36ff90355258&chksm=bd3b5f588a4cd64e25e1beeac66d6a71beaa2ff0617ea8e46d3af5f9a3aecb4ff744b8d06b26&scene=38#wechat_redirect

在MySQL 8.0.2 DMR版本中,我們將提高InnoDB的UNDO表空間易管理性。

〇 主要有幾點提升:

1、可以隨時自由地建立或刪除UNDO表空間;
2、無論是否需要進行InnoDB恢復,也可以在啟動前更改相關設定;
3、即便InnoDB引擎處於繁忙狀態時,也可以增加或減少UNDO表空間的數量。


innodb_undo_tablespaces:
UNDO表空間包括回滾段,而回滾段又包括UNDO日誌。UNDO日誌用於'回滾'事務和建立MVCC所需要的舊版本資料,以便在一個事務中保證資料庫快照的一致性。

以前,當資料庫初始化時,InnoDB的UNDO表空間的數量是確定的。而現在可以隨時將其值設定為0~127之間的任意值,並可通過啟動時讀取的配置檔案,或者命令列,或者通過線上‘SET GLOBAL INNODB_UNDO_TABLESPACES=n’進行修改。

當UNDO表空間數量設定為0時(不使用獨立UNDO表空間),所有的回滾段將儲存在系統表空間中。這是在 5.6版本之前,無法支援獨立UNDO表空間儲存回滾段情景下的舊模式。我們嘗試通過這種方式儘量不使用系統表空間,所以預設值不會設定為2。在將來的版本中該選項最小值是2,這表明系統表空間將不會被用作任何回滾段。所以請不要在你的配置檔案中設定innodb_undo_tablespaces=0。


〇 innodb_undo_log_truncate:
我們將UNDO表空間的最小值設為2,因為當一個UNDO表空間被清空時,至少還需要有另一個UNDO表空間。InnoDB將在大事務結束後進行UNDO清除操作以收縮UNDO表空間大小。以前,innodb_undo_log_truncate的預設值為OFF,而在8.0.2版本該值預設為ON。



〇 innodb_rollback_segments:
選擇可以隨時設定為1~128之間的任何值。可通過啟動時讀取的配置檔案,或直接在命令列中傳遞引數,或者啟動後線上執行命令‘SET GLOBAL INNODB_ROLLBACK_SEGMENTS=n’。


這個選項曾是用於整個伺服器可以支援的回滾段數。現在為每一個UNDO表空間的回滾段數,允許併發事務使用更多的回滾段數,該選項預設值仍為128。


〇 innodb_undo_logs:
該選項在5.6中作為innodb_rollback_segments的替代或者別名所引入。在InnoDB中術語有一點兒混亂,‘Undo Logs’儲存在回滾段中,這是UNDO表空間的檔案段。在8.0.2版本,我們打算棄用該選項改用Innodb_rollback_segments選項。在最新的釋出的5.7.19版本中將增加這個不建議使用的warnings提示。



〇 UNDO表空間命名和位置:
UNDO表空間位於innodb_undo_directory所指定的目錄中。如果該選項沒有被使用,則放在‘datadir’中。以前,他們被命名為‘undo001’, ‘undo002’。在8.0.2 DMR版本,他們被稱作‘undo_001’, ‘undo_002’等。改名的原因是在新的UNDO表空間中包含了一個新的頭頁面,其對映了每一個回滾段的位置。而在5.6版本中,當使用獨立UNDO表空間時,其回滾段頭頁面號由系統表空間所跟蹤,並且限制整個例項的回滾段數為128。


由於每個UNDO表空間可以使用這個新頁來跟蹤自己的回滾段,這些是真正新的UNDO表空間型別,並需要有不同的命名約定。這也是innodb_rollback_segments現在定義每個UNDO表空間回滾段數量而不是整個MySQL例項數量的原因。


〇 自動升級:
在此更變之前,系統表空間會跟蹤所有回滾段,無論他們位於系統表空間還是UNDO表空間。如果現在在一個使用系統表空間跟蹤回滾段的已經存在了的資料庫上啟動MySQL 8.0.2,將自動生成至少兩個新的UNDO表空間。這將是很正常的,因為innodb_undo_tablespaces之前的預設值為0。MySQL 5.7資料庫將直接通過升級程式,其中包括從舊的FRM檔案建立新的DD。作為此程式的一部分,還將建立至少兩個新的UNDO表空間。已經存在於系統表空間中的回滾段和UNDO表空間,如果尚有未清除的undo log,則它們仍然會被InnoDB識別並使用。但是InnoDB不會將這些老的回滾段分配給任何新的事務。所以一旦UNDO恢復完成,並不再需要這些UNDO日誌,舊的UNDO表空間也將被刪除。



更多好處:
此新特性允許你在資料庫規模增長時,動態地新增更多的UNDO表空間和回滾段。使用更多的UNDO表空間,可以更輕鬆地通過UNDO表空間清除來減少用於存放回滾段的磁碟空間消耗。此外,更多的回滾段意味著併發事務可儘可能的使用單獨的回滾段,以減少相同資源的爭用。



Thanks for using MySQL!


p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px 'Helvetica Neue'}

作者微信公眾號(持續更新)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2144625/,如需轉載,請註明出處,否則將追究法律責任。

相關文章