還原表空間包含還原記錄,這些記錄是包含有關交易如何還原叢集索引記錄的最新變更資訊的記錄集合。
本節將在以下主題中說明還原表空間
當初始化 MySQL 執行個體時,會建立兩個預設還原表空間。預設還原表空間會在初始化時建立,為必須在接受 SQL 陳述式之前存在的復原區段提供位置。至少需要兩個還原表空間才能支援自動截斷還原表空間。請參閱截斷還原表空間。
預設還原表空間會建立在 innodb_undo_directory
變數定義的位置。如果未定義 innodb_undo_directory
變數,則會在資料目錄中建立預設還原表空間。預設還原表空間資料檔案會命名為 undo_001
和 undo_002
。資料字典中定義的對應還原表空間名稱為 innodb_undo_001
和 innodb_undo_002
。
可以使用 SQL 陳述式在執行階段建立其他還原表空間。請參閱新增還原表空間。
初始還原表空間大小通常為 16MiB。當截斷操作建立新的還原表空間時,初始大小可能會有所不同。在這種情況下,如果檔案副檔名大小大於 16MB,且上一個檔案副檔名發生在最後一秒內,則會以 innodb_max_undo_log_size
變數定義大小的四分之一來建立新的還原表空間。
還原表空間會以至少 16MB 的大小擴充。為了處理快速成長,如果上一個檔案副檔名發生在不到 0.1 秒之前,則檔案副檔名大小會加倍。副檔名大小的加倍最多可能會發生多次,達到 256MB 的上限。如果上一個檔案副檔名發生在 0.1 秒之前,則副檔名大小會減半,這也可能會發生多次,達到 16MB 的下限。如果為還原表空間定義了 AUTOEXTEND_SIZE
選項,則會根據 AUTOEXTEND_SIZE
設定的值以及上述邏輯判斷的副檔名大小,以較大者來擴充。如需 AUTOEXTEND_SIZE
選項的相關資訊,請參閱第 17.6.3.9 節,「表空間 AUTOEXTEND_SIZE 設定」。
由於還原記錄在長時間執行的交易期間可能會變得很大,因此建立額外的還原表空間可以協助防止個別的還原表空間變得過大。可以使用 CREATE UNDO TABLESPACE
語法,在執行階段建立額外的還原表空間。
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
還原表空間檔案名稱必須具有 .ibu
副檔名。定義還原表空間檔案名稱時,不允許指定相對路徑。允許使用完整路徑,但路徑必須為 InnoDB
所知。已知路徑是由 innodb_directories
變數所定義的路徑。建議使用唯一的還原表空間檔案名稱,以避免在移動或複製資料時發生潛在的檔案名稱衝突。
在複製環境中,來源和每個副本都必須有自己的還原表空間檔案目錄。將還原表空間檔案的建立複製到共用目錄會導致檔案名稱衝突。
在啟動時,會掃描由 innodb_directories
變數定義的目錄,以尋找還原表空間檔案。(掃描也會遍歷子目錄。)由 innodb_data_home_dir
、innodb_undo_directory
和 datadir
變數定義的目錄會自動附加到 innodb_directories
的值,無論是否明確定義了 innodb_directories
變數。因此,還原表空間可以位於由任何這些變數定義的路徑中。
如果還原表空間檔案名稱不包含路徑,則還原表空間會建立在由 innodb_undo_directory
變數定義的目錄中。如果未定義該變數,則還原表空間會建立在資料目錄中。
InnoDB
復原過程要求還原表空間檔案位於已知的目錄中。還原表空間檔案必須在重做復原之前以及開啟其他資料檔案之前被發現並開啟,以允許回滾未提交的交易和資料字典變更。復原之前未找到的還原表空間無法使用,這可能會導致資料庫不一致。如果在啟動時未找到資料字典已知的還原表空間,則會報告錯誤訊息。已知的目錄要求也支援還原表空間的可攜性。請參閱 移動還原表空間。
若要在相對於資料目錄的路徑中建立還原表空間,請將 innodb_undo_directory
變數設定為相對路徑,並在建立還原表空間時僅指定檔案名稱。
若要檢視還原表空間名稱和路徑,請查詢 INFORMATION_SCHEMA.FILES
SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_TYPE LIKE 'UNDO LOG';
一個 MySQL 執行個體最多支援 127 個還原表空間,包括在初始化 MySQL 執行個體時建立的兩個預設還原表空間。
可以使用 DROP UNDO TABALESPACE
語法來捨棄還原表空間。請參閱 捨棄還原表空間。
使用 CREATE UNDO TABLESPACE
語法建立的還原表空間可以在執行階段使用 DROP UNDO TABALESPACE
語法捨棄。
還原表空間必須為空才能捨棄。若要清空還原表空間,必須先使用 ALTER UNDO TABLESPACE
語法將還原表空間標示為非作用中,以便不再將回滾區段指派給新的交易。
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
在還原表空間標示為非作用中之後,允許目前在還原表空間中使用回滾區段的交易完成,也允許在這些交易完成之前啟動的任何交易完成。在交易完成之後,清除系統會釋放還原表空間中的回滾區段,並且還原表空間會截斷為其初始大小。(截斷還原表空間時也使用相同的過程。請參閱 截斷還原表空間。)一旦還原表空間為空,就可以捨棄。
DROP UNDO TABLESPACE tablespace_name;
或者,還原表空間可以保留在空狀態,並在需要時透過發出 ALTER UNDO TABLESPACE
陳述式稍後重新啟用。tablespace_name
SET ACTIVE
可以透過查詢 Information Schema INNODB_TABLESPACES
表格來監控還原表空間的狀態。
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE 'tablespace_name';
inactive
狀態表示新的交易不再使用還原表空間中的回滾區段。empty
狀態表示還原表空間為空,並且準備好捨棄,或者準備好使用 ALTER UNDO TABLESPACE
陳述式再次啟用。嘗試捨棄未空的還原表空間會傳回錯誤。tablespace_name
SET ACTIVE
在初始化 MySQL 執行個體時建立的預設還原表空間 (innodb_undo_001
和 innodb_undo_002
) 無法捨棄。但是,可以使用 ALTER UNDO TABLESPACE
陳述式將它們設為非作用中。在預設還原表空間設為非作用中之前,必須有另一個還原表空間來取代它。始終需要至少兩個作用中的還原表空間,以支援自動截斷還原表空間。tablespace_name
SET INACTIVE
使用 CREATE UNDO TABLESPACE
語法建立的還原表空間可以在伺服器離線時移動到任何已知目錄。已知目錄是由 innodb_directories
變數定義的目錄。由 innodb_data_home_dir
、innodb_undo_directory
和 datadir
定義的目錄會自動附加到 innodb_directories
的值,無論是否明確定義了 innodb_directories
變數。這些目錄及其子目錄會在啟動時掃描還原表空間檔案。移動到這些目錄中任何一個目錄的還原表空間檔案會在啟動時被發現,並假設為已移動的還原表空間。
在初始化 MySQL 執行個體時建立的預設還原表空間 (innodb_undo_001
和 innodb_undo_002
) 必須位於由 innodb_undo_directory
變數定義的目錄中。如果 innodb_undo_directory
變數未定義,則預設還原表空間會位於資料目錄中。如果在伺服器離線時移動預設還原表空間,則必須使用配置為新目錄的 innodb_undo_directory
變數啟動伺服器。
還原日誌的 I/O 模式使還原表空間成為 SSD 儲存的良好候選者。
innodb_rollback_segments
變數定義分配給每個還原表空間和全域暫時表空間的回滾區段數量。innodb_rollback_segments
變數可以在啟動時或伺服器執行時配置。
innodb_rollback_segments
的預設設定為 128,這也是最大值。有關回滾區段支援的交易數量的資訊,請參閱 第 17.6.6 節「還原日誌」。
截斷還原表空間有兩種方法,可以單獨使用或組合使用來管理還原表空間的大小。一種方法是自動化的,使用配置變數啟用。另一種方法是手動的,使用 SQL 陳述式執行。
自動化方法不需要監視還原表空間的大小,並且一旦啟用,它會執行還原表空間的停用、截斷和重新啟用,而無需手動干預。如果您想要控制還原表空間何時離線進行截斷,則手動截斷方法可能更為可取。例如,您可能想要避免在工作負載高峰時間截斷還原表空間。
自動截斷
還原表空間的自動截斷至少需要兩個作用中的還原表空間,這可確保在另一個還原表空間離線截斷時,其中一個還原表空間保持作用中狀態。預設情況下,在初始化 MySQL 執行個體時會建立兩個還原表空間。
若要自動截斷還原表空間,請啟用 innodb_undo_log_truncate
變數。例如
mysql> SET GLOBAL innodb_undo_log_truncate=ON;
當啟用 innodb_undo_log_truncate
變數時,超過由 innodb_max_undo_log_size
變數定義的大小限制的還原表空間將會被截斷。innodb_max_undo_log_size
變數是動態的,預設值為 1073741824 位元組 (1024 MiB)。
mysql> SELECT @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
| 1073741824 |
+----------------------------+
當啟用 innodb_undo_log_truncate
變數時
超過
innodb_max_undo_log_size
設定的預設和使用者定義的還原表空間會被標示為截斷。會以循環方式選取要截斷的還原表空間,以避免每次都截斷相同的還原表空間。位於選定還原表空間中的回滾區段會設為非作用中,以便不會將它們指派給新的交易。允許目前使用回滾區段的現有交易完成。
清除系統會釋放不再使用的還原日誌,清空回滾區段。
在還原表空間中所有回滾段釋放後,截斷操作會執行,並將還原表空間截斷至其初始大小。
由於截斷操作完成後立即使用,還原表空間在截斷操作後的大小可能會大於初始大小。
innodb_undo_directory
變數定義了預設還原表空間檔案的位置。如果innodb_undo_directory
變數未定義,則預設還原表空間位於資料目錄中。所有還原表空間檔案的位置,包括使用CREATE UNDO TABLESPACE
語法建立的使用者定義還原表空間,都可以透過查詢資訊綱要FILES
表來確定。SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';
回滾段會重新啟用,以便將其指派給新的交易。
手動截斷
手動截斷還原表空間至少需要三個作用中的還原表空間。為了支援啟用自動截斷的可能性,始終需要兩個作用中的還原表空間。至少三個還原表空間可以滿足此要求,同時允許手動將還原表空間離線。
若要手動啟動還原表空間的截斷,請發出以下陳述式來停用還原表空間
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
在還原表空間標記為非作用中後,允許目前使用還原表空間中回滾段的交易完成,也允許在這些交易完成之前開始的任何交易完成。交易完成後,清除系統會釋放還原表空間中的回滾段,還原表空間會截斷至其初始大小,並且還原表空間狀態會從 inactive
變更為 empty
。
當 ALTER UNDO TABLESPACE
陳述式停用還原表空間時,清除執行緒會在下一個機會尋找該還原表空間。一旦找到並標記要截斷的還原表空間,清除執行緒會以更高的頻率返回,以快速清空和截斷還原表空間。tablespace_name
SET INACTIVE
若要檢查還原表空間的狀態,請查詢資訊綱要 INNODB_TABLESPACES
表。
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE 'tablespace_name';
一旦還原表空間處於 empty
狀態,就可以透過發出以下陳述式來重新啟用它
ALTER UNDO TABLESPACE tablespace_name SET ACTIVE;
處於 empty
狀態的還原表空間也可以刪除。請參閱 刪除還原表空間。
加速自動截斷還原表空間
清除執行緒負責清空和截斷還原表空間。預設情況下,清除執行緒每當清除被調用 128 次時,就會尋找要截斷的還原表空間。清除執行緒尋找要截斷的還原表空間的頻率由 innodb_purge_rseg_truncate_frequency
變數控制,該變數的預設設定為 128。
mysql> SELECT @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 128 |
+----------------------------------------+
若要增加頻率,請減少 innodb_purge_rseg_truncate_frequency
設定。例如,若要讓清除執行緒在每次清除被調用 32 次時尋找還原表空間,請將 innodb_purge_rseg_truncate_frequency
設定為 32。
mysql> SET GLOBAL innodb_purge_rseg_truncate_frequency=32;
截斷還原表空間檔案的效能影響
當還原表空間被截斷時,還原表空間中的回滾段會停用。其他還原表空間中作用中的回滾段會承擔整個系統負載的責任,這可能會導致效能略微下降。效能受影響的程度取決於許多因素
還原表空間的數量
還原日誌的數量
還原表空間的大小
I/O 子系統的速度
現有的長期執行交易
系統負載
避免潛在效能影響的最簡單方法是增加還原表空間的數量。
監控還原表空間截斷
提供了 undo
和 purge
子系統計數器,用於監控與還原日誌截斷相關的背景活動。有關計數器名稱和描述,請查詢資訊綱要 INNODB_METRICS
表。
SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';
有關啟用計數器和查詢計數器資料的資訊,請參閱 第 17.15.6 節,「InnoDB INFORMATION_SCHEMA 指標表」。
還原表空間截斷限制
在檢查點之間,對同一個還原表空間的截斷操作次數限制為 64 次。此限制可防止因過多的還原表空間截斷操作而導致的潛在問題,例如,如果繁忙系統上 innodb_max_undo_log_size
設定得太低,則可能會發生這種情況。如果超過限制,仍然可以將還原表空間設為非作用中,但它必須等到下一個檢查點之後才會被截斷。在 MySQL 9.0 中,限制為 50000。
還原表空間截斷復原
還原表空間截斷操作會在伺服器日誌目錄中建立一個臨時的 undo_
檔案。該日誌目錄由 space_number
_trunc.loginnodb_log_group_home_dir
定義。如果在截斷操作期間發生系統故障,臨時日誌檔案可讓啟動過程識別正在截斷的還原表空間,並繼續操作。
以下狀態變數允許追蹤還原表空間的總數、隱含(InnoDB
建立的)還原表空間、顯式(使用者建立的)還原表空間以及作用中還原表空間的數量
mysql> SHOW STATUS LIKE 'Innodb_undo_tablespaces%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| Innodb_undo_tablespaces_total | 2 |
| Innodb_undo_tablespaces_implicit | 2 |
| Innodb_undo_tablespaces_explicit | 0 |
| Innodb_undo_tablespaces_active | 2 |
+----------------------------------+-------+
有關狀態變數描述,請參閱 第 7.1.10 節,「伺服器狀態變數」。