MySQL 使用中繼資料鎖定來管理對資料庫物件的並行存取,並確保資料一致性;請參閱第 10.11.4 節「中繼資料鎖定」。中繼資料鎖定不僅適用於表格,也適用於結構描述、儲存程式 (程序、函數、觸發程序、排程事件)、表格空間、使用 GET_LOCK()
函數取得的使用者鎖定 (請參閱第 14.14 節「鎖定函數」),以及使用第 7.6.9.1 節「鎖定服務」中描述的鎖定服務取得的鎖定。
Performance Schema 透過 metadata_locks
表格公開中繼資料鎖定資訊。
已授與的鎖定 (顯示哪些工作階段擁有哪些目前的中繼資料鎖定)。
已要求但尚未授與的鎖定 (顯示哪些工作階段正在等候哪些中繼資料鎖定)。
已被死鎖偵測器終止的鎖定要求。
已逾時且正在等候捨棄要求工作階段鎖定要求的鎖定要求。
此資訊讓您能夠了解工作階段之間的中繼資料鎖定相依性。您不僅可以看到工作階段正在等候哪個鎖定,還可以查看哪個工作階段目前持有該鎖定。
metadata_locks
表格為唯讀,無法更新。預設情況下,它會自動調整大小;若要設定表格大小,請在伺服器啟動時設定 performance_schema_max_metadata_locks
系統變數。
中繼資料鎖定檢測使用 wait/lock/metadata/sql/mdl
工具,預設為啟用。
若要在伺服器啟動時控制中繼資料鎖定檢測狀態,請在 my.cnf
檔案中使用如下的行
啟用
[mysqld] performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
停用
[mysqld] performance-schema-instrument='wait/lock/metadata/sql/mdl=OFF'
若要在執行階段控制中繼資料鎖定檢測的狀態,請更新 setup_instruments
表格。
啟用
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';
停用
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'wait/lock/metadata/sql/mdl';
效能架構 (Performance Schema) 維護 metadata_locks
表格內容如下,使用 LOCK_STATUS
欄位來指示每個鎖定的狀態。
當請求中繼資料鎖定且立即取得時,會插入一個狀態為
GRANTED
的列。當請求中繼資料鎖定且未立即取得時,會插入一個狀態為
PENDING
的列。當先前請求的中繼資料鎖定被授予時,其列狀態會更新為
GRANTED
。當中繼資料鎖定被釋放時,其列會被刪除。
當等待中的鎖定請求被死鎖偵測器取消以打破死鎖時 (
ER_LOCK_DEADLOCK
),其列狀態會從PENDING
更新為VICTIM
。當等待中的鎖定請求逾時時 (
ER_LOCK_WAIT_TIMEOUT
),其列狀態會從PENDING
更新為TIMEOUT
。當已授予的鎖定或等待中的鎖定請求被終止時,其列狀態會從
GRANTED
或PENDING
更新為KILLED
。狀態值
VICTIM
、TIMEOUT
和KILLED
是簡短的,表示鎖定列即將被刪除。狀態值
PRE_ACQUIRE_NOTIFY
和POST_RELEASE_NOTIFY
是簡短的,表示中繼資料鎖定子系統在進入鎖定獲取操作或離開鎖定釋放操作時,正在通知感興趣的儲存引擎。
metadata_locks
表格具有以下這些欄位:
OBJECT_TYPE
中繼資料鎖定子系統中使用的鎖定類型。值為
GLOBAL
、SCHEMA
、TABLE
、FUNCTION
、PROCEDURE
、TRIGGER
(目前未使用)、EVENT
、COMMIT
、USER LEVEL LOCK
、TABLESPACE
、BACKUP LOCK
或LOCKING SERVICE
其中之一。值
USER LEVEL LOCK
表示使用GET_LOCK()
取得的鎖定。值LOCKING SERVICE
表示使用 第 7.6.9.1 節「鎖定服務」中所述的鎖定服務取得的鎖定。OBJECT_SCHEMA
包含物件的綱要。
OBJECT_NAME
檢測物件的名稱。
OBJECT_INSTANCE_BEGIN
檢測物件在記憶體中的位址。
LOCK_TYPE
來自中繼資料鎖定子系統的鎖定類型。值為
INTENTION_EXCLUSIVE
、SHARED
、SHARED_HIGH_PRIO
、SHARED_READ
、SHARED_WRITE
、SHARED_UPGRADABLE
、SHARED_NO_WRITE
、SHARED_NO_READ_WRITE
或EXCLUSIVE
其中之一。LOCK_DURATION
來自中繼資料鎖定子系統的鎖定持續時間。值為
STATEMENT
、TRANSACTION
或EXPLICIT
其中之一。STATEMENT
和TRANSACTION
值分別表示在語句或交易結束時隱式釋放的鎖定。EXPLICIT
值表示在語句或交易結束後仍然存在的鎖定,並且通過顯式操作釋放,例如使用FLUSH TABLES WITH READ LOCK
取得的全域鎖定。LOCK_STATUS
來自中繼資料鎖定子系統的鎖定狀態。值為
PENDING
、GRANTED
、VICTIM
、TIMEOUT
、KILLED
、PRE_ACQUIRE_NOTIFY
或POST_RELEASE_NOTIFY
其中之一。效能架構如先前所述分配這些值。SOURCE
包含產生事件的檢測程式碼的來源檔案名稱,以及檔案中發生檢測的行號。這使您可以檢查原始碼以確定確切涉及的程式碼。
OWNER_THREAD_ID
請求中繼資料鎖定的執行緒。
OWNER_EVENT_ID
請求中繼資料鎖定的事件。
metadata_locks
表格具有以下這些索引:
主鍵在 (
OBJECT_INSTANCE_BEGIN
) 上索引在 (
OBJECT_TYPE
,OBJECT_SCHEMA
,OBJECT_NAME
) 上索引在 (
OWNER_THREAD_ID
,OWNER_EVENT_ID
) 上
不允許對 metadata_locks
表格使用 TRUNCATE TABLE
。