本文实例讲述了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%';