文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.13.3 metadata_locks 表格

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

  • 當已授予的鎖定或等待中的鎖定請求被終止時,其列狀態會從 GRANTEDPENDING 更新為 KILLED

  • 狀態值 VICTIMTIMEOUTKILLED 是簡短的,表示鎖定列即將被刪除。

  • 狀態值 PRE_ACQUIRE_NOTIFYPOST_RELEASE_NOTIFY 是簡短的,表示中繼資料鎖定子系統在進入鎖定獲取操作或離開鎖定釋放操作時,正在通知感興趣的儲存引擎。

metadata_locks 表格具有以下這些欄位:

  • OBJECT_TYPE

    中繼資料鎖定子系統中使用的鎖定類型。值為 GLOBALSCHEMATABLEFUNCTIONPROCEDURETRIGGER (目前未使用)、EVENTCOMMITUSER LEVEL LOCKTABLESPACEBACKUP LOCKLOCKING SERVICE 其中之一。

    USER LEVEL LOCK 表示使用 GET_LOCK() 取得的鎖定。值 LOCKING SERVICE 表示使用 第 7.6.9.1 節「鎖定服務」中所述的鎖定服務取得的鎖定。

  • OBJECT_SCHEMA

    包含物件的綱要。

  • OBJECT_NAME

    檢測物件的名稱。

  • OBJECT_INSTANCE_BEGIN

    檢測物件在記憶體中的位址。

  • LOCK_TYPE

    來自中繼資料鎖定子系統的鎖定類型。值為 INTENTION_EXCLUSIVESHAREDSHARED_HIGH_PRIOSHARED_READSHARED_WRITESHARED_UPGRADABLESHARED_NO_WRITESHARED_NO_READ_WRITEEXCLUSIVE 其中之一。

  • LOCK_DURATION

    來自中繼資料鎖定子系統的鎖定持續時間。值為 STATEMENTTRANSACTIONEXPLICIT 其中之一。STATEMENTTRANSACTION 值分別表示在語句或交易結束時隱式釋放的鎖定。 EXPLICIT 值表示在語句或交易結束後仍然存在的鎖定,並且通過顯式操作釋放,例如使用 FLUSH TABLES WITH READ LOCK 取得的全域鎖定。

  • LOCK_STATUS

    來自中繼資料鎖定子系統的鎖定狀態。值為 PENDINGGRANTEDVICTIMTIMEOUTKILLEDPRE_ACQUIRE_NOTIFYPOST_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