前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQL治理高阶实践:异常防御体系建设与应用挖掘

SQL治理高阶实践:异常防御体系建设与应用挖掘

作者头像
jeanron100
发布于 2023-09-04 09:26:46
发布于 2023-09-04 09:26:46
3850
举报

本文〖deeplus直播:数据库应用与架构的创新实践〗线上分享演讲内容整理而成。

作者介绍

蔡朋,货拉拉DBA负责人。

分享概要

一、防微杜渐:异常SQL防御体系建设

二、深度观测:全量SQL分析与挖掘

三、容量预测:数据库仿真流量压测

一、防微杜渐:异常SQL防御体系建设

1.SQL治理阶段

如上图所示,SQL治理的基本阶段主要包括开发(事前)、测试(事中)、生产运维(事后)三阶段。

在开发阶段,研发通常不受相应开发规范和SQL审核约束。从开发到测试或生产发布时,才会进行DDL和DML的审核。目前业内SQL治理,主要还是在SQL出问题之后进行相应的治理。

所以我们思考:能否在测试阶段提前发现有问题的SQL,提前预判性能并治理?如何在事中进行SQL的兜底和止损?

之所以要把治理能力前置到测试阶段,是因为越早发现有问题的SQL,对整体治理或改造的成本就越低,对生产的影响也越小。

2.事前发现

1)SQLReview

SQLReview是在开发环境向测试环境或生产环境发布时,对语句进行基本审核。此部分的整体能力建设与当前业界主流的开源没有太大差别,只是我们的集成规范会更个性化或更丰富。

第一,根据DBA在日常中的反馈,完善相应规则并集成经验,如拦截特殊语法;

第二,集成三方规范。比如大数据包含某些特殊要求,要求每一张表必须有时间字段等特定字段、特定类型和特定索引,以供大数据抽取数据;

第三,广播变更消息,比如提供安全审计,变更大数据订阅结构变更;

第四,日志分析,分析热点表。DBA在日常运维时,需要一定数据统计来总结经验,梳理重点关注的业务,了解拦截最多的规则和问题最多的部门。

2)新增SQL检测

新增SQL检测是指在SQL执行到生产环节之前,将它拦截。实现流程中最重要的一点是,通过数据库代理中间件记录全量测试及生产的全量SQL、然后统一进行消费处理,识别出生产环境新增的SQL。

例如通过指纹计算,对比测试环境下SQL的指纹是否出现在生产最后的指纹库里。若不存在的话,就把它认定为一个新增的SQL,再放到生产环境中进行特征判断,比如它的扫描行数是否太多,是否存在全表扫描,索引特征是否出现index merge、file sort等,也包含执行时长,特殊禁止语法等全方位的特征判断。

但这种实现存在两个问题:

一是据统计,生产环境峰值QPS每秒上百万。由于生产的真实流量比较大,改进后,我们不再转发全量SQL,而是根据SQL指纹进行采样避免流量太大,但即便如此,每天处理的SQL量仍接近5TB。

二是指纹计算。上述SQL通过DBA直观去看,指纹计算应该是一致的。但由于早期我们采用开源的基于正则的SQL指纹计算库存在的不足,无法识别SQL在细微上的差异,导致指纹计算准确度差影结果判断。

改进后的指纹算法则采用语法解析树的方式,将SQL的关键对象抽取出来做特征处理,比如取出查询字段后做排序后再计算指纹,对where条件同样做排序处理,防止sharding表由于表名字不同,造成的计算差异同样进行特殊处理。

3)统计分析

我们统计了最近一个月的拦截量。在TP场景下,SQL问题大部分是索引问题,由上图可知,“索引不合理”和“缺少索引”的情况占比之和达到80%。因此能否通过技术手段进行自动合理索引创建就是解决问题的重点。

4)研发视角新增SQL质量报告

通过上图视角,研发可以了解每个DBA或每个部门,在具体时间范围内新增哪些 SQL,发到生产的新增SQL是否高危SQL,并清晰地记录下来。

质量报告还包含其他重要信息,比如 SQL被认定为高风险的原因。如上图所示,质量报告提示可能存在全表扫描的情况,然后记录其首次出现的时长和时间,使用开源索引工具给出基本建议。

但初期的建设还不太完善,开源工具仅基于单条SQL提出建议,缺少评估意见合理性的全局视角,我们后续会整体改写这部分。

5)不带隐患上生产

实现拦截功能需要与整个研发流程结合。

