InnoDB INFORMATION_SCHEMA Lock Tables

InnoDB INFORMATION_SCHEMA Lock Tables

三張InnoDB INFORMATION_SCHEMA表使您可以監視事務並診斷潛在的鎖定問題:html

  • INNODB_TRX:提供有關InnoDB中當前正在執行的每一個事務的信息,包括事務狀態(例如,它是否正在運行或等待鎖定),事務什麼時候啓動以及事務正在執行的特定SQL語句。mysql

  • INNODB_LOCKS:InnoDB中等待另外一個事務釋放鎖定(INNODB_TRX.TRX_STATELOCK WAIT)的每一個事務都被一個阻塞鎖定請求阻止。阻塞鎖定請求是針對由不兼容模式中的另外一個事務持有的行或表鎖定。阻止事務的鎖始終處於與請求鎖定模式不兼容的模式(讀取與寫入,共享與排除)。在另外一個事務提交或回滾以前,阻塞的事務沒法繼續,從而釋放所請求的鎖。對於每一個被阻止的事務,INNODB_LOCKS包含一行描述事務已請求的每一個鎖,以及它正在等待的每一個鎖。對於阻止另外一個事務的每一個鎖,INNODB_LOCKS也包含一行,不管持有鎖的事務的狀態如何(INNODB_TRX.TRX_STATERUNNINGLOCK WAITROLLING BACKCOMMITTING)。sql

  • INNODB_LOCK_WAITS:此表指示哪些事務正在等待給定鎖定,或者指定給定事務正在等待哪一個鎖定。此表包含每一個被阻止事務的一個或多個行,指示它已請求的鎖以及阻止該請求的任何鎖。 REQUESTED_LOCK_ID值指的是事務請求的鎖,BLOCKING_LOCK_ID值指的是阻止第一個事務繼續進行的鎖(由另外一個事務持有)。對於任何給定的阻塞事務,INNODB_LOCK_WAITS中的全部行都具備REQUESTED_LOCK_ID的相同值和BLOCKING_LOCK_ID的不一樣值。markdown

13. INNODB_LOCKS

INNODB_LOCKS表包含有關InnoDB事務已請求但還沒有獲取的每一個鎖的信息,以及事務持有的阻止另外一個事務的每一個鎖。併發

【注意】
此表從MySQL 5.7.14開始不推薦使用,並在MySQL 8.0中刪除。性能

INNODB_LOCKS表包含如下列:優化

  • lock_id :InnoDB內部的惟一鎖ID號。將其視爲不透明的字符串。雖然LOCK_ID當前包含TRX_ID,但LOCK_ID中的數據格式可能隨時更改。不要編寫解析LOCK_ID值的應用程序。
  • lock_trx_id:持有鎖的交易的ID。要獲取有關事務的詳細信息,請將此列與INNODB_TRX表的TRX_ID列鏈接。
  • lock_mode :如何請求鎖定。 容許的鎖定模式描述符是S,X,IS,IX,GAP,AUTO_INC和UNKNOWN。 鎖定模式描述符能夠組合使用以識別特定的鎖定模式。 有關InnoDB鎖定模式的信息,請參見「InnoDB鎖定」。
  • lock_type :鎖的類型。容許的值是行級鎖定的RECORD,表級鎖定的TABLE。
  • lock_table :已鎖定或包含鎖定記錄的表的名稱。
  • lock_index :索引的名稱,若是LOCK_TYPE是RECORD;不然爲NULL。
  • lock_space :鎖定記錄的表空間ID,若是LOCK_TYPE是RECORD;不然爲NULL。
  • lock_page :鎖定記錄的頁碼,若是LOCK_TYPE是RECORD;不然爲NULL。
  • lock_rec :若是LOCK_TYPE是RECORD,則頁面內鎖定記錄的堆號;不然爲NULL。
  • lock_data :與鎖相關的數據(若是有)。 若是LOCK_TYPE是RECORD,則值是鎖定記錄的主鍵值,不然爲NULL。 此列包含鎖定行中主鍵列的值,格式爲有效的SQL字符串(準備複製到SQL語句)。 若是沒有主鍵,則LOCK_DATA是惟一的InnoDB內部行ID號。 若是對索引中的最大值的鍵值或範圍進行間隙鎖定,則LOCK_DATA將報告supremum僞記錄。 當包含鎖定記錄的頁面不在緩衝池中時(若是在保持鎖定時它被分頁到磁盤),InnoDB不會從磁盤獲取頁面,以免沒必要要的磁盤操做。 相反,LOCK_DATA設置爲NULL。

