mysql死锁查看

xiaoxiao2025-06-03  45

查看事务等待状况

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;
转载请注明原文地址: https://www.6miu.com/read-5031224.html

最新回复(0)