mysql InnoDB鎖等待的檢視及分析
說明:前面已經瞭解了InnoDB關於在出現鎖等待的時候,會根據引數innodb_lock_wait_timeout的配置,判斷是否需要進行timeout的操作,本文件介紹在出現鎖等待時候的檢視及分析處理;
在InnoDB Plugin之前,一般通過show full processlist和show engine innodb status命令檢視當前的資料庫請求,然後再判斷當前事務中鎖的情況。隨著mysql的發展,已經提供更加便捷的方法來監控資料庫中的鎖等待現象了。
在information_schema下面有三張表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS,通過這三張表,可以更簡單地監控當前的事務並分析可能存在的問題。
- INNODB_TRX表及結構
Column name | Description |
TRX_ID | Unique transaction ID number, internal to InnoDB. (Starting in MySQL 5.6, these IDs are not created for transactions that are read-only and non-locking. See Optimizing InnoDB Read-Only Transactions for details.) |
TRX_WEIGHT | The weight of a transaction, reflecting (but not necessarily the exact count of) the number of rows altered and the number of rows locked by the transaction. To resolve a deadlock, InnoDB selects the transaction with the smallest weight as the “victim” to rollback. Transactions that have changed non-transactional tables are considered heavier than others, regardless of the number of altered and locked rows. |
TRX_STATE | Transaction execution state. One of RUNNING, LOCK WAIT, ROLLING BACK or COMMITTING. |
TRX_STARTED | Transaction start time. |
TRX_REQUESTED_LOCK_ID | ID of the lock the transaction is currently waiting for (if TRX_STATE is LOCK WAIT, otherwise NULL). Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID. |
TRX_WAIT_STARTED | Time when the transaction started waiting on the lock (if TRX_STATE is LOCK WAIT, otherwise NULL). |
TRX_MYSQL_THREAD_ID | MySQL thread ID. Can be used for joining with PROCESSLIST on ID. See Section 14.17.2.3.1, “Potential Inconsistency with PROCESSLIST Data”. |
TRX_QUERY | The SQL query that is being executed by the transaction. |
TRX_OPERATION_STATE | The transaction's current operation, or NULL. |
TRX_TABLES_IN_USE | The number of InnoDB tables used while processing the current SQL statement of this transaction. |
TRX_TABLES_LOCKED | Number of InnoDB tables that the current SQL statement has row locks on. (Because these are row locks, not table locks, the tables can usually still be read from and written to by multiple transactions, despite some rows being locked.) |
TRX_LOCK_STRUCTS | The number of locks reserved by the transaction. |
TRX_LOCK_MEMORY_BYTES | Total size taken up by the lock structures of this transaction in memory. |
TRX_ROWS_LOCKED | Approximate number or rows locked by this transaction. The value might include delete-marked rows that are physically present but not visible to the transaction. |
TRX_ROWS_MODIFIED | The number of modified and inserted rows in this transaction. |
TRX_CONCURRENCY_TICKETS | A value indicating how much work the current transaction can do before being swapped out, as specified by the innodb_concurrency_tickets option. |
TRX_ISOLATION_LEVEL | The isolation level of the current transaction. |
TRX_UNIQUE_CHECKS | Whether unique checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.) |
TRX_FOREIGN_KEY_CHECKS | Whether foreign key checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.) |
TRX_LAST_FOREIGN_KEY_ERROR | Detailed error message for last FK error, or NULL. |
TRX_ADAPTIVE_HASH_LATCHED | Whether or not the adaptive hash index is locked by the current transaction. (Only a single transaction at a time can modify the adaptive hash index.) |
TRX_ADAPTIVE_HASH_TIMEOUT | Whether to relinquish the search latch immediately for the adaptive hash index, or reserve it across calls from MySQL. When there is no AHI contention, this value remains zero and statements reserve the latch until they finish. During times of contention, it counts down to zero, and statements release the latch immediately after each row lookup. |
TRX_IS_READ_ONLY | A value of 1 indicates the transaction is read-only. (5.6.4 and up.) |
TRX_AUTOCOMMIT_NON_LOCKING | A value of 1 indicates the transaction is a SELECT statement that does not use the FOR UPDATE or LOCK IN SHARED MODE clauses, and is executing with the autocommit setting turned on so that the transaction will only contain this one statement. (5.6.4 and up.) When this column and TRX_IS_READ_ONLY are both 1, InnoDB optimizes the transaction to reduce the overhead associated with transactions that change table data. |
比較常用的列:
trx_id:InnoDB儲存引擎內部唯一的事物ID
trx_status:當前事務的狀態
trx_status:事務的開始時間
trx_requested_lock_id:等待事務的鎖ID
trx_wait_started:事務等待的開始時間
trx_weight:事務的權重,反應一個事務修改和鎖定的行數,當發現死鎖需要回滾時,權重越小的值被回滾
trx_mysql_thread_id:MySQL中的程式ID,與show processlist中的ID值相對應
trx_query:事務執行的SQL語句
- INNODB_LOCKS
Column name | Description |
LOCK_ID | Unique lock ID number, internal to InnoDB. Treat it as an opaque string. Although LOCK_ID currently contains TRX_ID, the format of the data in LOCK_ID is not guaranteed to remain the same in future releases. Do not write programs that parse the LOCK_ID value. |
LOCK_TRX_ID | ID of the transaction holding this lock. Details about the transaction can be found by joining with INNODB_TRX on TRX_ID. |
LOCK_MODE | Mode of the lock. One of S, X, IS, IX, S_GAP, X_GAP, IS_GAP, IX_GAP, or AUTO_INC for shared, exclusive, intention shared, intention exclusive row locks, shared and exclusive gap locks, intention shared and intention exclusive gap locks, and auto-increment table level lock, respectively. Refer to the sections Section 14.5.3, “InnoDB Lock Modes” and Section 14.5.2, “The InnoDB Transaction Model and Locking” for information on InnoDB locking. |
LOCK_TYPE | Type of the lock. One of RECORD or TABLE for record (row) level or table level locks, respectively. |
LOCK_TABLE | Name of the table that has been locked or contains locked records. |
LOCK_INDEX | Name of the index if LOCK_TYPE='RECORD', otherwise NULL. |
LOCK_SPACE | Tablespace ID of the locked record if LOCK_TYPE='RECORD', otherwise NULL. |
LOCK_PAGE | Page number of the locked record if LOCK_TYPE='RECORD', otherwise NULL. |
LOCK_REC | Heap number of the locked record within the page if LOCK_TYPE='RECORD', otherwise NULL. |
LOCK_DATA | Primary key value(s) of the locked record if LOCK_TYPE='RECORD', otherwise NULL. This column contains the value(s) of the primary key column(s) in the locked row, formatted as a valid SQL string (ready to be copied to SQL commands). If there is no primary key then the InnoDB internal unique row ID number is used. If a gap lock is taken for key values or ranges above the largest value in the index, LOCK_DATA reports “supremum pseudo-record”. When the page containing the locked record is not in the buffer pool (in the case that it was paged out to disk while the lock was held), InnoDB does not fetch the page from disk, to avoid unnecessary disk operations. Instead, LOCK_DATA is set to NULL. |
- INNODB_LOCK_WAITS
Column name | Description |
REQUESTING_TRX_ID | ID of the requesting transaction. |
REQUESTED_LOCK_ID | ID of the lock for which a transaction is waiting. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID. |
BLOCKING_TRX_ID | ID of the blocking transaction. |
BLOCKING_LOCK_ID | ID of a lock held by a transaction blocking another transaction from proceeding. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID. |
以上這些表,其實只要知道其中比較常用的欄位,就差不多能夠滿足日常的工作需求了,下面通過測試進行演示;
一、準備工作
1、在test下面隨便建立一張表john,並取消自動commit操作,指令碼如下:
mysql> use information_schema Database changed
mysql> select count(*) from tables;
mysql> create table test.john as select * from tables;
mysql> insert into john select * from john; (經過幾次插入後john表的資料671744行)
mysql> set @@autocommit=0; (取消資料庫的自動commit) |
二、進行表john加鎖操作,指令碼如下:
mysql> select count(*) from john for update; |
在另外一個視窗中監控innodb鎖的狀態;
mysql> SELECT * FROM INNODB_TRX\G; |
trx_id: B14 只是持有鎖,但並沒有產生鎖等待;
三、模擬鎖等待
3.1 在另外一個視窗中,執行語句:
mysql> select count(*) from john where table_name='CHARACTER_SETS' for update; |
3.2 檢視當前鎖等待的情況
INNODB_TRX的鎖情況:
mysql> SELECT * FROM INNODB_TRX\G; |
請注意:因為我們只有模擬兩個session,所以這邊只有兩個會話。(因此一個處於鎖等待,另外一個必然就是持有鎖的物件。實際的生產環境中可能這邊會出現很多列,所以需要用下面的語句才能判斷:鎖等待和持有鎖物件的匹配關係)
3.3 鎖等待和持有鎖的相互關係
mysql> SELECT * FROM INNODB_LOCK_WAITS\G;
ERROR: |
通過檢視INNODB_LOCK_WAITS可以清晰的看到B14持有鎖,而B15處於鎖等待;
3.4 鎖等待的原因
mysql> SELECT * FROM INNODB_LOCKS\G; |
可以看到持有鎖的模式、物件
3.5 在程式裡面檢視狀態
Id值為8的程式,Info顯示為NULL值,可以推斷當前的session由於未進行commit導致鎖未釋放的;
總結:通過以上幾個檢視,就可以很快速的判斷出鎖等待的物件及原因了,從這上面也可以看出mysql管理更加便捷和容易了;
本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-2132653/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視MySQL鎖等待的原因MySql
- MySQL InnoDB設定死鎖檢測的方法MySql
- MySQL鎖等待與死鎖問題分析MySql
- Innodb中怎麼檢視鎖資訊
- mysql鎖分析相關的幾個系統檢視MySql
- MySQL資料庫故障分析-鎖等待(一)MySql資料庫
- 故障分析 | MySQL鎖等待超時一例分析MySql
- MySQL 死鎖和鎖等待MySql
- MySQL:如何快速的檢視Innodb資料檔案MySql
- MySQL鎖:InnoDB行鎖需要避免的坑MySql
- MySQL鎖:03.InnoDB行鎖MySql
- Mysql innodb引擎(二)鎖MySql
- MySQL InnoDB 中的鎖機制MySql
- InnoDB 事務加鎖分析
- 詳解 MySql InnoDB 中意向鎖的作用MySql
- Mysql研磨之InnoDB行鎖模式MySql模式
- MySQL:Innodb 一個死鎖案例MySql
- InnoDB LOCK檢視變化
- MySQL中InnoDB鎖機制介紹及一些測試MySql
- mysql 聯合表(federated)及檢視MySql
- tempdb大量閂鎖等待問題分析
- DRF檢視的使用及原始碼流程分析原始碼
- MySQL innodb 的間隙鎖定(next-key locking)MySql
- 在Linux中,mysql的innodb如何定位鎖問題?LinuxMySql
- drf 檢視使用及原始碼分析原始碼
- MySQL鎖分析MySql
- mysql innodb lock鎖之record lock之一MySql
- Mysql技術內幕之InnoDB鎖探究MySql
- oracle檢視被鎖的表和解鎖Oracle
- 檢視鎖表
- MySQL什麼是InnoDB檢查點?MySql
- MySQL/InnoDB中,樂觀鎖、悲觀鎖、共享鎖、排它鎖、行鎖、表鎖、死鎖概念的理解MySql
- 檢視SQLServer的LCK資源等待情況SQLServer
- 詳解 MySql InnoDB 中的三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)MySql
- 檢視oracle被鎖的表是誰鎖的Oracle
- MySQL底層概述—10.InnoDB鎖機制MySql
- mysql行鎖和死鎖檢測MySql
- 管理mysql的檢視MySql
- MySQL檢視及殺掉連結方法大全MySql