示例spa

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS\G
*************************** 1. row ***************************
 lock_id: 3723:72:3:2
lock_trx_id: 3723
  lock_mode: X
  lock_type: RECORD
 lock_table: `mysql`.`t`
 lock_index: PRIMARY
 lock_space: 72
  lock_page: 3
   lock_rec: 2
  lock_data: 1, 9
*************************** 2. row ***************************
 lock_id: 3722:72:3:2
lock_trx_id: 3722
  lock_mode: S
  lock_type: RECORD
 lock_table: `mysql`.`t`
 lock_index: PRIMARY
 lock_space: 72
  lock_page: 3
   lock_rec: 2
  lock_data: 1, 9

Notes線程

  • 使用此表可幫助診斷在併發負載較重時發生的性能問題。 其內容按「InnoDB事務和鎖定信息的持久性和一致性」中所述進行更新。code

  • 您必須具備PROCESS權限才能查詢此表。

  • 使用INFORMATION_SCHEMA COLUMNS表或SHOW COLUMNS語句查看有關此表的列的其餘信息,包括數據類型和默認值。

  • 有關使用信息,請參見「使用InnoDB事務和鎖定信息」。

14. INNODB_LOCK_WAITS

INNODB_LOCK_WAITS表包含每一個被阻止的InnoDB事務的一行或多行,指示它已請求的鎖以及阻止該請求的任何鎖。

【注意】
此表從MySQL 5.7.14開始不推薦使用,並在MySQL 8.0中刪除。

INNODB_LOCK_WAITS表包含如下列:

  • requesting_trx_id:請求(阻止)事務的ID。
  • requested_lock_id:事務正在等待的鎖的ID。要獲取有關鎖的詳細信息,請使用INNODB_LOCKS表的LOCK_ID列鏈接此列。
  • blocking_trx_id :阻止事務的ID。
  • blocking_lock_id :由阻止另外一個事務繼續進行的事務所持有的鎖的ID。要獲取有關鎖的詳細信息,請使用INNODB_LOCKS表的LOCK_ID列鏈接此列。

示例

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS\G
*************************** 1. row ***************************
requesting_trx_id: 3396
requested_lock_id: 3396:91:3:2
  blocking_trx_id: 3395
 blocking_lock_id: 3395:91:3:2

Notes

  • 使用此表可幫助診斷在併發負載較重時發生的性能問題。 其內容按「InnoDB事務和鎖定信息的持久性和一致性」中所述進行更新。

  • 您必須具備PROCESS權限才能查詢此表。

  • 使用INFORMATION_SCHEMA COLUMNS表或SHOW COLUMNS語句查看有關此表的列的其餘信息,包括數據類型和默認值。

  • 有關使用信息,請參見「使用InnoDB事務和鎖定信息」。

27. INNODB_TRX

INNODB_TRX表包含有關當前在InnoDB內執行的每一個事務(不包括只讀事務)的信息,包括事務是否在等待鎖定,事務什麼時候啓動以及事務正在執行的SQL語句(若是有)。

