开发上线完以后,到早上高峰期并发压力大,有可能因某个SQL的原因把数据库给打死,参考《一个引号导致1个小时网站打不开》,这个时候你可以用pt-kill杀死,但连接数过高,CPU负载很高,这个工具根本没法去处理,数据库这个时候已经成瘫痪状态,那么应该怎么办?


首先要保证数据库不能被打死,先让数据库压力降下来,这里就要做一些限制措施。

我们先用iptables封死3306端口,先把压力降下来,然后tail -n 100 mysql.slow查看慢日志,找出那条耗时时间长的SQL,并通知开发。

#!/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并发处理请求。

set global max_connections = 210;
set global max_user_connections = 200;
set global innodb_thread_concurrency = 8;


然后再iptables -F打开3306端口,观察数据库运行状态和CPU情况,如果压力仍然大,再适当的降低连接数,最终等待开发回滚代码,保证数据库不宕机。