SQL事前巡检插件

news2024/10/6 6:42:27

背景:

事故频发

•在工作过程中每年都会看到SQL问题引发的线上问题,一条有问题的SQL足以拖垮整个数据库

不易发觉

•对于SQL性能问题测试在预发环境不易发现(数据量小)

•SAAS系统隔离字段在SQL条件中遗漏,造成越权风险

•业务初期SQL没问题,业务增长容易出现事故

•DBS慢SQL不支持实时报警,无法及时发现

•靠大家review代码总会出现遗漏

事后处理

•每次都是线上接口性能、数据库报警才意识到问题,再去优化SQL,此刻有可能引发线上的严重事故;

思考:

虽然我们上线前会做代码review,但是单纯通过人为去发现总是有遗漏;

而且我们更希望问题在测试和预发环境提前暴漏出来,尽量避免带到线上;

是否可以通过技术手段提前发现问题?

是否可以把人为发现变成自动预警?研发新工具来自动检测有问题的SQL!

问题:

我们可以通过拦截器进行拦截,并执行explain分析等操作,在高并发的情况下,我们如何减少对现有系统和数据库的影响??

对于相同的SQL重复请求我们是否可以做缓存进行拦截,避免重复解析?

既然找到有问题的SQL,我们是否可以结合大模型给出用户一个合理的优化建议?

综上所述,我们根据这些思考和遇到的问题设计一个可以事前进行SQL巡检的插件。

流程设计:

行动:

通过开发SQL巡检检插件查实现问题SQL自动预警

1.利用SQL拦截器,拦截系统执行的SQL

2.开启异步线程池,不阻碍业务流程的执行,解析SQL,忽略具体入参数据和格式,MD5加密SQL语句,为了防止重复SQL执行,将之前拦截过的MD5值缓存,可以自定义缓存时间,这段时间内容不会解析相同的SQL

3.为了保障业务系统的稳定性,接入插件的时候支持手动数据源的注入,可以选择主或者从,来执行后续的explain/show create table操作

4.通过explain/show create table执行的结果,以及SQL语句通过http/MQ发送给SQL巡检平台

5.SQL巡检平台接受信息进行内容拆分,获取表名和条件;

6.首先通过执行计划分析:如:[possible_keys][key]分析索引是否使用,如未使用会及时预警通知,并记录到巡检平台;

7.其次进行表和查询条件分析,通过读取平台的配置,设置某一个表的查询条件的校验规则(支持正则表达),如:xxx_info表条件必须使用xxx_code,如不符合规则也会及时预警通知,并记录到巡检平台;

SQL风险预警

【描 述】SQL安全检测-table_name(表名)不符合条件规则:.*org_no.* (正则表达式) 【traceId】wewrerew234234242342 (请求ID) 【执行方法】com.XXX.XXX.XX.FINDBYID(mapper方法) 【SQL内容】select * from table_name where xxx=1 and yyy=2 【系统名称】所属系统

SQL风险预警

【描 述】SQL索引检测-table_name(表名)未使用索引; 【traceId】aa6ac6c89bec4f7dfdfdf74719ae583 (请求ID) 【执行方法】XXXXXMapper.selectResult (mapper方法) 【SQL内容】select * from table_name where xxx=1 and yyy=2 【系统名称】所属系统

1.巡检平台提供了一些报警阈值管理、校验规则管理等,来满足不同系统的不同表的不同要求

2.巡检平台同时会把有问题的SQL进行展示,支持一键分析,因为之前咱们已经获取到执行计划结果和建表语句,把这些信息交给chatgpt,通过大模型分析,并返回响应的建议,辅助用户进行治理

总结:

插件接入成本低,能快速接入,不影响现有业务和流程;

通过自定义校验规则保障SQL的安全性,清除安全隐患;

通过自动巡检插件,我们能提前在测试预发环境自动发现SQL存在的问题;

通过精准报警,可以追踪到具体的功能请求链路,快递定位;

通过平台让大模型生成优化建议,指导我们快速优化SQL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

navicat连接MySQL时1045报错

当登录MySQL数据库出现 Error 1045 错误时,表明你输入的用户名或密码错误被拒绝访问了;MySQL服务搭建后,默认root用户是不能进行远程访问连接的。 无法连接的可能有: 数据库没开启——开启数据库 用户名或密码错误——更改密码 连…

【探索】文字游侠AI新时代,每天5分钟自动化创作图文月入1万+,十分适合新手小白,附上渠道和教程(全面)

