mysql死鎖檢視
阿新 • • 發佈:2018-12-18
檢視事務等待狀況
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 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;
檢視更具體的事務等待狀況
select b.trx_state, e.state, e.time, d.state as block_state, d.time as block_time, a.requesting_trx_id, a.requested_lock_id, b.trx_query, b.trx_mysql_thread_id, a.blocking_trx_id, a.blocking_lock_id, c.trx_query as block_trx_query, c.trx_mysql_thread_id as block_trx_mysql_tread_id from information_schema.innodb_lock_waits a left join information_schema.innodb_trx b on a.requesting_trx_id = b.trx_id left join information_schema.innodb_trx c on a.blocking_trx_id = c.trx_id left join information_schema.processlist d on c.trx_mysql_thread_id = d.id left join information_schema.processlist e on b.trx_mysql_thread_id = e.id order by a.requesting_trx_id;
檢視未關閉的事務
mysql 5.5/mysql5.7
select a.trx_id, a.trx_state, a.trx_started, a.trx_query, b.id, b. user, b. host, b.db, b.command, b.time, b.state, b.info from information_schema.innodb_trx a left join information_schema.processlist b on a.trx_mysql_thread_id = b.id where b.command = 'sleep';
mysql 5.6
select
a.trx_id,
a.trx_state,
a.trx_started,
a.trx_query,
b.id,
b.user,
b.db,
b.command,
b.time,
b.state,
b.info,
c.processlist_user,
c.processlist_host,
c.processlist_db,
d.sql_text
from
information_schema.innodb_trx a
left join information_schema.processlist b on a.trx_mysql_thread_id = b.id
and b.command = 'sleep'
left join performance_schema.threads c on b.id = c.processlist_id
left join performance_schema.events_statements_current d on d.thread_id = c.thread_id;
未關閉事務資訊
select
t1.trx_id,
t1.trx_started,
t1.trx_mysql_thread_id,
t3.event_id,
t3.end_event_id,
t3.sql_text,
concat('mysql --login-path=3306 -e ''kill ',t1.trx_mysql_thread_id,'''')
from
information_schema.innodb_trx t1
left join `performance_schema`.threads t2
on t1.trx_mysql_thread_id=t2.processlist_id
left join `performance_schema`.events_statements_history t3
on t2.thread_id=t3.thread_id
where
t1.trx_started < date_sub(now(), interval 1 minute)
and t1.trx_operation_state is null
and t1.trx_query is null
order by event_id desc
檢視某段時間以來未關閉事務
select
trx_id,
trx_started,
trx_mysql_thread_id
from
information_schema.innodb_trx
where
trx_started < date_sub(now(), interval 1 minute)
and trx_operation_state is null
and trx_query is null;
最後一次執行的sql語句,可以用於查詢未結束的事務
select
*
from
`performance_schema`.events_statements_current
where
thread_id in (
select
thread_id
from
`performance_schema`.threads
where
processlist_id = 108
)
檢視歷史會話
select
*
from
`performance_schema`.events_statements_history
where
thread_id in (
select
thread_id
from
`performance_schema`.threads
where
processlist_id = 84
)
檢視哪些使用者佔用了大量的資源
mysql> select * from user_summary\g
*************************** 1. row ***************************
user: root
statements: 3331 //使用者執行的sql語句總數量
statement_latency: 2.86 s //該使用者執行sql總的等待時間,即累計的sql執行時間
statement_avg_latency: 857.30 us //單次sql的平均執行時間
table_scans: 67 //全表掃描次數
file_ios: 23626 //io次數
file_io_latency: 1.72 s //io消耗的總時間
current_connections: 1 //該使用者的當前連線會話數
total_connections: 9 //該使用者連線會話總數
unique_hosts: 1 //使用者發起的連線中唯一主機的數量,即從幾個主機發起過資料庫連線
current_memory: 0 bytes //當前被分配的記憶體
total_memory_allocated: 0 bytes //總共被分配的記憶體
*************************** 2. row ***************************
user: background
statements: 0
statement_latency: 0 ps
statement_avg_latency: 0 ps
table_scans: 0
file_ios: 2127
file_io_latency: 161.74 ms
current_connections: 26
total_connections: 30
unique_hosts: 0
current_memory: 0 bytes
total_memory_allocated: 0 bytes
2 rows in set (0.02 sec)
通過上述查詢,可以簡單看到每個使用者佔用的連線、記憶體、io等資源
如果想要進一步查詢某項指標的話,可以檢視對應的檢視
檢視哪些使用者佔用的詳細指標
mysql> show tables like 'user%';
+-----------------------------------+
| tables_in_sys (user%) |
+-----------------------------------+
| user_summary |
| user_summary_by_file_io |
| user_summary_by_file_io_type |
| user_summary_by_stages |
| user_summary_by_statement_latency |
| user_summary_by_statement_type
mysql> select * from user_summary_by_statement_latency\g
這個檢視概述了每個使用者執行sql的大體統計資訊,本人簡單分析如下:
user 使用者名稱
total 該使用者總共執行的sql語句的數量
total_latency 執行sql總共的等待時間
max_latency 單次執行的最長等待時間
lock_latency 鎖等待累計時間
rows_sent 該使用者執行sql累積返回的行數
rows_examined 未執行使用者sql儲存引擎讀取的總行數
rows_affected 被使用者sql語句影響的總行數
full_scans 該使用者執行的sql中造成全表掃描的總次數
如果想了解各個使用者佔用的io頻寬,可查詢如下檢視
mysql> select * from user_summary_by_file_io\g
*************************** 1. row ***************************
user: root
ios: 23655
io_latency: 1.72 s
*************************** 2. row ***************************
user: background
ios: 2144
io_latency: 162.43 ms
2 rows in set (0.01 sec)
這個檢視相對比較簡單,列舉的是每個使用者下的io事件次數,以及io等待的累計時間
除此之外,我們還可以根據waits_by_user_by_latency檢視檢視每個使用者的等待事件
mysql> desc waits_by_user_by_latency;
通過sys schema查詢innodb的鎖資訊
innodb_lock_waits
mysql 5.7.7開始,sys schema中提供了innodb_lock_waits檢視,通過這個檢視,我們可以更直觀清晰地檢視當前事務間的阻塞關係。在此列舉幾個受關注的列,如下:
waiting_trx_id 等待事務的id
waiting_trx_age 等待的時間
waiting_query 等待鎖資源的sql
waiting_lock_mode 請求鎖的模式
blocking_trx_id 阻塞事務的id
blocking_trx_age 阻塞事務被執行的時間
blocking_query 阻塞事務正在執行的sql
blocking_lock_mode 阻塞的鎖模式
locked_table 被加鎖的表
locked_index 被加鎖的索引
schema_table_lock_waits
5.7.9中新增的檢視,通過這個檢視可以查詢阻塞會話的metadata lock資訊
解除正在死鎖的狀態有兩種方法:
第一種:
1.查詢是否鎖表
show open tables where in_use > 0;
2.查詢程序(如果您有super許可權,您可以看到所有執行緒。否則,您只能看到您自己的執行緒)
show processlist
3.殺死程序id(就是上面命令的id列)
kill id
第二種:
1.檢視下在鎖的事務
select * from information_schema.innodb_trx;
2.殺死程序id(就是上面命令的trx_mysql_thread_id列)
kill 執行緒id
例子:
查出死鎖程序:show processlist
殺掉程序 kill 420821;
其它關於檢視死鎖的命令:
1:檢視當前的事務
select * from information_schema.innodb_trx;
2:檢視當前鎖定的事務
select * from information_schema.innodb_locks;
3:檢視當前等鎖的事務
select * from information_schema.innodb_lock_waits;