在CICD环节的准出阶段进行卡口集成,若出现高风险的慢查询或SQL没有处理的情况,会提示“不可上线”,避免隐患SQL上生产。

3.事中兜底

无论防御做得多好,随着数据库容量、QPS的增长,一些SQL会不可避免地逐步恶化为慢SQL,因此要具备兜底能力。

第一,通过中间件进行主动或被动的SQL限流或熔断,比如DBA会主动介入对某个SQL限流或者熔断;

第二,自研数据库管控平台。平台集成数据库自愈系统,通过查杀模块,实时检测每一个数据库实例的健康状况,并根据特征进行相应的SQL查杀等。

我们整体构建在混合云上。每一家云对于数据库的保护机制存在很大差别且是不可以跨云移植适用的,所以要打造自己统一的、通用的保护能力。

4.事后治理

事后治理主要是慢查询治理。由于混合云上要兼容产品比较多通过云商接口,拉文件的原始分析方式实现比较麻烦,具备全量SQL的能力后实现就较为简洁,后续接入多家云或兼容MySQL协议的产品时,能更好实现慢查询分析、分析及安全审计等能力。

使用单一云较为简单,而在混合云上时,为了某一能力的统一化或标准化,就不得不把管控系统设计得很复杂。

5.后续计划

前文提到,我们统计80%的SQL问题是索引问题。如上图统计,生产环境中单列索引占比77%,复合索引只占了13%,同时复合查询条件占比91%。由此可以看出,用23%的复合索引服务91%的复合查询显然是不够的,意味着可能是存在很多SQL执行计划不佳的情况。

过去的开源建设是针对单个索引、单个SQL的最佳推荐,但具备了全量SQL采集分析能力后,可以做全局性最佳索引的推荐。在数据统计维度,可以基于代价进行评估给出整张表综合索引的建议,进而自动创建和维护索引。

二、深度观测:全量SQL分析与挖掘

1.为什么要做全量SQL分析?

1)应用场景:问题分析定位

全量SQL的应用场景比较多。如上图所示,例如数据库CPU很高或抖了一下是哪些SQL导致的,这些SQL的具体执行情况,包括时间响应、返回行数、扫描行数等。

2)SQL挖掘:深度治理

基于全量SQL分析表、索引是否已废弃,不同db的热点表、热点SQL,单条SQL RT是否稳定,甚至可以分析表的活跃数据情况等治理场景。

3)兼容混合云产品、统一问题排查

由于混合云产品的差异性与企业统一管理的矛盾,给问题分析或日常应用带来很大困扰,因此产品设计时要格外考虑多云兼容性。

有时候,单一云确实提升了某一能力,但混合云下,服务整体功能的设计更加复杂。

2.全量SQL分析实现

全量SQL分析实现的基本流程:SQL请求DAL之后,DAL将SQL转发到Kafka里面,然后再根据业务场景需要进行消费处理。

比如分析某一个字段是否有在用,只需要通过指纹去重,抓取这一段时间内所有这个表的SQL请求,并进行参数解析,就能轻易分析出所需要的字段。

还比如热点表、热点SQL、SQL波动,经过先前处理后,可直接通过原数据查询。

通过对一段时间内的SQL查询返回数据记录,分析出活跃数据量占比,来指导研发合理的规定设置。

上图是做采样的一个样例,它的维度很丰富,我们可以基于SQL的采样,进行大量统计分析的工作。

通过top SQL可以分析某个时间段内SQL执行占比情况,进而推测数据库性能开销情况,对深入问题分析有比较大的帮助作用。

上图是第二个应用场景,通过波动SQL,查询不稳定集群。预处理每条SQL时,我们记录了SQL RT 的p50跟p95时长,把每一个集群下每一条SQL的p95跟p50去做差,然后聚合、排序。波动越大,聚合的差值越大,就大致能推测这个集群是不稳定的。

从上图左下方的图表可知,它的CPU经常具有毛刺。但日常中DBA很难根据经验照顾到每一个集群,所以需要拉取这些数据进行分析或日常治理。

再如DBA发现某个DB TOP 1的SQL执行的次数几乎是TOP 2的10倍,分析这个SQL发现它是一个司机登录场景。由于活跃的司机体量是有限的,司机登录动作达到每秒几万,这显然是不合理的。

与研发沟通后,我们找到了原因:这是典型的业务设计问题,也是一个基础编码问题。

三、容量预测:数据库仿真流量测压

1.数据库容量评估

