MySQL中经典的too many connection怎么破

2018-09-26 22:20 作者:产品案例 来源:环亚娱乐ag88旗舰

  细心的同学就会发现:那如果出现max_user_connections 的报错,就无法发现啦,这块目前我还没找到对应status。

  没有任何query,只是sleep,这种情况一般是代码里面没有主动及时释放链接导致。

  由于代码没有主动及时的释放链接,那么在DB Server中存在大量的sleep链接,一旦超过max_connections则报错。

  (1)遇到这样的报错,如果没有及时解决,则会导致后面的业务都一直连不上数据库,影响面很大。

  (2)所以我们第一件事情必须是保护数据库,kill掉这些sleep链接。关于kill这件事,又有很多技巧可以谈:

  如果是人工kill,碳银与浙江工行合作开发金融产品,这简直无法完成这样艰巨的任务,因为业务会时刻产生这样的sleep链接,有无尽头

  如果自己写脚本,没秒去kill,当然可行。但是我们却碰到过非常极端的情况,那就是MySQL无法响应你的kill请求。

  所以,这里还有一个更加靠谱的方案就是:设置wait_timeout, 它会自动帮你完成这项庞大且艰巨的任务,且一定可以kill掉

  (3)完成上面几个步骤之后,只能保证你的数据库不会被压到,且你有机会登陆进去做一些管理事情,但要彻底解决还必须让业务方处理这些sleep链接。

  通常,如果可以,DBA协助业务方提供TMC期间top ip,让业务方排查服务哪里异常。

  (4)启用thread_pool功能可能可以解决这个问题,但是由于种种原因没有使用。

  一般这种情况,也非常清晰明了,找到它,优化它,当然前提是你的数据库还活着。

  我们通常有SQL防火墙保护,大大降低了这样的风险。预知SQL防火墙为何物,且听下回分享。

  难点就是:因为它不是真正的slow,优化点难以寻找,所谓对症下药,d88尊龙,就是要找到对应的症状,这也是难点所在。

  innodb_concurrency_tickets: 一旦进入innoDB,就会获取一个票据tickets,在票据期间可以随意进入innoDB不需要排队,如果用完了,理论上则要排队(实测后发现并不是严格这套机制)

  2. 通过trx_started,now()分析得出:这些query直接的切换轮询并不是真正意义上的平均公平分配,里面有一套自己的自适应算法,这里面我没有深究下去,有兴趣的同学可以继续了解源码。

  3. 既然真正的原因找到,那么解决方案也就很快出来,那就是让并发线程少一点,通过我们的omega平台可以很方便地得出这段时间哪些query和connect最多,那么协助业务一起沟通业务场景和优化方案,问题得到解决。