【MySQL】鎖——檢視當前資料庫鎖請求的三種方法
MySQL版本:5.6.21
MySQL提供了檢視當前資料庫鎖請求的三種方法:
1. show full processlist命令
觀察state和info列
2. show engine innodb status\G 命令
檢視 TRANSACTIONS 部分和 LATEST DETECTED DEADLOCK 兩個部分
3. information_shcema下的三張表(透過這三張表可以更新監控當前事物並且分析存在的鎖問題)
—— innodb_trx (
列印innodb核心中的當前活躍(ACTIVE)事務)
—— innodb_locks
( 列印當前狀態產生的innodb鎖 僅在有鎖等待時列印)
(列印當前狀態產生的innodb鎖等待 僅在有鎖等待時列印)
1) innodb_trx表結構說明 (摘取最能說明問題的8個欄位)
欄位名 | 說明 |
trx_id | innodb儲存引擎內部唯一的事物ID |
trx_state |
當前事物狀態(running和lock wait兩種狀態) |
trx_started |
事物的開始時間 |
trx_requested_lock_id | 等待事物的鎖ID,如trx_state的狀態為Lock wait,那麼該值帶表當前事物等待之前事物佔用資源的ID,若trx_state不是Lock wait 則該值為NULL |
trx_wait_started | 事物等待的開始時間 |
trx_weight | 事物的權重,在innodb儲存引擎中,當發生死鎖需要回滾的時,innodb儲存引擎會選擇該值最小的進行回滾 |
trx_mysql_thread_id | mysql中的執行緒id, 即show processlist顯示的結果 |
trx_query | 事物執行的SQL語句 |
2)innodb_locks表結構說明
欄位名 | 說明 |
lock_id |
鎖的ID |
lock_trx_id |
事物的ID |
lock_mode |
鎖的模式(S鎖與X鎖兩種模式) |
lock_type |
鎖的型別 表鎖還是行鎖(RECORD) |
lock_table |
要加鎖的表 |
lock_index |
鎖住的索引 |
lock_space |
鎖住物件的space id |
lock_page |
事物鎖定頁的數量,若是表鎖則該值為NULL |
lock_rec |
事物鎖定行的數量,若是表鎖則該值為NULL |
lock_data |
事物鎖定記錄主鍵值,若是表鎖則該值為NULL(此選項不可信) |
3)innodb_lock_waits表結構說明
欄位名 | 說明 |
requesting_trx_id |
申請鎖資源的事物ID |
requested_lock_id |
申請的鎖的ID |
blocking_trx_id |
阻塞其他事物的事物ID |
blocking_lock_id |
阻塞其他鎖的鎖ID |
可以根據這三張表進行聯合查詢,得到更直觀更清晰的結果,可以參考如下SQL(可根據自己的分析習慣適進行調整)
select
r.trx_isolation_level,
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_trx_thread,
r.trx_state waiting_trx_state,
lr.lock_mode waiting_trx_lock_mode,
lr.lock_type waiting_trx_lock_type,
lr.lock_table waiting_trx_lock_table,
lr.lock_index waiting_trx_lock_index,
r.trx_query waiting_trx_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_trx_thread,
b.trx_state blocking_trx_state,
lb.lock_mode blocking_trx_lock_mode,
lb.lock_type blocking_trx_lock_type,
lb.lock_table blocking_trx_lock_table,
lb.lock_index blocking_trx_lock_index,
b.trx_query blocking_query
from information_schema.innodb_lock_waits w
inner join information_schema.innodb_trx b
on b.trx_id=w.blocking_trx_id
inner join information_schema.innodb_trx r
on r.trx_id=w.requesting_trx_id
inner join information_schema.innodb_locks lb
on lb.lock_trx_id=w.blocking_trx_id
inner join information_schema.innodb_locks lr
on lr.lock_trx_id=w.requesting_trx_id\G;
*************************** 1. row ***************************
trx_isolation_level: REPEATABLE READ
waiting_trx_id: 2900247
waiting_trx_thread: 1070
waiting_trx_state: LOCK WAIT
waiting_trx_lock_mode: S
waiting_trx_lock_type: RECORD
waiting_trx_lock_table: `jiang_test`.`test`
waiting_trx_lock_index: PRIMARY
waiting_trx_query: select * from test where id=3 lock in share mode
blocking_trx_id: 2900241
blocking_trx_thread: 1137
blocking_trx_state: RUNNING
blocking_trx_lock_mode: X
blocking_trx_lock_type: RECORD
blocking_trx_lock_table: `jiang_test`.`test`
blocking_trx_lock_index: PRIMARY
blocking_query: NULL
1 row in set (0.01 sec)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-2132652/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL檢視當前資料庫庫MySql資料庫
- 三種檢視MySQL資料庫版本的方法MySql資料庫
- 用命令檢視當前登入資料庫版本(3種方法)資料庫
- mysql鎖以及鎖資訊檢視MySql
- 資料庫篇:mysql事務原理之MVCC檢視+鎖資料庫MySqlMVC
- 檢視MySql資料庫鎖,並殺死對應程式MySql資料庫
- 【轉載】檢視當前會話SID的三種方法會話
- 如何檢視資料庫當前的狀態?資料庫
- 檢視MySQL鎖等待的原因MySql
- 檢視MySQL鎖定情況MySql
- mysql鎖之三種行級鎖介紹MySql
- 檢視資料庫中的鎖(LOCK),找出程式及SQL資料庫SQL
- Oracle檢視被鎖物件及解鎖方法Oracle物件
- MySQL資料庫鎖介紹MySql資料庫
- MySQL資料庫-鎖詳解MySql資料庫
- MySQL 當中的各種鎖(中級篇)MySql
- 檢視當前Oracle資料庫的時間及其SCN號Oracle資料庫
- 如何檢視MySQL資料庫一段時間內的連線情況?兩種方式來解鎖~MySql資料庫
- mysql InnoDB鎖等待的檢視及分析MySql
- 詳解 MySql InnoDB 中的三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)MySql
- 資料庫篇:mysql鎖詳解資料庫MySql
- 檢視MySQL資料庫大小的方法總結MySql資料庫
- oracle死鎖的檢視及kill方法Oracle
- MySQL InnoDB設定死鎖檢測的方法MySql
- oracle 檢視鎖表和解鎖Oracle
- oracle檢視被鎖的表和解鎖Oracle
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- 解鎖資料庫使用者、檢視登陸幾次才鎖定使用者資料庫
- MySQL檢視當前使用的配置檔案my.cnf的方法MySql
- 【資料庫——鎖】資料庫
- 求:如何用JDBC給資料表上鎖,而不用資料庫本身的鎖表語句?JDBC資料庫
- 當面試官問到:《MySQL資料庫的鎖機制》該如何拿分?面試MySql資料庫
- 前端請求後端資料的三種方式!前端後端
- MySQL資料庫故障分析-鎖等待(一)MySql資料庫
- 資料庫中的共享鎖與排他鎖資料庫
- oracle當前執行事務鎖Oracle
- mysql行鎖和死鎖檢測MySql
- 檢視資料庫的當前連線session,以及其執行的sql資料庫SessionSQL