基于云上技术的红利,从存储计算一体化的架构演进为存储计算分离的架构,具备了快速容量弹性的能力。未来目标是做到ServerLess化,但目前仍需要一些时间和数据进行验证。

虽然实现了存算分离实现快速扩缩容,但是容量评估仍旧是根据DBA经验来判断的,缺乏一些相应的数据支撑。

2.数据库容量压测

1)BenchMark

由于BenchMark压测与真实环境的SQL表现差距巨大,因此不能用于容量评估。

近年来流行的SQLReplay等流量回放工具,核心就是利用抓包的方式将SQL记录下来然后机械能回放。它主要的问题是:一方面抓包容易缺漏,另一方面是SQL维度信息缺失难以支持还原真实场景。

2)全链路压测

现在比较流行的方式是全链路压测。它存在的问题是,在真实的业务场景下,APP ID之间的调用关系极其复杂。理论上使用全链路压测的方式可以进行压测评估,但实际应用中数据上下游调用可能会造失真的问题,会存在压不到、压得过多或过少的情况。

同时,也存在数据热点问题。全链路压测有时会模拟一定的用户、司机数据,通常这个量不会特别大,几百条、上千条就已经算是比较多的。由于数据库有cache,很多查询不回表,所以无法反映真实的数据库的实际负载情况。

3)仿真流量压测

在具备了全量SQL后,我们提出了仿真流量压测。它的大概流程是:高峰期内,SQL将流量录制下来保存至Kafka低峰期内,进行相应的消息处理后进行仿真回放。

主要问题:

  • 压测幂:比如压测1000次理论上这1000次在任意时间点执行SQL的内容、数量以及并发度都要求保持一致,这是非常困难的;
  • 流量缩放:如果是1:1的回放,理论上是可以还原的。但研发可能对放量百分比产生疑问,比如流量增加120%,数据库能否撑得住?这种时候只能通过经验预估容量。成倍放大是容易的,但成比例放大就很麻烦。

主要缺点:

  • 使用真实生产环境进行回访,不能执行DML导致失真;
  • 不能保证100%的仿真度,只能无限接近。

3.数据库容量评估应用

实际进行压缩时,我们划出一条以CPU为主的基准线,安全的上限值是45%。超过45%之后,无论数据库是否能承受都需要进行扩容。基于这个基线进行压测,CPU压到45%时当前QPS即是容量的上限水位,这就有利于研发和DBA后续直观地看到容量情况。

目前这一块内容并未完全落地,整体处于开发阶段,我们在理论上还原了SQL执行顺序与并发情况。整体并发模型还需要做深入的打磨跟优化。

4.为什么要围绕SQL死磕?

根据真实生产的统计,我们将近70%的数据库实际规格都低于8C。

使用这种小规格的服务器,数据库的弹性能力是非常差的,SQL稍有问题都可能击穿数据库。由于使用的是混合云,无法将数据库稳定性保障交给云商统一解决,因此我们只能在现有能力下,构建兼容多云的统一管理能力。

数据库最大的两个挑战:高并发+大容量。虽然目前货拉拉还没有面临大容量与高并发的场景,但已初显端倪,不到3年,我们数据库QPS流量增长了近10倍。

在可预见的未来,如果我们的订单再增加1倍,流量可能会增加10倍,现存的SQL问题到时将会更加突出,这也是DBA围绕SQL进行能力建设的原因之一。

5.后续规划

目前平台初步具备了DAS功能的雏形,距离比较完善的产品形态还要继续进行打磨。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【DB笔试面试628】Oracle的统计信息包括哪几种类型?
Oracle数据库里的统计信息是一组存储在数据字典里,且从多个维度描述了数据库里对象的详细信息的一组数据。当Oracle数据库工作在CBO(Cost Based Optimization,基于代价的优化器)模式下时,优化器会根据数据字典中记录的对象的统计信息来评估SQL语句的不同执行计划的成本,从而找到最优或者是相对最优的执行计划。所以,可以说,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式来生成执行计划。统计信息决定着SQL的执行计划的正确性,属于SQL执行的指导思想。若统计信息不准确,则会导致表的访问方式(例如应该使用索引,但是选择了全表扫描)、表与表的连接方式出现问题(例如应该使用HJ,但是使用了NL连接),从而导致CBO选择错误的执行计划。
AiDBA宝典
2019/09/29
7490
【DB笔试面试628】Oracle的统计信息包括哪几种类型?
【DB笔试面试631】在Oracle中,什么是动态采样(Dynamic Sampling)?
对于没有收集统计信息的表,Oracle为了能够得到相对准确的执行计划,会在执行SQL之前对SQL语句涉及到的表做动态采样(Dynamic Sampling,从Oracle 11.2.0.4开始称之为Dynamic Statistic)。
AiDBA宝典
2019/09/29
6150
【DB笔试面试631】在Oracle中,什么是动态采样(Dynamic Sampling)?
Oracle db_file_mulitblock_read_count参数
     Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数,可以影响系统级别及sessioin级别。主要是用于设置最小化表扫描时Oracl
