【实验班】MySQL的问题以及解决过程
牢骚向
Forword
我一开始使用MySQL我就后悔了,因为我深深的体会到,在sql型数据库中,当表之间关系复杂以后,要删除一条信息是有多么的困难。而几乎所有的第三方MySQL库使用的还是原生的sql语句。且不说sql语句的拼接被x问题,sql的高阶语法本身就非常的反人类。加上我已经习惯了noSQL带来的好处(直接字典\对象操作),仿佛就从天堂到了地狱。
The problem
前台说请求报错,她那里格式正常。启动服务器简单脚本测试,发送get正常,post报pipeBroken
。重启应用,好了。过了半天,一发post,跪。
Debug
get能用,post挂了,肯定是数据库问题,看了下错误类型,连接管道断了,那就是pymysql的问题。
第一反应,连接对象过期了,定期更新it,无解。
加快更新频率,无解。
启用连接池,加大连接节点数,加快更新频率,均无解。此时已过2周,暂时用无限手动重启应用的方法应付问题。
通过supervisor
查应用日志,发现启动应用大约过了半天时间一发post
服务器才会pipeBroken
,而报错期间并没有主动断开。就是过期了啊(葛优瘫)
Fix up
经过一段时间的思考,我感觉是MySQL本身的问题,查了一会相关资料,把服务器日志pipeBroken
的报文Google了一下,发现是MySQL长时间没有操作,进入睡眠了。。
进入MySQL交互界面输入
show variables like '%timeout%';
发现wait_timeout
的值为28800s,相等于8小时没操作MySQL就会断开连接。于是我用最简单暴力的方法:
set global wait_timeout=2880000;
服务器再也不频繁抛错了。至于之前的那些解决方案……先留着那些代码吧
Final
在条件允许的情况下,尽量使用更加稳定而简单的nosql数据库,避免给自己挖坑
improve(date: Dec.)
修改MySQL变量不是权宜之计,MySQL休眠是因为长期没有操作,所以自动断开连接节点,而且不是所有的服务器都支持修改MySQL全局变量的,有时候root也不能改- -。所以用计时器每隔一段时间向MySQL发一次查询,重置连接时间。若还抛出错误pipeBroken
的时候换一条新的管道。
实际效果:MySQL能够平稳的运行好几天,几天之内查询成功率在90%左右,仍然不太能够令人满意,但是相比以前,已经进步了很多。。