说明:
因为线上mysql实例太多,也就经常会遇到Too many connections的问题。出现这种问题的时候业务已经出现问题。此时最重要的还是先恢复业务。这里可以先获取show innodb status和show full processlist的信息以便等会分析原因。当然要先能连得进mysql。可以通过临时将连接数稍微调大,让自己能登陆上去,一般这种情况下登陆的时候也会出现Too many connections的提示,那么该如何做呢?这时候可以在主上面写一个死循环不停的连接主mysql以保证自己能正常登录,如:while true;do mysql -uroot -ppassword -S /tmp/mysql_3306.sock;done
实现:
1.手动清除锁表进程
mysql> show processlist; //进到mysql后,可以看到一大堆sleep进程没有一千也有几百条,而且时间都很长。
| 106089637 | test | 192.168.2.8:44449 | TEST | Lock | 134 |
| 106089638 | test | 192.168.2.8:44451 | TEST | Lock | 4123 |
……
出来好几屏幕的, , 查询语句把表锁住了,.
mysql> kill thread_id; // kill掉第一个锁表进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.
2.shell脚本批量清除锁表进程
#!/bin/bash mysql -uroot -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
当然了, 也可以一行搞定
#!/bin/bash for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'` do mysqladmin kill ${id} done
附录:
当然,可以通过限制用户连接mysql的连接数也可以一直程度上缓存mysql实例多导致的锁表多问题。
# mysql -uroot -p
mysql> grant all on username.*to’databasename’@’localhost’ with MAX_USER_CONNECTIONS 4 MAX_CONNECTIONS_PER_HOUR 1000; //WITH MAX_USER_CONNECTIONS 4,限制最大连接数;MAX_CONNECTIONS_PER_HOUR 1000,限制每小时最大连接数