在这个信息爆炸的时代,内容创作者面临着空前的竞争。为了在今日头条这样的平台上脱颖而出并获取稳定收入,他们需要找到更高效、更创新的方法。而今,一款全新的AI工具正引领着一场革命,彻底改变了内容创作的生态。 自从GPT问世以来…

PZK via OWF

参考文献: [SMP88] Santis A, Micali S, Persiano G. Non-Interactive Zero-Knowledge with Preprocessing[C]//Advances in Cryptology—CRYPTO’88.[LS90] Lapidot D, Shamir A. Publicly verifiable non-interactive zero-knowledge proofs[C]//Advances in Cry…

C++ stack和queue的使用方法与模拟实现

文章目录 一、 stack的使用方法二、 queue的使用方法三、 容器适配器四、 stack的模拟实现五、 queue的模拟实现 一、 stack的使用方法 stack介绍文档 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的…

8 聚类算法

目录 0 背景 1 Kmeans 1.1 聚类数量k的确定 2 DBSCAN 2.1 三个点 2.2 算法流程 3 层次聚类 3.1 过程 4 基于分布的聚类:高斯混合模型 0 背景 聚类算法是一种无监督学习技术,用于将数据集中的数据点划分为不同的组或簇,使得同一组内的数据点彼此相…

线性卷积和圆周卷积

文章目录 【 1. 线性卷积 】1.1 图解分析1.2 矩阵相乘实现线性卷积1.3 圆周卷积实现线性卷积1.4 实例:线性卷积的两种实现方法【 2. 圆周卷积 】2.1 图解分析2.2 矩阵相乘实现圆周卷积2.3 频域点乘实现圆周卷积2.4 实例:圆周卷积两种实现方法【 3. 线性卷积和圆周卷积的等价 …

算法导论 总结索引 | 第三部分 第十二章:二叉搜索树

1、搜索树数据结构 支持 许多动态集合操作,包括 SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT 和 DELETE 等。使用搜索树 既可以作为一个字典 又可以作为一个优先队列 2、二叉搜索树上的基本操作 所花费的时间 与这棵树的高度成正比。对于有n个结点的…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板,最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U,教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要: 尽管 CQT 代币流通供应量增加了 20%(新增 1.04 亿枚 CQT),但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%,多次达到 2.75 亿美元&#xff0c…

QT5之事件——包含提升控件

事件概述 信号就是事件的一种,事件由用户触发; 鼠标点击窗口,也可以检测到事件;产生事件后,传给事件处理,判断事件类型,后执行事件相应函数; 类似单片机的中断(中断向量…

STL 标准模板库

以下是一些常用的STL容器: vector:动态数组,提供快速的随机访问。list:双向链表,支持快速插入和删除操作。set:有序集合,存储唯一的元素。map:有序映射,存储键值对。sta…

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库(MySQL)—— DQL语句(基本查询和条件查询) 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习: 什么是DQL语句 MySQL中的DQL(Data Q…

【Docker第一课】docker的基本命令和试启动容器(详细图解)

目录 知识梗概 docker的初步了解 了解docker常用命令 试开启容器(这里演示nginx、python3和mysql) 1、nginx容器的启动 2、python3容器的启动 docker的作用 虚拟机与容器的区别 写在前面: 本专栏你将了解docker一些入门知识&#xff…

【解决方案】Can‘t exec “locale”: No such file or directory

【解决方案】Cant exec “locale”: No such file or directory 还可能出现的错误: 1. 报错原因: 缺少ldconfig 2. 解决方案: sudo apt-get download libc-bin dpkg -x libc-bin*.deb unpackdir/ sudo cp unpackdir/sbin/ldconfig /sbin/ s…

机器学习:深入解析SVM的核心概念【三、核函数】

核函数 **问题一:为什么说是有限维就一定存在高维空间可分呢?**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二:最终怎么得到函数**从对偶问题到决策函数的步骤:结论 **问题三:为什么说特征…

Coursera: An Introduction to American Law 学习笔记 Week 04: Constitutional Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 04: Constitutional LawKey Constitutional Law TermsSup…

Golang chan 实现原理

Golang:context基于go1.22版本 chan的作用和使用方法共享内存的优缺点 chan 的使用方法 chanel 的底层结构channel 结构体创建channel写流程异常处理写时有阻塞读流程写时无阻塞读流程,缓冲区有空间写时无阻塞读流程,缓冲区无空间写流程整体架…

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据? 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态,可以接收信息。 因此令SCON 0x50; 怎么知道收到数据? 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

Matlab各个版本介绍、区别分析及推荐

MATLAB,由美国MathWorks公司出品,是一款广泛应用的商业数学软件。自其诞生之初,MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域,赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

基于springboot+vue+Mysql的学生毕业离校系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…