MYSQL锁表问题解决

本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下:

很多时候!一不小心就锁表!这里讲解决锁表终极方法!

//1.查看当前数据库锁表的情况
SELECT * FROM information_schema.INNODB_TRX;
//2.杀掉查询结果中锁表的trx_mysql_thread_id
kill trx_mysql_thread_id

案例一

1
mysql>show processlist;

参看sql语句

一般少的话

1
mysql>kill thread_id;

就可以解决了

kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.

1
2
3
4
5
6
#!/bin/bash
mysql - u root - e " show processlist "  | grep - i " Locked "  >> locked_log . txt
for  line in  ` cat locked_log.txt | awk '{print $1 }'  `
do
echo " kill $line ; "  >> kill_thread_id . sql
done

现在kill_thread_id.sql的内容像这个样子

1
2
3
4
5
kill 66402982 ;
kill 66402983 ;
kill 66402986 ;
kill 66402991 ;
.....

好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.

1
mysql > source kill_thread_id . sql

当然了, 也可以一行搞定

1
2
3
4
for  id in  `mysqladmin processlist | grep -i locked | awk '{print $1}' `
do
mysqladmin kill ${id}
done

案例二

如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。

但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。

具体过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT  concat( 'KILL ' ,id, ';' ) FROM  information_schema.processlist WHERE  user = 'root' ;
+ ------------------------+
| concat( 'KILL ' ,id, ';' )
+ ------------------------+
| KILL 3101;     
| KILL 2946;     
+ ------------------------+
2 rows  IN  SET  (0.00 sec)
mysql> SELECT  concat( 'KILL ' ,id, ';' ) FROM  information_schema.processlist WHERE  user = 'root'  INTO  OUTFILE '/tmp/a.txt' ;
Query OK, 2 rows  affected (0.00 sec)
mysql> source /tmp/a.txt;
Query OK, 0 rows  affected (0.00 sec)

mysql查看被锁住的表
查询是否锁表
show OPEN TABLES where In_use > 0;


查看所有进程
MySQL:
show processlist;

mariabd:
show full processlist;
查询到相对应的进程===然后 kill id

杀掉指定mysql连接的进程号
kill $pid
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查看innodb引擎的运行时信息
show engine innodb status\G;
查看造成死锁的sql语句,分析索引情况,然后优化sql语句;

查看服务器状态
show status like '%lock%';
查看超时时间:
show variables like '%timeout%';

猜你喜欢

转载自www.cnblogs.com/edda/p/12984075.html