CN112395305A - 一种sql语句分析方法、装置、电子设备及存储介质 - Google Patents
一种sql语句分析方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN112395305A CN112395305A CN202011253828.XA CN202011253828A CN112395305A CN 112395305 A CN112395305 A CN 112395305A CN 202011253828 A CN202011253828 A CN 202011253828A CN 112395305 A CN112395305 A CN 112395305A
- Authority
- CN
- China
- Prior art keywords
- sql
- statement
- statements
- sentences
- sql statement
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 68
- 238000003860 storage Methods 0.000 title claims abstract description 16
- 238000000034 method Methods 0.000 claims abstract description 119
- 230000003068 static effect Effects 0.000 claims abstract description 52
- 238000007670 refining Methods 0.000 claims description 10
- 238000004590 computer program Methods 0.000 claims description 5
- 230000006835 compression Effects 0.000 claims description 4
- 238000007906 compression Methods 0.000 claims description 4
- 238000005242 forging Methods 0.000 claims description 4
- 238000004519 manufacturing process Methods 0.000 abstract description 9
- 238000011161 development Methods 0.000 abstract description 4
- 238000004891 communication Methods 0.000 description 10
- 230000006870 function Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 5
- 230000009286 beneficial effect Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000013024 troubleshooting Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000000605 extraction Methods 0.000 description 2
- 238000012544 monitoring process Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000002441 reversible effect Effects 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Physics & Mathematics (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Virology (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种SQL语句分析方法、装置、电子设备及存储介质。方法包括:对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并合并,得到当前版本的SQL语句集合;判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句进比较当前版本与先前版本的SQL语句集合,得到增量SQL语句;根据SQL特征信息分析增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。能够在应用上线之前,分析得到是否存在危险SQL语句和慢SQL语句,并在存在时进行预警。具有极大减小人力的消耗,减少分析时间,在生产前解决问题,提高开发效率。
Description
技术领域
本发明涉及信息分析技术领域,尤其涉及一种SQL语句分析方法、装置、电子设备及存储介质。
背景技术
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL语句就是对数据库进行操作的一种语言。
目前,大部分技术栈是基于java开发的,开发上有时会出现访问数据库的SQL语句不规范而破坏索引,或者危险SQL语句导致全表更新或删除等。因此,对应用中的SQL语句进行检查具有十分重要的意义。
现有的方法主要通过在应用上线前进行人工排查和在应用上线后针对生产上的问题通过数据库监控进行反向排查。在应用上线前人工排查会导致耗费大量的人力。而应用上线后再通过数据库监控反向排查,会导致很多生产上的问题发生。
因此,亟需一种新的SQL语句分析方法。
发明内容
有鉴于此,本发明的目的在于提出一种SQL语句分析方法、装置、电子设备及存储介质,以解决现有的问题。
基于上述目的,本发明提供了一种SQL语句分析方法,包括:
对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
在其中一个实施例中,对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合,具体包括:
接收待分析应用的不同类型的参数,所述参数包括待分析的压缩包、系统标识、名称和版本号,并将符合格式要求的文件加入classloader中;
对class文件中的DAO字节码进行静态分析,获取对应的访问类的包路径或类名,得到访问数据库的方法;
以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法;
将调用方法下的不同分支对应的字节码绘制为有向图;通过有向图访问算法,查找每个执行路径的SQL语句,所述SQL语句包括存在SQL特征的静态的SQL语句和以输入参数形式传入的SQL语句;
将所得的静态常量的SQL语句和执行路径的SQL语句,进行去重和参数合并,得到当前版本的SQL语句集合。
在其中一个实施例中,所述将符合格式要求的文件加入classloader中具体包括:
当压缩包为war包时,通过Java的ZipFile解压war包,并分别把解压后的class文件和jar文件加入classloader中;当压缩包为jar包时,直接加入classloader中。
在其中一个实施例中,所述以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法具体包括:
查找方法中存在数据库访问的方法调用,在与方法对应的数据库的api中提取字节码中的SQL语句。
在其中一个实施例中,所述查找执行路径的SQL语句具体包括:
根据SQL特征信息分析每个执行路径,查找每个执行路径的静态的SQL语句;
伪造单一类型的输入参数,通过java反射调用,得到以输入参数形式传入的SQL语句。
在其中一个实施例中,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句包括:
拆解增量SQL语句,解析是否存在update或delete;
当存在时,判断update或delete之后是否存在where条件;当存在where条件时,拆解where条件,判断是否永远为真;
当update或delete之后不存在where条件,或者存在永远为真的where条件时,判断为存在危险SQL语句。
在其中一个实施例中,根据SQL特征信息分析所述增量SQL语句,判断是否存在慢SQL语句包括:
将当前版本的待分析应用与对应的数据库连接;
获取增量SQL语句的执行计划;
保存执行计划,返回SQL执行计划结果的集合;
比较执行结果的集合和预设的慢SQL的指标,当存在与所述指标中的任一指标对应的增量SQL语句时,判断为存在慢SQL语句。
在其中一个实施例中,预设的慢SQL的指标包括:全表扫描,全索引扫描,索引跳跃扫描,隐式转换或查询列使用函数,笛卡尔乘积缺少连接条件,大型复杂语句(语句包含5个或以上表)和可能未使用绑定变量等。
在其中一个实施例中,还包括,根据慢SQL语句对应的预设的慢SQL的指标,将慢SQL语句标记为严重或警告的风险级别,并生成对应预警信息。
本发明实施例还提供一种SQL语句分析装置,包括:
SQL语句集合分析模块,用于对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
增量SQL语句分析模块,判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
问题SQL语句分析模块,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
本发明实施例还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如前任意一项所述的方法。
本发明实施例还提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如前任一所述方法。
从上面所述可以看出,本发明提供的SQL语句分析方法,通过对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。能够在应用上线之前,分析得到是否存在危险SQL语句和慢SQL语句,并在存在时进行预警。具有极大减小人力的消耗,减少分析时间,在生产前解决问题,提高开发效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例的SQL语句分析方法的流程示意图;
图2为本发明实施例的得到当前版本的SQL语句集合的流程示意图;
图3为本发明实施例的SQL语句分析装置示意图;
图4为本发明实施例的电子设备示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
需要说明的是,除非另外定义,本发明实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。
本发明的发明人在长期的对应用中的SQL语句分析的研究工作中发现,目前的分析方法中,一种主要依靠在应用上线前通过人工进行应用中的SQL语句分析,发现存在问题的SQL语句。该种方法不仅需要耗费大量的人工,同时还会由于人工的技术和经验的不同,导致分析的标准不同,出现分析的不准确。另一种主要在应用上线出现生产上的问题后,再通过数据库的慢SQL监控,反向排查不合理的SQL,这种方法只能在出现问题的事后解决,无法降低生产上出现事故的概率。
本发明的发明人提出一种SQL语句分析方法,能够在应用上线之前,通过代码智能走查增量SQL语句,并预警危险SQL语句。当存在危险SQL语句时,不允许发布版本,必须经过修正SQL语句,符合要求后后方可发版,大大缩减了人力,并在生产前解决问题。
请参阅图1,本说明书一个或多个实施例提供一种SQL语句分析方法,包括:
S100,对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
S200,判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
S300,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
本发明实施例的SQL语句分析方法,通过对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。能够在应用上线之前,分析得到是否存在危险SQL语句和慢SQL语句,并在存在时进行预警。具有极大减小人力的消耗,减少分析时间,在生产前解决问题,提高开发效率。
本说明书一个或多个实施例中,步骤S100,当前版本的待分析应用可以通过DevOps自动构建。具体应用时,可以在构建中自动触发或者手动触发该SQL语句分析方法,并通过java字节码的静态分析和动态调用扫描当前版本的待分析应用中的全量SQL。
请参阅图2,步骤S100具体可以包括:
S110,接受待分析应用的参数,所述参数包括待分析的压缩包、系统标识、名称和版本号,并将符合格式要求的文件加入classloader中;
S120,根据静态访问数据库的规则,扫描对应的访问类的包路径或类名,对源代码进行静态分析,得到访问数据库的方法;
S130,以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法;
S140,将调用方法下的不同分支对应的字节码绘制为有向图;通过有向图访问算法,查找每个执行路径的SQL语句,所述SQL语句包括存在SQL特征的静态常量的SQL语句和以输入参数形式传入的SQL语句;
S150,将所得的静态常量的SQL语句和执行路径的SQL语句,进行去重和参数合并,得到当前版本的SQL语句集合。
在步骤S110中,可以通过命令“java-jar/XXX/asm-SQL.jar target.war系统标识appName version,”启动对当前版本的待分析应用中的静态分析和动态调用的扫描。该命令启动后,能够接受来自外部的4种不同类型的参数。
在参数中,待分析的压缩包,即为待分析应用的压缩包,可以为war或者jar包。也即,该压缩包的格式war或者jar。当压缩包为war包时,通过Java的ZipFile解压war包,并分别把解压后的class文件和jar文件加入classloader中。当压缩包为jar包时,直接加入classloader中。
在步骤S120中,静态访问数据库的规则,具体为针对数据库的访问类的包路径或类名中存在DAO。也即,根据静态访问数据库的规则,扫描对应的访问类的包路径或类名为:扫描class文件中的DAO,实现对代码进行静态分析,获取对数据库的访问类的包路径或者类名。
通过扫描class文件中的DAO这一规则对class文件中的字节码进行扫描,能够避免对所有的字节码扫描,节省扫描时间,提高扫描效率。
在具体实施时,可以通过静态代码分析工具ASM,对class文件中的DAO字节码进行静态分析。
在步骤S130中,所述以方法为粒度进行扫描,提炼所有数据库的访问规则具体可以包括:查找方法中存在数据库访问的方法调用,在与方法对应的数据库的api中提取字节码中的类SQL语句。例如,当方法中存在如springjdbc等数据库访问调用,查找对应的springjdbc的数据库api,并提取字节码中的类SQL语句。
在应用场景中,提炼数据库的访问规则具体包括:根据SQL特征,分析访问数据库的原生方法的静态常量中是否含有SQL语句和分析原生方法是否为使用SQL语句的方法。例如,对于原生的jdbc访问方法,可以分析静态常量是否含有“select”、“update”、“insert”和“delete”等SQL特征的语句。对于原生的jdbc访问方法,由于其会调用Statement或者PreparedStatement的executeQuery或者executeUpdate方法,因此,判断该方法中存在使用SQL语句的方法。数据库的访问规则还包括通过访问数据库的方法的调用规则,分析访问数据库的调用方法是否存在使用sql语句的部分。例如,对于springjdbc访问方法,分析是否存在"query"、"queryForList"、"queryForMap"、"queryForObject"、"queryForRowSet"、"update"和"batchUpdate"等api调用,当存在时认为该调用方法存在使用SQL语句的部分。
步骤S140中,通过分析所得的调用方法的所有执行路径,并分析每个执行路径的SQL语句,能够得到方法中存在的多个分支的执行路径,从而更加精准的分析调用方法中的SQL语句。
调用方法中的SQL语句包括存在SQL特征的静态常量的SQL语句和以入参形式传入的SQL语句。其中,针对存在SQL特征的静态常量的SQL语句,可以根据SQL特征信息分析执行路径,查找执行路径的静态常量的SQL语句。SQL特征信息,可以例如,select,update,insert,delete,where,order等。也即,可以查找含有这些信息的语句,得到执行路径的静态常量的SQL语句。
针对以入参形式传入的SQL语句,可以通过伪造单一类型的输入参数,通过java反射调用,得到以输入参数形式传入的SQL语句。该种形式的SQL语句中,入参可以包括拼装的入参。针对拼装的入参,也是得到的解拼后的单一类型的输入参数,并根据得到的解拼后的单一类型的输入参数的反射调用,得到对应的SQL语句。也即java反射调用,用在以拼装的输入参数形式传入的的方法上,可以将一堆入参,返回为多种具体的SQL。
应当说明的是,java反射调用为已有的方法,具体可以理解为字节码文件有行号和指令,对应指令能够跳转到对应的行号,其中java代码中的if判断等在字节码中会有跳转指令,那么针对if和else这样的条件组装能够得到SQL,也即拼装SQL也是按照不同的分支拼装。
步骤S150中,去重和参数合并,可以理解为将分析出来的所有SQL语句最终做一个类似交集的动作,例如对于SQL语句select*from a where name=?、SQL语句select*froma where age=?和SQL语句select*from a where name=?and age=?,合并成select*from a where{name=?and age=?}。
本说明书实施例中,在步骤S200中,比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句,具体包括:按照类名,方法名和SQL语句进行比较,当存在差异时,得到增量SQL语句,并存入数据库中,当不存在差异时,不存储。
一些实施场景中,先前版本可以为master版本。也即,每次发版上生产的应用(也即待分析应用)都是下一次发版应用的master。可以通过应用构建时执行本发明实施例的SQL语句提取方法,每个版本的应用上线后把git代码合并到master,然后触发jenkins job执行SQL语句提取,比较发版之前提取的SQL语句和上次发版的SQL语句计算出增量SQL语句。
本说明书一个或多个实施例中,还包括,判断数据库中是否存在与当前版本相同的版本的SQL语句集合。当存在时,将数据库中与当前版本相同的SQL语句集合删除。
本说明书一个或多个实施例中,还包括,当数据库中不存在先前版本的SQL语句集合时,将所得当前版本的的SQL语句集合全部存入数据库中,再进行后续的如步骤S300中的分析。
本说明书实施例中,步骤S300中,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句包括:
拆解增量SQL语句,解析是否存在update或delete;
当存在时,判断update或delete之后是否存在where条件;当存在where条件时,拆解where条件,判断是否永远为真;
当update或delete之后不存在where条件,或者存在永远为真的where条件时,判断为存在危险SQL语句。
在本说明书一个或多个实施例中,当判断为存在危险SQL语句时,还包括,对update或delete之后不存在where条件的危险SQL语句,或者存在永远为真的where条件的危险SQL语句,进行预警。
本说明书实施例中,根据SQL特征信息分析所述增量SQL语句,判断是否存在慢SQL语句包括:
将当前版本的待分析应用与对应的数据库连接;
获取增量SQL语句的执行计划;
保存执行计划,返回执行计划结果的集合;
比较执行结果的集合和预设的慢SQL的指标,当存在与所述指标中的任一指标对应的增量SQL语句时,判断为存在慢SQL语句。
本说明书一个或多个实施例中,在将当前版本的待分析应用与对应的数据库连接之前,需要配置对应的数据库的相关信息。
一些实施场景中,所述获取当前版本的待分析应用的执行计划具体包括:通过“EXPLAIN PLAN FOR XXX”的命令来获取增量SQL语句的执行计划。其中,XXX为对应的增量SQL语句。每一个SQL语句对应一条执行计划。执行计划可以用来解释增量SQL语句在数据库中是如何执行的。例如,增量SQL语句在数据库中实际执行时,分为哪几步、每一步分别做什么、相关表是怎么连接、连接的次序、有哪些索引和索引使用情况、每个表是扫描数据量等。
SQL执行计划结果的集合中可以包括多条SQL执行计划。而SQL执行计划结果的集合中又包括多条SQL执行计划。
一些实施场景中,预设的慢SQL的指标也可以称为风险点,其通常可以由实际生产问题暴露出的风险总结获得。可以由人工dba提供,也可以由其他途径获取。常用的预设的慢SQL的指标可以包括:全表扫描,全索引扫描,索引跳跃扫描,隐式转换或查询列使用函数,笛卡尔乘积缺少连接条件,大型复杂语句(语句包含5个或以上表)和可能未使用绑定变量等。
在本发明的一个或多个实施例中,可以根据慢SQL语句对应的预设的慢SQL的指标,将慢SQL语句标记为严重或警告的风险级别,并生成对应预警信息。也即,可以将预设的慢SQL的指标与不同的风险等级对应,从而得到慢SQL语句SQL语句的风险等级,并生成对应预警信息。所述预警信息可以将SQL风险等级与对应的SQL语句同时显示,以供开发人员分析。
具体地,将具有全表扫描,全索引扫描和隐式转换或查询列使用函数的指标慢SQL语句标记为严重,并生成对应预警信息。其中,全表扫描和全索引扫描会影响SQL和数据库系统性能,因此,标记为严重。隐式转换或查询列使用函数可能导致不使用预期索引,因此,标记为严重。
将索引跳跃扫描,笛卡尔乘积缺少连接条件,大型复杂语句(语句包含5个或以上表)和可能未使用绑定变量标记为警告。其中,索引跳跃扫描,可能会导致查询条件和索引列不完全匹配,因此,标记为警告。而笛卡尔乘积,缺少连接条件,可能存在逻辑问题,因此,标记为警告。大型复杂语句,语句包含5个或以上表,导致难以阅读和优化,因此,标记为警告。可能未使用绑定变量,会导致增加硬解析,降低数据库性能,因此,标记为警告。
本发明实施例提供的方法,通过接收待分析应用的压缩包、系统标识、名称和版本号,并将符合格式要求的文件加入classloader中,能够得到当前版本的待分析应用的各种class文件。并根据静态访问数据库的规则,仅扫描对应的访问类的包路径或类名,对源代码进行静态分析,即可快速得到访问数据库的方法。再通过以方法为粒度进行扫描,提炼所有数据库的访问规则,即可得到全部的静态常量中的SQL语句和执行SQL语句的访问数据库的方法的调用方法。通过动态调用的扫描,将调用方法下的不同分支对应的字节码绘制为有向图;通过有向图访问算法,查找每个执行路径的SQL语句,可以得到存在SQL特征的静态常量的SQL语句和以输入参数形式传入的SQL语句。最后将所得的静态常量中的SQL语句和执行路径的SQL语句,进行去重和参数合并,得到当前版本的SQL语句集合。在数据库中查找是否存在当前版本、master版本的SQL语句集合,最终得到当前版本与master版本比较之后的增量SQL语句。最后根据update或delete之后不存在where条件,或者存在永远为真的where条件时,判断为存在危险SQL语句,判断是否存在危险SQL语句。并根据增量SQL语句的执行计划和预设的全表扫描,全索引扫描,索引跳跃扫描,隐式转换或查询列使用函数,笛卡尔乘积缺少连接条件,大型复杂语句(语句包含5个或以上表)和可能未使用绑定变量等慢SQL语句的指标,分析慢SQL语句及对应的风险等级,生成预警信息。因此,本发明实施例的方法,能够在应用上线之前,快速全面的检测当前版本的待分析应用中的危险SQL语句和慢SQL语句,并生成不同风险级别的预警信息,提高开发效率,节省人力,节省成本。
需要说明的是,本发明实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本发明实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本说明书一个或多个实施例还提供了一种SQL语句分析装置。
参考图3,所述SQL语句分析装置,包括:
SQL语句集合分析模块410,用于对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
增量SQL语句分析模块420,判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
问题SQL语句分析模块430,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
本说明书一个或多个实施例中,所述SQL语句集合分析模块410包括参数接收单元,访问数据库的方法接收单元,静态SQL语句和调用方法获取单元,调用方法SQL语句分析单元和SQL语句集合分析单元。
参数接收单元,用于接收待分析应用的不同类型的参数,所述参数包括待分析的压缩包、系统标识、名称和版本号,并将符合格式要求的文件加入classloader中;
访问数据库的方法接收单元,用于对class文件中的DAO字节码进行静态分析,获取对应的访问类的包路径或类名,得到访问数据库的方法;
静态SQL语句和调用方法获取单元,用于以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法;
调用方法SQL语句分析单元,用于将调用方法下的不同分支对应的字节码绘制为有向图;通过有向图访问算法,查找每个执行路径的SQL语句,所述SQL语句包括存在SQL特征的静态常量的SQL语句和以输入参数形式传入的SQL语句;
SQL语句集合分析单元,用于将所得的态常量中的SQL语句和执行路径的SQL语句,进行去重和参数合并,得到当前版本的SQL语句集合。
本说明书一个或多个实施例中,参数接收单元,用于通过当压缩包为war包时,通过Java的ZipFile解压war包,并分别把解压后的class文件和jar文件加入classloader中;当压缩包为jar包时,直接加入classloader中,实现将符合格式要求的文件加入classloader中。
静态SQL语句和调用方法获取单元,在实现所述以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法具体包括:查找方法中存在数据库访问的方法调用,在与方法对应的数据库的api中提取字节码中的SQL语句。
调用方法SQL语句分析单元,用于查找执行路径的SQL语句时,具体包括:
根据SQL特征信息分析执行路径,查找执行路径的静态的SQL语句;
伪造单一类型的输入参数,通过java反射调用,得到以输入参数形式传入的SQL语句。
问题SQL语句分析模块,用于根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句时,包括:
拆解增量SQL语句,解析是否存在update或delete;
当存在时,判断update或delete之后是否存在where条件;当存在where条件时,拆解where条件,判断是否永远为真;
当update或delete之后不存在where条件,或者存在永远为真的where条件时,判断为存在危险SQL语句。
问题SQL语句分析模块,用于根据SQL特征信息分析所述增量SQL语句,判断是否存在慢SQL语句时,包括:
将当前版本的待分析应用与对应的数据库连接;
获取增量SQL语句的执行计划;
保存执行计划,返回SQL执行计划结果的集合;
比较执行结果的集合和预设的慢SQL的指标,当存在与所述指标中的任一指标对应的增量SQL语句时,判断为存在慢SQL语句。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本说明书一个或多个实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上任意一实施例所述的SQL语句分析方法。
图4示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
上述实施例的电子设备用于实现前述任一实施例中相应的SQL语句分析方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本说明书一个或多个实施例还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的SQL语句分析方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的SQL语句分析方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本发明的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本发明的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本发明难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本发明难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本发明的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本发明的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本发明。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本发明的具体实施例对本发明进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本发明的实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本发明的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种SQL语句分析方法,其特征在于,包括:
对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
2.根据权利要求1所述的语句分析方法,其特征在于,对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合,具体包括:
接收待分析应用的不同类型的参数,所述参数包括待分析的压缩包、系统标识、名称和版本号,并将符合格式要求的文件加入classloader中;
对class文件中的DAO字节码进行静态分析,获取对应的访问类的包路径或类名,得到访问数据库的方法;
以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法;
将调用方法下的不同分支对应的字节码绘制为有向图;通过有向图访问算法,查找每个执行路径的SQL语句,所述SQL语句包括存在SQL特征的静态常量的SQL语句和以输入参数形式传入的SQL语句;
将所得的静态常量的SQL语句和执行路径的SQL语句,进行去重和参数合并,得到当前版本的SQL语句集合。
3.根据权利要求2所述的语句分析方法,其特征在于,所述将符合格式要求的文件加入classloader中具体包括:
当压缩包为war包时,通过Java的ZipFile解压war包,并分别把解压后的class文件和jar文件加入classloader中;当压缩包为jar包时,直接加入classloader中。
4.根据权利要求2所述的语句分析方法,其特征在于,所述以方法为粒度进行扫描,提炼所有数据库的访问规则,得到静态常量的SQL语句和执行SQL语句的访问数据库的方法的调用方法具体包括:
查找方法中存在数据库访问的调用方法,在与方法对应的数据库的api中提取字节码中的类SQL语句。
5.根据权利要求2所述的语句分析方法,其特征在于,所述查找每个执行路径的SQL语句具体包括:
根据SQL特征信息分析每个执行路径,查找每个执行路径的静态的SQL语句;
伪造单一类型的输入参数,通过java反射调用,得到以输入参数形式传入的SQL语句。
6.根据权利要求1所述的语句分析方法,其特征在于,根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句包括:
拆解增量SQL语句,解析是否存在update或delete;
当存在时,判断update或delete之后是否存在where条件;当存在where条件时,拆解where条件,判断是否永远为真;
当update或delete之后不存在where条件,或者存在永远为真的where条件时,判断为存在危险SQL语句。
7.根据权利要求1所述的语句分析方法,其特征在于,根据SQL特征信息分析所述增量SQL语句,判断是否存在慢SQL语句包括:
将当前版本的待分析应用与对应的数据库连接;
获取增量SQL语句的执行计划;
保存执行计划,返回SQL执行计划结果的集合;
比较执行结果的集合和预设的慢SQL的指标,当存在与所述指标中的任一指标对应的增量SQL语句时,判断为存在慢SQL语句。
8.一种SQL语句分析装置,其特征在于,包括:
SQL语句集合分析模块,用于对当前版本的待分析应用进行java字节码的静态分析和动态调用的扫描,得到全量SQL语句并进行合并,得到当前版本的SQL语句集合;
增量SQL语句分析模块,用于判断数据库中是否存在先前版本的SQL语句集合,当存在时,按照类名,方法名和SQL语句进比较当前版本的SQL语句集合与数据库中的先前版本的SQL语句集合,得到当前版本的增量SQL语句;
问题SQL语句分析模块,用于根据SQL特征信息分析所述增量SQL语句,判断是否存在危险SQL语句和慢SQL语句,当存在时进行预警。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至7任意一项所述的方法。
10.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行权利要求1至7任一所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011253828.XA CN112395305B (zh) | 2020-11-11 | 2020-11-11 | 一种sql语句分析方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011253828.XA CN112395305B (zh) | 2020-11-11 | 2020-11-11 | 一种sql语句分析方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112395305A true CN112395305A (zh) | 2021-02-23 |
CN112395305B CN112395305B (zh) | 2024-04-16 |
Family
ID=74600128
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011253828.XA Active CN112395305B (zh) | 2020-11-11 | 2020-11-11 | 一种sql语句分析方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112395305B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113032277A (zh) * | 2021-04-16 | 2021-06-25 | 携程旅游网络技术(上海)有限公司 | 数据查询监测方法、装置、电子设备和存储介质 |
CN113448855A (zh) * | 2021-07-07 | 2021-09-28 | 中国工商银行股份有限公司 | 数据库版本包检测方法及装置 |
CN113468218A (zh) * | 2021-06-30 | 2021-10-01 | 建信金融科技有限责任公司 | 一种对数据库慢sql进行监测和管理的方法和装置 |
CN113987511A (zh) * | 2021-10-28 | 2022-01-28 | 中国平安人寿保险股份有限公司 | Sql注入漏洞的检测方法、装置、计算机设备及存储介质 |
CN113986736A (zh) * | 2021-10-29 | 2022-01-28 | 重庆富民银行股份有限公司 | 基于java代理和字节码增强的慢sql监控系统及方法 |
CN114547024A (zh) * | 2022-02-08 | 2022-05-27 | 支付宝(杭州)信息技术有限公司 | 一种sql语句风险检测方法、装置、设备及介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7325016B1 (en) * | 2001-12-11 | 2008-01-29 | Sprint Communications Company L.P. | Monitoring database performance by obtaining SQL addresses for SQL statements |
CN106445795A (zh) * | 2016-09-26 | 2017-02-22 | 中国工商银行股份有限公司 | 一种数据库sql效率检测方法及装置 |
CN108197306A (zh) * | 2018-01-30 | 2018-06-22 | 平安科技(深圳)有限公司 | Sql语句处理方法、装置、计算机设备和存储介质 |
CN110633290A (zh) * | 2018-06-20 | 2019-12-31 | 苏宁易购集团股份有限公司 | 一种sql语句分析方法及分析装置 |
-
2020
- 2020-11-11 CN CN202011253828.XA patent/CN112395305B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7325016B1 (en) * | 2001-12-11 | 2008-01-29 | Sprint Communications Company L.P. | Monitoring database performance by obtaining SQL addresses for SQL statements |
CN106445795A (zh) * | 2016-09-26 | 2017-02-22 | 中国工商银行股份有限公司 | 一种数据库sql效率检测方法及装置 |
CN108197306A (zh) * | 2018-01-30 | 2018-06-22 | 平安科技(深圳)有限公司 | Sql语句处理方法、装置、计算机设备和存储介质 |
CN110633290A (zh) * | 2018-06-20 | 2019-12-31 | 苏宁易购集团股份有限公司 | 一种sql语句分析方法及分析装置 |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113032277A (zh) * | 2021-04-16 | 2021-06-25 | 携程旅游网络技术(上海)有限公司 | 数据查询监测方法、装置、电子设备和存储介质 |
CN113468218A (zh) * | 2021-06-30 | 2021-10-01 | 建信金融科技有限责任公司 | 一种对数据库慢sql进行监测和管理的方法和装置 |
CN113448855A (zh) * | 2021-07-07 | 2021-09-28 | 中国工商银行股份有限公司 | 数据库版本包检测方法及装置 |
CN113987511A (zh) * | 2021-10-28 | 2022-01-28 | 中国平安人寿保险股份有限公司 | Sql注入漏洞的检测方法、装置、计算机设备及存储介质 |
CN113986736A (zh) * | 2021-10-29 | 2022-01-28 | 重庆富民银行股份有限公司 | 基于java代理和字节码增强的慢sql监控系统及方法 |
CN114547024A (zh) * | 2022-02-08 | 2022-05-27 | 支付宝(杭州)信息技术有限公司 | 一种sql语句风险检测方法、装置、设备及介质 |
WO2023151436A1 (zh) * | 2022-02-08 | 2023-08-17 | 支付宝(杭州)信息技术有限公司 | Sql语句风险检测 |
Also Published As
Publication number | Publication date |
---|---|
CN112395305B (zh) | 2024-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112395305A (zh) | 一种sql语句分析方法、装置、电子设备及存储介质 | |
CN107506451B (zh) | 用于数据交互的异常信息监控方法及装置 | |
KR20190060725A (ko) | Sql 검토 방법, 장치, 서버 및 저장 매체 | |
CN109543891B (zh) | 容量预测模型的建立方法、设备及计算机可读存储介质 | |
WO2019161618A1 (zh) | 字符串解析方法、装置、设备及计算机可读存储介质 | |
CN112068874B (zh) | 软件项目持续集成方法、装置、终端设备和存储介质 | |
CN111949710A (zh) | 数据存储方法、装置、服务器及存储介质 | |
CN112328259A (zh) | 一种编译时长的处理方法和装置 | |
CN116010461A (zh) | 数据血缘关系解析方法及装置、存储介质及电子设备 | |
CN108628909B (zh) | 信息推送方法和装置 | |
CN115757174A (zh) | 一种数据库的差异检测方法及装置 | |
CN112988786B (zh) | 数据库维护方法和装置 | |
CN115495082A (zh) | Tlv格式数据自动转换方法及相关设备 | |
CN113127413B (zh) | 一种运营商数据处理方法、装置、服务器及存储介质 | |
CN115129598A (zh) | 一种sql语句的风险检测方法、装置、系统及介质 | |
CN114968817A (zh) | 代码改动影响范围的评估方法、装置、设备及存储介质 | |
CN114090514A (zh) | 分布式系统的日志检索方法及装置 | |
CN111151008B (zh) | 游戏运营数据的校验方法、装置、配置后台及介质 | |
CN110333883B (zh) | 一种更新持久化数据的方法及装置 | |
CN113609128A (zh) | 生成数据库实体类的方法、装置、终端设备及存储介质 | |
CN112416430A (zh) | 一种接口文档生成方法、装置、设备及存储介质 | |
CN116483735B (zh) | 一种代码变更的影响分析方法、装置、存储介质及设备 | |
CN117349267B (zh) | 一种数据库迁移处理方法及系统 | |
CN111291130A (zh) | Hive表一致性校验方法、系统、设备及存储介质 | |
CN113495728B (zh) | 依赖关系确定方法、装置、电子设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |