tidb设置黑名单sql

tidb4版本,如何将某条sql设为黑名单,永久屏蔽

绑定MAX_EXECUTION_TIME(1)不知道行不行

应该只有max_execution_time的hint。

如何阻止特定的 SQL 语句执行(或者将某个 SQL 语句加入黑名单)?

对于 v7.5.0 及以上版本,你可以使用 QUERY WATCH 语句将特定的 SQL 查询加入黑名单。具体使用方法参见管理资源消耗超出预期的查询 (Runaway Queries)

对于 v7.5.0 之前版本,你可以使用 MAX_EXECUTION_TIME Hint 来创建 SQL 绑定,将特定语句的执行时间限制为一个较小的值(例如 1ms)。这样,语句就会在超过限制时自动终止。

7.5以前只能用MAX_EXECUTION_TIME这个绑定

官方文档有描述

4版本应该还没有黑名单的功能

理论上可行,但是还是会请求到服务器

看过官方的这个文档,但是这种方式请求还是会到数据库

这种方式只是限制了请求时间,但不是拦截

那TiDB层面应该就没有别的拦截方法了,或者你在TiDB上面还有负载均衡的中间件也有可能实现,其他的应该就没了。

那没办法了,低版本好像只能这么搞

SQL执行的很频繁吗?

可以从权限方面限制相应用户访问,或者在应用层面去优化SQL

是的,一小时几千次

就是无法追踪到具体的业务模块

连接用haproxy了吗?试试在这层做限制呢?大模型给的配置方法:


frontend mysql_frontend
    mode tcp
    bind :3306
    option tcplog
    
    # 定义需要拦截的SQL关键词ACL
    acl dangerous_sql req.payload(0,1024) -m reg -i "(DROP|TRUNCATE|ALTER|CREATE|DELETE FROM|UPDATE .* WHERE 1=1)"
    acl drop_table req.payload(0,1024) -m reg -i "DROP TABLE (IF EXISTS )?[a-zA-Z0-9_]+"
    acl truncate_table req.payload(0,1024) -m reg -i "TRUNCATE TABLE [a-zA-Z0-9_]+"
    
    # 拦截危险SQL语句
    tcp-request content reject if dangerous_sql
    tcp-request content reject if drop_table
    tcp-request content reject if truncate_table
    
    default_backend mysql_servers

backend mysql_servers
    mode tcp
    balance leastconn
    server mysql1 192.168.1.10:3306 check
    server mysql2 192.168.1.11:3306 check

sql黑名单的需求的确第一次听说啊

使用了,但是配置文件也没有frontend和backend的配置啊,万一把服务搞坏了就麻烦了

主要是为了限制一些指定的sql请求到数据库层面

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。