Leshami
2018/08/13
6390
【DB笔试面试642】在Oracle中,什么是基数反馈(Cardinality Feedback)?
基数反馈(Cardinality Feedback,CFB)是Oracle 11gR2出现的一个新特性,它的出现是为了帮助Oracle优化器依据更精准的基数生成更加优秀的执行计划。基数的评估准确与否,对于优化器异常重要,直接影响到后续的JOIN COST等重要的成本计算评估。若评估不当则会造成CBO选择不当的执行计划。此技术对于仅执行一次的SQL无效,在SQL第一次执行时,记录存储实际的基数和评估的基数之间的差异,如果差异较大,在第二次执行时,优化器会依据实际的基数重新决策生成执行计划,但是需要注意的是,当使用更准确的基数重新生成执行计划时,生成的执行计划与第一次时使用的执行计划完全有可能是相同的。这个技术的出现是由于优化器在一些情况下不能很好的去计算基数的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失等等。
AiDBA宝典
2019/09/29
7870
【DB笔试面试590】在Oracle中,什么是反连接(Anti Join)?
反连接(Anti Join)也是一种特殊的连接类型,通常用于从一个表中返回不在另一个数据源中的数据行。当做子查询展开时,Oracle经常会把那些外部WHERE条件为NOT EXISTS、NOT IN或<> ALL的子查询转换成对应的反连接。反连接分为嵌套循环反连接(NESTED LOOPS ANTI,Hint为:NL_AJ)、排序合并反连接(MERGE JOIN ANTI,Hint为:MERGE_AJ)和哈希反连接(HASH JOIN ANTI,Hint为:HASH_AJ)。示例如下所示:
AiDBA宝典
2019/09/29
1.3K0
关于执行计划中的%CPU的含义 (r7笔记第25天)
今天突然想起前段时间学习的一篇博客,是oaktable的Charles Hooper所写,链接为: https://hoopercharles.wordpress.com/2010/02/19/what-is-the-meaning-of-the-cpu-column-in-an-explain-plan/ 自己也趁机消化了一下。对于执行计划中的 列Cost (%CPU),其中的%CPU的含义很少有人能够说得清楚,于是Charles Hooper写了上面的文章来解释。 对于执行计划的信息都会放入plan_t
jeanron100
2018/03/16
9480
【DB笔试面试612】在Oracle中,查询转换包含哪些类型?
在Oracle数据库中,用户发给Oracle让其执行的目标SQL和Oracle实际执行的SQL有可能是不同的,这是因为Oracle可能会对执行的目标SQL做等价改写,即查询转换。查询转换(Query Transformation),也叫逻辑优化(Logical Optimization),又称为查询改写(Query Rewrite)或软优化,即查询转换器在逻辑上对语句做一些语义等价转换,它是Oracle在解析目标SQL的过程中的非常重要的一步。查询转换能使优化器将目标SQL改写成语义上完全等价的SQL语句但生成的执行计划效率更高。
AiDBA宝典
2019/09/29
1.4K0
【DB笔试面试612】在Oracle中,查询转换包含哪些类型?
MySQL 全表扫描成本计算
全表扫描成本作为参照物,用于和表的其它访问方式的成本做对比。任何一种访问方式,只要成本超过了全表扫描成本,就不会被使用。
csch
2022/12/20
9200
【DB笔试面试582】在Oracle中,什么是绑定变量窥探(上)?
目标SQL若不使用绑定变量,则当具体输入值一旦发生了变化,目标SQL的SQL文本就会随之发生变化,这样Oracle就能很容易地计算出对应Selectivity和Cardinality的值,进而据此来选择执行计划。但对于使用了绑定变量的目标SQL而言,情况就完全不一样了,因为现在无论对应绑定变量的具体输入值是什么,目标SQL的SQL文本都是一模一样的。对于使用了绑定变量的目标SQL而言,Oracle可以选择如下两种方法来决定其执行计划:
AiDBA宝典
2019/09/29
1.6K0
Oracle 全表扫描及其执行计划(full table scan)
    全表扫描是Oracle访问数据库表是较为常见的访问方式之一。很多朋友一看到SQL语句执行计划中的全表扫描,就要考虑对其进行修理一番。全表扫描的存在,的确存在可能优化的余地。但事实上很多时候全表扫描也并非是最低效的,完全要看不同的情形与场合,任一方式都是有利有弊的,也就是具体情况要具体分析。本文描述了什么是全表扫描以及何时发生全表扫描,何时全表扫描才低效。   本文涉及到的相关链接: 高水位线和全表扫描 启用 AUTOTRACE 功能 Oracle 测试常用表BIG_TABLE Oracle
Leshami
2018/08/13
2.8K0
一个Oracle小白的AWR报告分析(四)
Wait Event Histogram(等待事件直方图),顾名思义为各等待事件的按时间区间统计的次数,还包括Wait Event Histogram Detail (64 msec to 2 sec)
python与大数据分析
2022/03/11
8780
一个Oracle小白的AWR报告分析(四)
又见程序媛 | 从索引的创建角度分析热门“面试题”
关于周一 Eygle 在文章《千头万绪:从一道面试题看数据库性能和安全的方方面面》讲到的 SELECT* FROM girls WHERE age BETWEEN 18 and 24 and boyfriend='no' 这个 SQL,他 从数据库 SQL优化、数据安全、SQL审核、开发规范、IN-Memory 特性方面做了深入的分析。
数据和云
2018/10/08
9310
又见程序媛 | 从索引的创建角度分析热门“面试题”
【SQL Performance】实时SQL监控功能(Real-Time SQL Monitoring)
实时SQL监控功能(Real-Time SQL Monitoring)是Oracle11g推出的功能,通过这个功能可以实时地监视执行中的SQL性能。
SQLplusDB
2020/03/26
1.7K0
Oracle优化10-SQL_TRACE
当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起来就好好像卡在什么地方一样,该如何入手呢?
小小工匠
2021/08/16
8910
Oracle 19.3 案例参考:通过 10053 跟踪获取的 SQL 执行计划诊断信息
墨天轮原文链接:https://www.modb.pro/db/22835?ywm 这是一个测试案例的说明文件,是引用参考 注意,这是一个测试案例的说明文件,是引用参考: Trace file /o
数据和云01
2020/03/31
1.9K0
Oracle优化12-10053事件
我们在查看一条SQL语句的执行计划时,只看到了CBO最终告诉我们的执行计划结果,但是我们并不知道CBO为何要这样做。
小小工匠
2021/08/16
4810
Oracle CBO选错执行计划的一种场景
测试人员做应用性能测试,反馈有一条SQL语句,之前执行非常快,现在执行时间,明显慢了。
bisal
2019/01/30
5210
Oracle案例:index range scan真的不会多块读吗?
团团圆圆吃汤圆,快快来三连 此次案例来自西安某客户的一次SQL优化,对于优化本身并不复杂,但是发现了一个比较有趣的问题,就是索引范围扫描以及回表都有使用多块读的方式。下面来看看具体案例。 SQL文本: UPDATE A_INV_PRINT_DET P SET (P.P_POWER, P.N_POWER, P.V_POWER, P.P_KWH_PRC, P.N_KWH_PRC, P.V_KWH_PRC, P.P_KWH_AMT, P.N_KWH_AMT, P.V_KWH_AMT) = (SELECT KW
数据和云
2022/03/04
5740
案例分享:关闭 Oracle 审计时遇到的 Bug 排查与解决
一重要的生产库长期以来就有各种问题,前段时间刚进行完 PSU190716 的更新,这两天查到发现审计功能对其性能有较大的影响,故客户要求关闭审计功能。我们便申请了三个小时的停机窗口,进行关闭审计的操作。心想改参数重启实例四十分钟就可以搞定的事,三个小时多多有余,因为数据量达五六十 T ,小伙伴都比较怕,只有我做了。以下涉及到实际的主机名、实例名均已替换为测试相关的,如不对应忽略即可。
JiekeXu之路
2020/05/12
1.8K0
读书笔记-《基于Oracle的SQL优化》-第二章-1
1、目标SQL的正文、SQL ID和其执行计划所对应的的PLAN HASH VALUE。
bisal
2019/01/29
9430
推荐阅读
相关推荐
【DB笔试面试628】Oracle的统计信息包括哪几种类型?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档