【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事務原理之MVCC檢視+鎖資料庫MySqlMVC
- 檢視MySQL鎖等待的原因MySql
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- mysql鎖之三種行級鎖介紹MySql
- MySQL資料庫鎖介紹MySql資料庫
- MySQL資料庫-鎖詳解MySql資料庫
- MySQL 當中的各種鎖(中級篇)MySql
- 如何檢視MySQL資料庫一段時間內的連線情況?兩種方式來解鎖~MySql資料庫
- 資料庫篇:mysql鎖詳解資料庫MySql
- MySQL InnoDB設定死鎖檢測的方法MySql
- 詳解 MySql InnoDB 中的三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)MySql
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- oracle檢視被鎖的表和解鎖Oracle
- MySQL資料庫故障分析-鎖等待(一)MySql資料庫
- 資料庫中的共享鎖與排他鎖資料庫
- mysql行鎖和死鎖檢測MySql
- 前端請求後端資料的三種方式!前端後端
- 檢視鎖表
- 當面試官問到:《MySQL資料庫的鎖機制》該如何拿分?面試MySql資料庫
- YApi 新版如何檢視 http 請求資料APIHTTP
- 檢視oracle被鎖的表是誰鎖的Oracle
- 面試官問:請介紹一下MySQL資料庫的鎖機制?面試MySql資料庫
- vue2.0資料更新,重新渲染檢視的三種方法Vue
- $request 請求方法 獲取 API 的當前使用者API
- 檢視mysql版本的六種方法MySql
- 在 Linux 中鎖定和解鎖使用者帳戶的三種方法Linux
- POST 請求的三種常見資料提交格式
- mysql鎖分析相關的幾個系統檢視MySql
- mysql binlog檢視指定資料庫MySql資料庫
- MySQL建立資料庫的兩種方法MySql資料庫
- 資料庫系列:MySQL InnoDB鎖機制介紹資料庫MySql
- 【資料庫】MySQL鎖機制、熱備、分表資料庫MySql
- Java中管理資料庫併發的6種鎖模式Java資料庫模式
- MySql(三) MySql中的鎖機制MySql
- 三種方法在當前目錄下開啟cmd命令視窗
- 資料庫鎖機制資料庫
- Yii2 獲取當前請求的路由資訊路由
- 解鎖你的資料庫:JPA和Hibernate的樂觀鎖與悲觀鎖資料庫
- Innodb中怎麼檢視鎖資訊