开发上线完以后,到早上高峰期并发压力大,有可能因某个SQL的原因把数据库给打死,参考《一个引号导致1个小时网站打不开》,这个时候你可以用pt-kill杀死,但连接数过高,CPU负载很高,这个工具根本没法去处理,数据库这个时候已经成瘫痪状态,那么应该怎么办?
首先要保证数据库不能被打死,先让数据库压力降下来,这里就要做一些限制措施。
我们先用iptables封死3306端口,先把压力降下来,然后tail -n 100 mysql.slow查看慢日志,找出那条耗时时间长的SQL,并通知开发。
1
2
3
4
5
6
7
|
#!/bin/bash
#保证本机可以访问MySQL
iptables -s localhost -A INPUT -p tcp --dport
3306
-j ACCEPT
#保证监控机可以访问MySQL,以免造成HA切换。
iptables -s 监控机IP地址 -A INPUT -p tcp --dport
3306
-j ACCEPT
#封杀应用连接数的所有IP地址
iptables -A INPUT -p tcp --dport
3306
-j DROP
|
然后下一步,我们要修改参数限制数据库连接数的并发以及InnoDB并发处理请求。
1
2
3
|
set
global max_connections =
210
;
set
global max_user_connections =
200
;
set
global innodb_thread_concurrency =
8
;
|
然后再iptables -F打开3306端口,观察数据库运行状态和CPU情况,如果压力仍然大,再适当的降低连接数,最终等待开发回滚代码,保证数据库不宕机。
本文转自hcymysql51CTO博客,原文链接: http://blog.51cto.com/hcymysql/1370888,如需转载请自行联系原作者