MySQL8.0 Undo Tablespace管理詳解
1. UNDO 基礎概念
- 默認至少初始化2個Undo表空間,最大支持127個Undo表空間,默認表空間名稱為undo_001,undo_002
- 8.0.14 之后UNDO表空間支持在線增加,及在線刪除
CREATE UNDO TABLESPACE/DROP UNDO TABLESPACE- 不支持指定相對路徑,只支持絕對路徑,且必須是
innodb_directories參數(shù)定義可識別的路徑或默認的數(shù)據(jù)目錄下 - 動態(tài)創(chuàng)建的undo表空間必須以.ibu結尾
- 不支持指定相對路徑,只支持絕對路徑,且必須是
- 8.0.23 之前Undo表空間初始大小依賴
innodb_page_size的值配置,默認16K,初始文件大小為10M,8.0.23 之后Undo表空間初始大小為16M,默認擴展大小單位為16M
2. UNDO 相關參數(shù)
2.1 參數(shù)含義
show variables like '%undo%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | innodb_max_undo_log_size | 8589934592 | | innodb_undo_directory | ./ | | innodb_undo_log_encrypt | OFF | | innodb_undo_log_truncate | ON | | innodb_undo_tablespaces | 2 | +--------------------------+------------+ show variables like '%truncate%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | innodb_purge_rseg_truncate_frequency | 128 | | innodb_undo_log_truncate | ON | +--------------------------------------+-------+ show variables like '%segment%'; +-------------------------------+-----------+ | Variable_name | Value | +-------------------------------+-----------+ | innodb_rollback_segments | 128 | | innodb_segment_reserve_factor | 12.500000 | +-------------------------------+-----------+ innodb_undo_log_truncate -- 控制是否自動做UNDO的truncate收縮操作,默認為ON,只有為ON時,下面2個參數(shù)才生效 innodb_max_undo_log_size -- 控制UNDO做truncate收縮操作的閾值,當UNDO達到該值時才出發(fā)收縮操作 innodb_purge_rseg_truncate_frequency -- Batch UNDO清理的次數(shù),默認最大值128,也就是128次后才會觸發(fā)一次UNDO的truncate,而每次清理的undo page由innodb_purge_batch_size參數(shù)決定,innodb_purge_batch_size默認為300,也就是300*128個UNDO小批次清理后才會觸發(fā)UNDO表空間的truncate(也就是UNDO表空間的收縮)操作 innodb_undo_tablespaces -- 控制生成的UNDO表空間的數(shù)量,默認2個,在8.0對該參數(shù)做了廢棄,但并未提供其他參數(shù)控制UNDO數(shù)量,當前依舊可以使用該參數(shù)做UNDO表空間數(shù)量配置,通常建議配置為3(手工收縮UNDO時需要至少3個UNDO表空間) innodb_rollback_segments -- UNDO表空間回滾段的數(shù)量,默認為最大值128
3. UNDO 表空間運維
3.1 查看UNDO的基本信息
-- 可以查看到undo的表空間名稱/文件路徑/初始大小/擴展大小/磁盤文件大小/可用空間及是否啟用的狀態(tài)等
SELECT T1.SPACE AS SPACE_ID,
T1.NAME AS TABLESPACE_NAME,
T2.FILE_NAME,
ROUND(T2.INITIAL_SIZE / 1024 / 1024, 2) AS "INITIAL_SIZE(M)",
ROUND(T2.AUTOEXTEND_SIZE / 1024 / 1024, 2) AS "AUTOEXTEND_SIZE(M)",
ROUND(T1.FILE_SIZE / 1024 / 1024, 2) AS "FILE_SIZE_DISK(M)",
ROUND(T2.DATA_FREE / 1024 / 1024, 2) AS "DATA_FREE(M)",
T2.STATUS,
T1.STATE
FROM INFORMATION_SCHEMA.INNODB_TABLESPACES T1,
INFORMATION_SCHEMA.FILES T2
WHERE T1.SPACE = T2.FILE_ID
AND T1.ROW_FORMAT = 'Undo';
3.2 添加/active/inactive/刪除UNDO表空間
CREATE UNDO TABLESPACE
- 用來創(chuàng)建新的UNDO 表空間
DROP UNDO TABLESPACE
- 用來刪除UNDO 表空間
ALTER UNDO TABLESPACE xxxx SET ACTIVE
- 用來激活UNDO的使用
ALTER UNDO TABLESPACE xxxx SET INACTIVE
- 用來關閉UNDO的使用(關閉后的UNDO才可刪除)
-- 創(chuàng)建一個新的UNDO表空間 CREATE UNDO TABLESPACE undo_004 ADD DATAFILE 'undo_004.ibu'; -- 可以用前面的命令查看創(chuàng)建后的狀態(tài) -- 可以將已有的UNDO表示為inactive(也可理解為UNDO表空間收縮) -- PS:設置為INACTIVE的表空間的STATE為empty,表示這個表空間不包含任何事務回滾數(shù)據(jù),且表空間也收縮為默認大小 ALTER UNDO TABLESPACE undo_003 SET INACTIVE; -- 可以將inactive的UNDO轉(zhuǎn)為active ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE; -- 可以將inactive的UNDO表空間進行刪除 -- PS:默認以innodb_開頭初始化的undo表空間不可被刪除 DROP UNDO TABLESPACE innodb_undo_001; ERROR: 3119 (42000): InnoDB: Tablespace names starting with `innodb_` are reserved. -- 非系統(tǒng)默認的UNDO在inactive后可被刪除 ALTER UNDO TABLESPACE undo_003 SET ACTIVE; Query OK, 0 rows affected (0.0030 sec)
3.3 影響UNDO inactive(truncate)性能的因素
- UNDO 表空間的大小
- UNDO 表空間的數(shù)量
- UNDO LOGS的數(shù)量(實際INSERT/UPDATE/DELETE這類事務回滾段的數(shù)據(jù)量)
- 磁盤IO的能力/當前系統(tǒng)的負載
- 是否存在長事務在使用該UNDO表空間
PS:通常對表空間做收縮前最簡單避免性能的方式是提前創(chuàng)建一個UNDO表空間,收縮完后再刪除或一直保留均可
4. UNDO 的監(jiān)控
4.1 UNDO的監(jiān)控指標
-- 可以使用以下命令開啟對UNDO的監(jiān)控采集 SET GLOBAL innodb_monitor_enable=module_undo; SET GLOBAL innodb_monitor_enable=module_purge; -- 使用該命令查看UNDO truncate的次數(shù)及耗時等信息 SELECT NAME,SUBSYSTEM,COUNT,STATUS,COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';
4.2 UNDO的狀態(tài)值
SHOW STATUS LIKE 'Innodb_undo_tablespaces%'; +----------------------------------+-------+ | Variable_name | Value | +----------------------------------+-------+ | Innodb_undo_tablespaces_total | 4 | -- 總共的UNDO表空間數(shù)量 | Innodb_undo_tablespaces_implicit | 2 | -- 這里implicit其實表示的初始化創(chuàng)建的默認UNDO表空間個數(shù),這種UNDO不可被刪除 | Innodb_undo_tablespaces_explicit | 2 | -- 這里explicit其實表示手工顯式創(chuàng)建的UNDO表空間的個數(shù) | Innodb_undo_tablespaces_active | 4 | -- 表示處于active的UNDO表空間的個數(shù),可以看到當前和total一樣,說明都在使用 +----------------------------------+-------+
5. UNDO 大小對并發(fā)數(shù)的限制
5.1 UNDO 記錄的類型及大小
UNDO LOGS包含的是事務最后一次修改的聚簇索引記錄(MySQL是聚簇索引表,也就是包含了一行完整的記錄)
- 當innodb_page_size 為16KB默認值時,undo 的slot槽為1024個
- 16KB*1024/16=1024個槽
UNDO一共有以下4中日志類型
- INSERT 用戶自定義的表
- UPDATE and DELETE 用戶自定義的表
- INSERT 自定義的臨時表
- UPDATE and DELETE 自定義的臨時表
5.2 UNDO各場景下支持的讀寫并發(fā)
5.2.1 場景1: 每個事務都執(zhí)行一個INSERT or UPDATE(DELETE)
并發(fā)公式: (innodb_page_size / 16) * innodb_rollback_segments * number of undo tablespaces
select 16*1024/16*128*2; +------------------+ | 16*1024/16*128*2 | +------------------+ | 262144.0000 | +------------------+
5.2.2 場景2: 每個事務都執(zhí)行一個INSERT and UPDATE(DELETE)
并發(fā)公式:(innodb_page_size / 16 / 2) * innodb_rollback_segments * number of undo tablespaces
select 16*1024/16/2*128*2; +--------------------+ | 16*1024/16/2*128*2 | +--------------------+ | 131072.00000000 | +--------------------+
5.2.3 場景3: 每個事務都執(zhí)行一個INSERT or UPDATE(DELETE) 到臨時表
并發(fā)公式: (innodb_page_size / 16) * innodb_rollback_segments
select 16*1024/16*128; +----------------+ | 16*1024/16*128 | +----------------+ | 131072.0000 | +----------------+
5.2.4 場景4: 每個事務都執(zhí)行一個INSERT and UPDATE(DELETE) 到臨時表
并發(fā)公式:(innodb_page_size / 16 / 2) * innodb_rollback_segments
select 16*1024/16/2*128; +------------------+ | 16*1024/16/2*128 | +------------------+ | 65536.00000000 | +------------------+
6. 參考鏈接
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-logs.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html
到此這篇關于MySQL8.0 Undo Tablespace管理詳解的文章就介紹到這了,更多相關MySQL8.0 Undo Tablespace內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL索引下推index condition pushdown
索引下推是MySQL 5.6版本引入的一種數(shù)據(jù)庫查詢優(yōu)化技術,本文主要介紹了MySQL索引下推index condition pushdown,具有一定的參考價值,感興趣的可以了解一下2024-08-08
Mysql row number()排序函數(shù)的用法和注意
這篇文章主要介紹了Mysql row number()排序函數(shù)的用法和注意 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
mysql 批量更新與批量更新多條記錄的不同值實現(xiàn)方法
在mysql中批量更新我們可能使用update,replace into來操作,下面小編來給各位同學詳細介紹mysql 批量更新與性能吧2013-10-10
MySQL使用觸發(fā)器實現(xiàn)數(shù)據(jù)自動更新的應用實例
觸發(fā)器是非常常見的自動化數(shù)據(jù)庫操作方式,無論是在數(shù)據(jù)更新、刪除還是需要自動添加一些內(nèi)容到數(shù)據(jù)表上,觸發(fā)器都可以發(fā)揮作用,熟悉 SQL 的基本語法和一些常見的用例,可以幫助你合理地設置自己的數(shù)據(jù)庫操作流程,2024-01-01
MySQL中多個left?join?on關聯(lián)條件的順序說明
這篇文章主要介紹了MySQL中多個left?join?on關聯(lián)條件的順序說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
淺談MySQL中優(yōu)化sql語句查詢常用的30種方法
本篇文章是對MySQL中優(yōu)化sql語句查詢常用的30種方法進行了詳細的分析介紹,需要的朋友參考下2013-06-06

