tidb可以禁止某条sql执行吗

比如说现在在慢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 应该是可以精确到毫秒级别

4 个赞

写一个监控脚本,执行时间超过多久就kill掉sql

不错,一些特定场景的处理方法。

赞一个,不错的思路

这个思路不错

:rofl:有一说一,可以换开发了~我们这边开发首要考虑的就是能热更新,局部升级~~~
还是看看其他大佬有什么建议吧。

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,只能通过以下方式:

  1. 应用或者客户端不要执行这条sql
  2. 如果该sql是慢查询则优化这条sql
  3. 有必要的情况下可以给这个慢sql绑定比较好的执行计划。
1 个赞

一般如果太慢了,只能让开发优化业务逻辑了

测试了一把,挺好使。