设为首页 收藏本站
查看: 898|回复: 0

[经验分享] 转:解决mysql锁表终极方法

[复制链接]

尚未签到

发表于 2016-9-13 06:51:24 | 显示全部楼层 |阅读模式
  很多时候!一不小心就锁表!这里讲解决锁表终极方法!
  案例一
  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-271357-1-1.html 上篇帖子: mysql ibdata 分开 下篇帖子: Mysql 常见命令总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表