本節說明如何使用效能結構描述所公開的鎖定資訊,例如 data_locks
和 data_lock_waits
資料表。
有時,識別哪個交易封鎖另一個交易會很有幫助。包含 InnoDB
交易和資料鎖定資訊的資料表,可讓您判斷哪個交易正在等待另一個交易,以及正在請求哪個資源。(這些資料表的描述,請參閱第 17.15.2 節「InnoDB INFORMATION_SCHEMA 交易和鎖定資訊」。)
假設三個工作階段同時執行。每個工作階段對應到一個 MySQL 執行緒,並依序執行一個交易。考量當這些工作階段已發出下列陳述式,但尚未提交其交易時的系統狀態
工作階段 A
BEGIN; SELECT a FROM t FOR UPDATE; SELECT SLEEP(100);
工作階段 B
SELECT b FROM t FOR UPDATE;
工作階段 C
SELECT c FROM t FOR UPDATE;
在這種情況下,請使用以下查詢來查看哪些交易正在等待以及哪些交易正在封鎖它們
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_engine_transaction_id;
或者,更簡單來說,使用 sys
結構描述 innodb_lock_waits
檢視
SELECT
waiting_trx_id,
waiting_pid,
waiting_query,
blocking_trx_id,
blocking_pid,
blocking_query
FROM sys.innodb_lock_waits;
如果針對封鎖查詢回報 NULL 值,請參閱在發出工作階段變成閒置後識別封鎖查詢。
等待 trx id | 等待執行緒 | 等待查詢 | 封鎖 trx id | 封鎖執行緒 | 封鎖查詢 |
---|---|---|---|---|---|
A4 |
6 |
SELECT b FROM t FOR UPDATE |
A3 |
5 |
SELECT SLEEP(100) |
A5 |
7 |
SELECT c FROM t FOR UPDATE |
A3 |
5 |
SELECT SLEEP(100) |
A5 |
7 |
SELECT c FROM t FOR UPDATE |
A4 |
6 |
SELECT b FROM t FOR UPDATE |
在上表中,您可以透過 「等待查詢」或「封鎖查詢」欄來識別工作階段。如您所見
工作階段 B(trx id
A4
、執行緒6
)和工作階段 C(trx idA5
、執行緒7
)都在等待工作階段 A(trx idA3
、執行緒5
)。工作階段 C 不僅在等待工作階段 A,也在等待工作階段 B。
您可以在 INFORMATION_SCHEMA
INNODB_TRX
資料表和效能結構描述 data_locks
和 data_lock_waits
資料表中看到基礎資料。
下表顯示 INNODB_TRX
資料表的一些範例內容。
trx id | trx 狀態 | trx 已開始 | trx 請求鎖定 id | trx 等待已開始 | trx 權重 | trx mysql 執行緒 id | trx 查詢 |
---|---|---|---|---|---|---|---|
A3 |
RUNNING |
2008-01-15 16:44:54 |
NULL |
NULL |
2 |
5 |
SELECT SLEEP(100) |
A4 |
LOCK WAIT |
2008-01-15 16:45:09 |
A4:1:3:2 |
2008-01-15 16:45:09 |
2 |
6 |
SELECT b FROM t FOR UPDATE |
A5 |
LOCK WAIT |
2008-01-15 16:45:14 |
A5:1:3:2 |
2008-01-15 16:45:14 |
2 |
7 |
SELECT c FROM t FOR UPDATE |
下表顯示 data_locks
資料表的一些範例內容。
鎖定 id | 鎖定 trx id | 鎖定模式 | 鎖定類型 | 鎖定結構描述 | 鎖定資料表 | 鎖定索引 | 鎖定資料 |
---|---|---|---|---|---|---|---|
A3:1:3:2 |
A3 |
X |
RECORD |
測試 |
t |
主要 |
0x0200 |
A4:1:3:2 |
A4 |
X |
RECORD |
測試 |
t |
主要 |
0x0200 |
A5:1:3:2 |
A5 |
X |
RECORD |
測試 |
t |
主要 |
0x0200 |
下表顯示 data_lock_waits
表格的一些範例內容。
在識別封鎖交易時,如果發出查詢的會話已閒置,則會針對封鎖查詢報告 NULL 值。在這種情況下,請使用以下步驟來確定封鎖查詢
識別封鎖交易的 processlist ID。在
sys.innodb_lock_waits
表格中,封鎖交易的 processlist ID 是blocking_pid
值。使用
blocking_pid
,查詢 MySQL Performance Schemathreads
表格,以確定封鎖交易的THREAD_ID
。例如,如果blocking_pid
為 6,請發出此查詢SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
使用
THREAD_ID
,查詢 Performance Schemaevents_statements_current
表格,以確定該執行緒執行的最後一個查詢。例如,如果THREAD_ID
為 28,請發出此查詢SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current WHERE THREAD_ID = 28\G
如果執行緒執行的最後一個查詢不足以判斷為何持有鎖定,您可以查詢 Performance Schema
events_statements_history
表格,以檢視該執行緒執行的最後 10 個陳述式。SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history WHERE THREAD_ID = 28 ORDER BY EVENT_ID;
有時,將內部 InnoDB
鎖定資訊與 MySQL 維護的會話層級資訊關聯會很有用。例如,您可能想知道,對於給定的 InnoDB
交易 ID,對應的 MySQL 會話 ID 和可能持有鎖定(因而封鎖其他交易)的會話名稱。
以下來自 INFORMATION_SCHEMA
INNODB_TRX
表格以及 Performance Schema data_locks
和 data_lock_waits
表格的輸出取自一個負載較高的系統。如您所見,有數個交易正在執行。
以下 data_locks
和 data_lock_waits
表格顯示
INFORMATION_SCHEMA
PROCESSLIST
和 INNODB_TRX
表格中顯示的查詢之間可能存在不一致。如需說明,請參閱第 17.15.2.3 節「InnoDB 交易和鎖定資訊的持久性和一致性」。
下表顯示在執行繁重工作負載的系統中,PROCESSLIST
表格的內容。
ID | 使用者 | 主機 | 資料庫 | 命令 | 時間 | 狀態 | 資訊 |
---|---|---|---|---|---|---|---|
384 |
root |
localhost |
測試 |
查詢 |
10 |
更新 |
INSERT INTO t2 VALUES … |
257 |
root |
localhost |
測試 |
查詢 |
3 |
更新 |
INSERT INTO t2 VALUES … |
130 |
root |
localhost |
測試 |
查詢 |
0 |
更新 |
INSERT INTO t2 VALUES … |
61 |
root |
localhost |
測試 |
查詢 |
1 |
更新 |
INSERT INTO t2 VALUES … |
8 |
root |
localhost |
測試 |
查詢 |
1 |
更新 |
INSERT INTO t2 VALUES … |
4 |
root |
localhost |
測試 |
查詢 |
0 |
準備中 |
SELECT * FROM PROCESSLIST |
2 |
root |
localhost |
測試 |
睡眠 |
566 |
|
NULL |
下表顯示在執行繁重工作負載的系統中,INNODB_TRX
表格的內容。
trx id | trx 狀態 | trx 已開始 | trx 請求鎖定 id | trx 等待已開始 | trx 權重 | trx mysql 執行緒 id | trx 查詢 |
---|---|---|---|---|---|---|---|
77F |
LOCK WAIT |
2008-01-15 13:10:16 |
77F |
2008-01-15 13:10:16 |
1 |
876 |
INSERT INTO t09 (D, B, C) VALUES … |
77E |
LOCK WAIT |
2008-01-15 13:10:16 |
77E |
2008-01-15 13:10:16 |
1 |
875 |
INSERT INTO t09 (D, B, C) VALUES … |
77D |
LOCK WAIT |
2008-01-15 13:10:16 |
77D |
2008-01-15 13:10:16 |
1 |
874 |
INSERT INTO t09 (D, B, C) VALUES … |
77B |
LOCK WAIT |
2008-01-15 13:10:16 |
77B:733:12:1 |
2008-01-15 13:10:16 |
4 |
873 |
INSERT INTO t09 (D, B, C) VALUES … |
77A |
RUNNING |
2008-01-15 13:10:16 |
NULL |
NULL |
4 |
872 |
SELECT b, c FROM t09 WHERE … |
E56 |
LOCK WAIT |
2008-01-15 13:10:06 |
E56:743:6:2 |
2008-01-15 13:10:06 |
5 |
384 |
INSERT INTO t2 VALUES … |
E55 |
LOCK WAIT |
2008-01-15 13:10:06 |
E55:743:38:2 |
2008-01-15 13:10:13 |
965 |
257 |
INSERT INTO t2 VALUES … |
19C |
RUNNING |
2008-01-15 13:09:10 |
NULL |
NULL |
2900 |
130 |
INSERT INTO t2 VALUES … |
E15 |
RUNNING |
2008-01-15 13:08:59 |
NULL |
NULL |
5395 |
61 |
INSERT INTO t2 VALUES … |
51D |
RUNNING |
2008-01-15 13:08:47 |
NULL |
NULL |
9807 |
8 |
INSERT INTO t2 VALUES … |
下表顯示在執行繁重工作負載的系統中,data_lock_waits
表格的內容。
請求中的交易 ID | 請求的鎖定 ID | 封鎖 trx id | 封鎖鎖定 ID |
---|---|---|---|
77F |
77F:806 |
77E |
77E:806 |
77F |
77F:806 |
77D |
77D:806 |
77F |
77F:806 |
77B |
77B:806 |
77E |
77E:806 |
77D |
77D:806 |
77E |
77E:806 |
77B |
77B:806 |
77D |
77D:806 |
77B |
77B:806 |
77B |
77B:733:12:1 |
77A |
77A:733:12:1 |
E56 |
E56:743:6:2 |
E55 |
E55:743:6:2 |
E55 |
E55:743:38:2 |
19C |
19C:743:38:2 |
下表顯示在執行繁重工作負載的系統中,data_locks
表格的內容。
鎖定 id | 鎖定 trx id | 鎖定模式 | 鎖定類型 | 鎖定結構描述 | 鎖定資料表 | 鎖定索引 | 鎖定資料 |
---|---|---|---|---|---|---|---|
77F:806 |
77F |
自動遞增 |
表格 |
測試 |
t09 |
NULL |
NULL |
77E:806 |
77E |
自動遞增 |
表格 |
測試 |
t09 |
NULL |
NULL |
77D:806 |
77D |
自動遞增 |
表格 |
測試 |
t09 |
NULL |
NULL |
77B:806 |
77B |
自動遞增 |
表格 |
測試 |
t09 |
NULL |
NULL |
77B:733:12:1 |
77B |
X |
RECORD |
測試 |
t09 |
主要 |
至高虛擬記錄 |
77A:733:12:1 |
77A |
X |
RECORD |
測試 |
t09 |
主要 |
至高虛擬記錄 |
E56:743:6:2 |
E56 |
S |
RECORD |
測試 |
t2 |
主要 |
0, 0 |
E55:743:6:2 |
E55 |
X |
RECORD |
測試 |
t2 |
主要 |
0, 0 |
E55:743:38:2 |
E55 |
S |
RECORD |
測試 |
t2 |
主要 |
1922, 1922 |
19C:743:38:2 |
19C |
X |
RECORD |
測試 |
t2 |
主要 |
1922, 1922 |