开发上线完以后,到早上高峰期并发压力大,有可能因某个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情况,如果压力仍然大,再适当的降低连接数,最终等待开发回滚代码,保证数据库不宕机。
本文出自 “贺春旸的技术专栏” 博客,请务必保留此出处http://hcymysql.blog.51cto.com/5223301/1370888