比如说现在在慢sql里面发现某个慢sql刷屏,想禁止这条sql执行有什么好办法么
好像目前没有,各种关系型数据库都可能存在类似问题
极端情况下(把实例打爆,影响其他核心服务的话)常有的解决方法:
1)守护进程定点定时kill这个慢SQL;
2)如果允许,把涉及的table 临时rename一个其他的名字;
3)如果访问用户独立的话,可以临时修改下用户名字,使其无法登录;
4)如果是不重要的表,是否可以清理一些数据?
暂时想到的有这些,知道的 可以补充下。
试试pt-kill,最好还是解决代码问题
我们遇到这种情况都是从源头处理,找到对应的系统、应用、作业等,进行优化调整或直接关闭。
正常是这样处理的,但找不到开发 或者开发需要很久上线才能处理的情况下,跟开发沟通后的临时应急解决手段
可以利用sql binding 的方式处理,例如
create global binding for
select count(1) from sbtest1 a,sbtest1 b
using
select /*+ max_execution_time(1000) */ count(1) from sbtest1 a,sbtest1 b ;
mysql> select count(1) from sbtest1 a,sbtest1 b ;
ERROR 1317 (70100): Query execution was interrupted
这样慢语句就不能执行很久,max_execution_time 应该是可以精确到毫秒级别
写一个监控脚本,执行时间超过多久就kill掉sql
不错,一些特定场景的处理方法。
赞一个,不错的思路
这个思路不错
有一说一,可以换开发了~我们这边开发首要考虑的就是能热更新,局部升级~~~
还是看看其他大佬有什么建议吧。
MySQL 8.0有防火墙插件,tidb以后可以考虑往这个方向发展
这个办法还真好.学到了
如果不需要这个语句运行就直接写
create global binding for
select count(1) from sbtest1 a,sbtest1 b
using
select /*+ max_execution_time(1) */ count(1) from sbtest1 a,sbtest1 b ;
这个办法的确好
就我所掌握的目前只知道exadata中有这个功能,其他数据库估计也在陆续开发中。你意思是把这个SQL拉黑,禁止运行对吧
我也这么认为,提问题的估计也是公司环境,开发强势,自己无力改变。但是又要兜底处理。
tidb中目前没有可以阻止某条sql执行。一旦出现了不想看到的sql,只能通过以下方式:
- 应用或者客户端不要执行这条sql
- 如果该sql是慢查询则优化这条sql
- 有必要的情况下可以给这个慢sql绑定比较好的执行计划。
一般如果太慢了,只能让开发优化业务逻辑了
测试了一把,挺好使。