`

转:解决mysql锁表终极方法

 
阅读更多

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

案例一

mysql>show processlist;

参看sql语句

一般少的话

mysql>kill thread_id;

就可以解决了

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

#!/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的内容像这个样子

kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....

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

mysql>source kill_thread_id.sql

当然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done 

案例二 如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。
但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。
具体过程如下: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 + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家Share. 根据自己的实际需要,做了一些修改:

SHELL脚本:mysqld_kill_sleep.sh

#!/bin/sh 
mysql_pwd="root的密码" 
mysqladmin_exec="/usr/local/bin/mysqladmin" 
mysql_exec="/usr/local/bin/mysql" 
mysql_timeout_dir="/tmp" 
mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log" 
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh" 
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log" 
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_log 
awk '{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh 
echo "check start ...." >> $mysql_kill_timeout_log 
echo `date` >> $mysql_kill_timeout_log 
cat $mysql_kill_timeout_sh把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。 
执行之后显示: 

www# ./mysqld_kill_sleep.sh 
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

如果确认没有问题了,把最后的cat修改为sh即可。
本人改写了下上面的脚本:

#!/bin/bash 
mysql_pwd="密码" 
mysql_exec="/usr/local/mysql/bin/mysql" 
mysql_timeout_dir="/tmp" 
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh" 
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log" 
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log 
chmod 777 $mysql_kill_timeout_log 
for line in `$mysql_kill_timeout_log  | awk '{print $1}'` 
do 
echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $mysql_kill_timeout_sh 
done 
chmod 777 $mysql_kill_timeout_sh 
cat $mysql_kill_timeout_sh 是不是很方便呢!

最后贴个我在用的脚本

 

1
2
3
4
5
#!/bin/bash
mysql -uroot -pxxxxx -e "show processlist" |grep -i "Lock" |awk '{print $1}' >sqlid.sql
sed -i 's/^/kill\ /g' sqlid.sql
sed -i 's/$/;/g' sqlid.sql
mysql -uroot -pxxxxx -e "source /home/hgz/sqlid.sql"

sqlid.sql文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kill 2;
kill 1088;
kill 1265;
kill 1274;
kill 1287;
kill 1288;
kill 1289;
kill 1290;
kill 1291;
kill 1295;
kill 1296;
kill 1298;
kill 1299;
kill 1302;
kill 1304;
kill 1305;
kill 1309;

 

文章转自:http://hi.baidu.com/hunter6536/item/844223c05f0a9934449416ad

分享到:
评论

相关推荐

    MYSQL锁表问题的解决方法

    主要介绍了MYSQL锁表问题的解决方法,结合实例形式分析了MySQL锁表问题的常见情况与相应解决方法,需要的朋友可以参考下

    MySQL锁类型以及子查询锁表问题、解锁1

    MySQL锁类型以及查询锁表问题、解锁MySQL中select * for update锁表的范围MySQL中select * for update锁表的问题由

    MySQL数据库:锁定与解锁.pptx

    MySQL提供了LOCK TABLES语句来锁定当前线程的表,语法格式如下: LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} 说明: 表锁定支持以下类型的锁定。 READ:读锁定,确保用户可以读取表,...

    mysql锁表解表

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在...如果是产品环境的核心表出现了这样的锁等待队列,就会造成灾难性的后果。

    mysql转换postgresql工具

    该工具可以帮助用户将MySQL的表结构、数据和查询语句转换为适用于PostgreSQL的格式,以便在两个不同的数据库系统之间进行平滑迁移。 这些工具通常提供以下功能: 数据库结构转换:将MySQL的表、列、索引等结构转换...

    php提示Warning:mysql_fetch_array() expects的解决方法

    本文实例讲述了php提示Warning mysql_fetch_array() expects的解决方法,分享给大家供大家参考。具体分析如下: 在mysql数据库连接时碰到Warning: mysql_fetch_array() expects …错误提示,根据我的经验这个是sql...

    MySQL导入sql脚本错误:2006 解决方法

    MySQL导入sql脚本错误:2006 – MySQL server has gone away 到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 2006 - MySQL ...

    Oracle的表结构转成Mysql的表结构

    ORACLE表生成MYSQL建表DDL

    MYSQL 解锁与锁表介绍

    MySQL锁概述   相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁...

    mysql锁表1

    mysql锁表1

    创建mysql表分区的方法

    表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册mysql测试版本:mysql5.5.28mysql物理存储文件(有mysql配置的datadir决定存储路径)格式简介数据库engine为MYISAMfrm表结构文件,myd表数据...

    mysql启动提示mysql.host 不存在,启动失败的解决方法

    error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 从发了帖子,只有人看,没有人回复,看到这种情况只能自己解决问题了,自己动手...

    ASP.NET连接MYSQL的三种方法

    方法一:  使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL  该组件为MYSQL为ADO.NET访问MYSQL数据库设计的.NET访问组件。  安装完成该组件后,引用命名空间MySql.Data.MySqlClient;  使用...

    PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法

    本文实例讲述了PHP提示 Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法,在PHP程序开发中常会遇到这类问题。分享给大家供大家参考,具体的解决方法如下: 将下面代码改为mysqli或PDO...

    MySQL Innodb锁解决并发问题

    MySQL Innodb锁解决并发问题

    Java高级试听课:MySQL锁和事务篇.txt

    Java高级试听课:MySQL锁和事务篇

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql,在样本.txt粘贴Mysql的单表所有字段信息,输入表名。就会在控件台输出转换后的Oracle语句。

    Mysql高级:锁

    主要二个主题:锁机制和全局机制 锁机制:概述,三锁:表锁和行锁,页锁

Global site tag (gtag.js) - Google Analytics