INNODB_TRX表包含如下列:

  • trx_id :InnoDB內部的惟一交易ID號。不會爲只讀和非鎖定的事務建立這些ID。有關詳細信息,「優化InnoDB只讀事務」。
  • trx_state :事務執行狀態。容許的值爲RUNNING,LOCK WAIT,ROLLING BACK和COMMITTING。
  • trx_started :實務開始時間
  • trx_requested_lock_id :若是TRX_STATE是LOCK WAIT,則事務當前正在等待的鎖的ID;不然爲NULL。要獲取有關鎖的詳細信息,請使用INNODB_LOCKS表的LOCK_ID列鏈接此列。
  • trx_wait_started :若是TRX_STATE是LOCK WAIT,則事務開始等待鎖定的時間;不然爲NULL。
  • trx_weight :事務的權重,反映(但不必定是確切的計數)更改的行數和事務鎖定的行數。 爲了解決死鎖,InnoDB選擇具備最小權重的事務做爲回滾的「受害者」。 不管更改和鎖定行的數量如何,已更改非事務表的事務都被認爲比其餘事務更重。
  • trx_mysql_thread_id :MySQL線程ID。 要獲取有關線程的詳細信息,請將此列與INFORMATION_SCHEMA PROCESSLIST表的ID列鏈接,但請參見「InnoDB事務和鎖定信息的持久性和一致性」。
  • trx_query :事務正在執行的SQL語句。
  • trx_operation_state :交易的當前操做,若是有的話;不然爲NULL。
  • trx_tables_in_use :處理此事務的當前SQL語句時使用的InnoDB表的數量。
  • trx_tables_locked :當前SQL語句具備行鎖的InnoDB表的數量。 (由於這些是行鎖,而不是表鎖,因此一般仍能夠經過多個事務讀取和寫入表,儘管某些行被鎖定。)
  • trx_lock_structs :事務保留的鎖數。
  • trx_lock_memory_bytes :內存中此事務的鎖結構佔用的總大小。
  • trx_rows_locked :此交易鎖定的大體數字或行數。該值可能包括實際存在但對事務不可見的刪除標記行。
  • trx_rows_modified :此事務中已修改和插入的行數。
  • trx_concurrency_tickets :一個值,指示當前事務在被換出以前能夠執行多少工做,由innodb_concurrency_tickets系統變量指定。
  • trx_isolation_level :當前事務的隔離級別。
  • trx_unique_checks :是否爲當前事務打開或關閉惟一檢查。例如,在批量數據加載期間可能會關閉它們。
  • trx_foreign_key_checks :是否爲當前事務打開或關閉外鍵檢查。例如,在批量數據加載期間可能會關閉它們。
  • trx_last_foreign_key_error:最後一個外鍵錯誤的詳細錯誤消息(若是有);不然爲NULL。
  • trx_adaptive_hash_latched :自適應哈希索引是否被當前事務鎖定。 當自適應哈希索引搜索系統被分區時,單個事務不會鎖定整個自適應哈希索引。 自適應哈希索引分區由innodb_adaptive_hash_index_parts控制,默認設置爲8。
  • trx_adaptive_hash_timeout :是否當即爲自適應哈希索引放棄搜索鎖存器,或者在MySQL的調用之間保留它。 當沒有自適應哈希索引爭用時,該值保持爲零,語句保留鎖存器直到它們完成。 在爭用期間,它倒計時到零,而且語句在每次行查找後當即釋放鎖存器。 當自適應哈希索引搜索系統被分區時(由innodb_adaptive_hash_index_parts控制),該值保持爲0。
  • trx_is_read_only :值爲1表示事務是隻讀的。
  • trx_autocommit_non_locking:值爲1表示事務是一個SELECT語句,它不使用FOR UPDATE或LOCK IN SHARED MODE子句,而且在啓用自動提交的狀況下執行,所以事務將只包含這一個語句。 當此列和TRX_IS_READ_ONLY都爲1時,InnoDB會優化事務以減小與更改表數據的事務相關的開銷。

示例

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
*************************** 1. row ***************************
 trx_id: 1510
 trx_state: RUNNING
 trx_started: 2014-11-19 13:24:40
 trx_requested_lock_id: NULL
 trx_wait_started: NULL
 trx_weight: 586739
 trx_mysql_thread_id: 2
 trx_query: DELETE FROM employees.salaries WHERE salary > 65000
 trx_operation_state: updating or deleting
 trx_tables_in_use: 1
 trx_tables_locked: 1
 trx_lock_structs: 3003
 trx_lock_memory_bytes: 450768
 trx_rows_locked: 1407513
 trx_rows_modified: 583736
   trx_concurrency_tickets: 0
 trx_isolation_level: REPEATABLE READ
 trx_unique_checks: 1
 trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
 trx_is_read_only: 0
trx_autocommit_non_locking: 0

Notes

  • 使用此表可幫助診斷在併發負載較重時發生的性能問題。 其內容按「InnoDB事務和鎖定信息的持久性和一致性」中所述進行更新。

  • 您必須具備PROCESS權限才能查詢此表。

  • 使用INFORMATION_SCHEMA COLUMNS表或SHOW COLUMNS語句查看有關此表的列的其餘信息,包括數據類型和默認值。

  • 有關使用信息,請參見「使用InnoDB事務和鎖定信息」。

相關文章
相關標籤/搜索