生产前的测试方案 生产环境如何平滑实施 生产坏境中遇到哪些困难 我们的解决方案 价值与意义
这个项目的起源,来源于生产环境中的N次误删数据,所以才有他的姊妹篇文章,一个神奇的参数前传
3.1 why 为什么要做测试方案
总之,我们需要无缝升级,怎么样才能既加强安全防范,又不影响业务呢? 这就是我们的SQL防火墙系统的升级改造之路
3.2 如何测试 非常感谢DBA团队袁俊敏同学的细心测试
3.3 哪些语句会触发sql_safe_update报错
总结: 没有使用索引的DML语句,都会被触发
log_queries_not_using_indexes=on long_query_time = 10000 log_queries_not_using_indexes 无长连接的概念,立即对所有链接生效 通过log_queries_not_using_indexes=on + long_query_time = 10000 可以抓出所有我们需要的dml,解决掉这些sql,我们的目的就达到了
这边说一个典型的坑 你们真的以为设置了log_queries_not_using_indexes就一定能够抓出我们需要的DML吗?
故障一
master 由于对于长连接不生效,所以全表更新dml在master执行了,那么意味着,你以为可以保障MySQL安全,其实只是自欺欺人而已
有人说,那简单,我们直接全部删掉所有链接就好了。 的确,全部删除,的确可以做到,但是是不是有点粗暴呢?
那就让业务方将所有长连接应用重启 这。。。业务方会很崩溃,也不可能停掉所有的长连接服务
如何找到长连接 长连接的特点:长 那么MySQL里面的show processlist有两个非常重要的属性 Id: session id Time: command status time 误区 这里有大部分人会根据Time来识别这个链接是不是长连接,那么他一定不理解time的含义 它并不是链接的时间长短,而是command某个状态的时间而已
大家已经猜到,最终的方案就是通过session id来判断识别长连接
4.0 先在master上设置sql_safe_update=on 4.1 然后假设10:00 show processlist,记录下所有的id 4.2 那么明天10:00 show processlist,与上一次的id进行匹配,如果匹配中了,那么说明这个connection已经存在一天,那么可以认为他是长连接了 4.3 判断这些id对应的用户权限,只读账号忽略 4.4 kill掉这些长连接即可(注意:repl,system user 这些系统进程不要被误删掉了,否则哭都来不及) 4.5 可以根据host:port告知业务方,一起配合重启和kill之后的观察
目前我们已经完成了N组DB集群的设置
这里有很多人有疑问:
我是这么理解的: