1. 程式人生 > >mysql死鎖檢視

mysql死鎖檢視

檢視事務等待狀況

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;