一种数据解析方法、装置及计算机可读存储介质与流程

文档序号:30055011发布日期:2022-05-17 17:25阅读:52来源:国知局
一种数据解析方法、装置及计算机可读存储介质与流程

1.本发明涉及通信技术领域,尤其涉及一种数据解析方法、装置及计算机可读存储介质。


背景技术:

2.目前,很多企业的后台数据库都会选择oracle数据库来进行数据存储。同时,很多企业需要对数据的读写访问等进行审计,相关技术中,通常选择使用镜像流量的方式,对oracle客户端与服务端之间产生的流量数据进行关键内容解析,生成流量解析日志,来满足审计需求。
3.相关技术中,对oracle流量数据中的结构化查询语言(structured query language,sql)语句解析主要是通过固定场景,如某个版本的透明网络底层(transparent network substrate,tns)协议、某个客户端的流量数据等中的sql语句偏移规则得到sql语句的偏移量,然后依据偏移量获取sql语句,或者是通过检索sql语句关键词字符串的方式获取。然而,该方式只对特定场景中的流量数据适用,例如,在不同版本的tns协议、不同的操作系统、不同的客户端、不同的oracle数据库版本等多种场景产生的oracle流量数据,sql语句的偏移规则可能都不相同,如果每一种场景都去分析固定的偏移规则的话,需要耗费大量的人工。
4.可见,现有对oracle流量数据中的sql语句解析方式存在适用场景固定的问题。


技术实现要素:

5.本发明实施例提供一种数据解析方法、装置及计算机可读存储介质,以解决现有对oracle流量数据中的sql语句解析方式适用场景固定的问题。
6.第一方面,本发明实施例提供了一种数据解析方法,包括:
7.获取待解析目标数据库流量数据;
8.依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;
9.依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
10.可选的,所述依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置之前,所述方法还包括:
11.获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
12.确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
13.基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
14.基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
15.基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
16.将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
17.可选的,所述确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值,包括:
18.分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
19.分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
20.分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
21.依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
22.可选的,所述分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,包括:
23.将偏移量赋值为第一预设值m,m为大于1的整数;
24.获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
25.若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
26.若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
27.若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
28.若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
29.可选的,所述判断第m+1+j个字节是否为sql语句的起始位置,包括:
30.从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
31.若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
32.若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
33.判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
34.可选的,所述方法还包括:
35.若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
36.可选的,所述分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值,包括:
37.若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
38.若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
39.若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据库抽样流量数据的子功能偏移值为i+2。
40.可选的,所述确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节之后,所述方法还包括:
41.将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
42.可选的,所述分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度,包括:
43.若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
44.若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
45.若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库
抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
46.可选的,所述依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,包括:
47.在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
48.若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
49.依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
50.可选的,所述基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量,包括:
51.对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
52.可选的,所述基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围,包括:
53.对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
54.将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
55.依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积;
56.依据所述最小相对偏移值子集合中的最大相对偏移值和最小相对偏移值,确定sql语句起始位的相对偏移值范围。
57.可选的,所述基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量,包括:
58.对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
59.可选的,所述依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,包括:
60.将偏移量赋值为第一预设值m,m为大于1的整数;
61.获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
62.若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
63.依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
64.依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
65.若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
66.若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
67.可选的,所述获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值之后,所述方法还包括:
68.若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
69.可选的,所述依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容,包括:
70.从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
71.可选的,所述方法还包括:
72.若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
73.可选的,所述确认sql语句提取失败之后,所述方法还包括:
74.从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
75.若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的最大值,o为大于o的整数;
76.若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
77.若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
78.从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
79.若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
80.第二方面,本发明实施例还提供一种数据解析装置,包括:
81.第一获取模块,用于获取待解析目标数据库流量数据;
82.第一确定模块,用于依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;
83.提取模块,用于依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
84.可选的,所述数据解析装置还包括:
85.第二获取模块,用于获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
86.第二确定模块,用于确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
87.第三确定模块,用于基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
88.第四确定模块,用于基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
89.第五确定模块,用于基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
90.第六确定模块,用于将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
91.可选的,所述第二确定模块包括:
92.第一确定子模块,用于分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
93.第二确定子模块,用于分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
94.第三确定子模块,用于分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
95.第四确定子模块,用于依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
96.可选的,所述第二确定子模块包括:
97.赋值单元,用于将偏移量赋值为第一预设值m,m为大于1的整数;
98.获取单元,用于获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
99.第一检索单元,用于若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
100.第一执行单元,用于若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
101.判断单元,用于若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
102.第一确定单元,用于若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
103.可选的,所述判断单元包括:
104.检索子单元,用于从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
105.执行子单元,用于若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
106.处理子单元,用于若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
107.判断子单元,用于判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
108.可选的,所述第二确定子模块还包括:
109.第二执行单元,用于若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
110.可选的,所述第一确定子模块包括:
111.第二检索单元,用于若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
112.第三执行单元,用于若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
113.第二确定单元,用于若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据
库抽样流量数据的子功能偏移值为i+2。
114.可选的,所述第一确定子模块还包括:
115.第四执行单元,用于将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
116.可选的,所述第三确定子模块包括:
117.第三检索单元,用于若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
118.第五执行单元,用于若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
119.第三确定单元,用于若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
120.可选的,所述第四确定子模块包括:
121.第四检索单元,用于在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
122.第五检索单元,用于若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
123.第四确定单元,用于依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
124.可选的,所述第三确定模块用于对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
125.可选的,所述第四确定模块包括:
126.第五确定子模块,用于对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
127.排序子模块,用于将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
128.第六确定子模块,用于依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积;
129.第七确定子模块,用于依据所述最小相对偏移值子集合中的最大相对偏移值和最
小相对偏移值,确定sql语句起始位的相对偏移值范围。
130.可选的,所述第五确定模块用于对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
131.可选的,所述第一确定模块包括:
132.赋值子模块,用于将偏移量赋值为第一预设值m,m为大于1的整数;
133.第一获取子模块,用于获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
134.第二获取子模块,用于若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
135.第三获取子模块,用于依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
136.第一检索子模块,用于依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
137.第一判断子模块,用于若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
138.第八确定子模块,用于若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
139.可选的,所述第一确定模块还包括:
140.第一执行子模块,用于若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
141.可选的,所述提取模块用于从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
142.可选的,所述数据解析装置还包括:
143.处理模块,用于若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
144.可选的,所述处理模块包括:
145.第二检索子模块,用于从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
146.第二执行子模块,用于若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的
最大值,o为大于o的整数;
147.第二判断子模块,用于若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
148.记录子模块,用于若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
149.第三检索子模块,用于从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
150.提取子模块,用于若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
151.第三方面,本发明实施例还提供一种数据解析装置,包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的数据解析方法中的步骤。
152.第四方面,本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上所述的数据解析方法中的步骤。
153.在本发明实施例中,通过预先获取sql语句提取特征值,从而在对目标数据库流量数据进行解析时,可以依据所述sql语句提取特征值中的子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围,确定该目标数据库流量数据中的sql语句的长度和起始位置,进而可基于该长度和起始位置信息,从该目标数据库流量数据中提取出sql语句,该方式可适用于对不同场景中的目标数据库流量数据进行sql语句解析。
附图说明
154.为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
155.图1是本发明实施例提供的数据解析方法的流程图;
156.图2是本发明实施例提供的tns协议数据结构示意图。
157.图3是本发明实施例提供的提取sql关键字段的流程图;
158.图4是本发明实施例提供的sql关键词判断模块的工作流程图;
159.图5是本发明实施例提供的依据sql语句提取特征值提取sql语句的流程图;
160.图6是本发明实施例提供的sql语句检索提取流程图;
161.图7是本发明实施例提供的数据解析装置的结构图之一;
162.图8是本发明实施例提供的数据解析装置的结构图之二;
163.图9是本发明实施例提供的数据解析装置的结构图之三。
具体实施方式
164.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
165.参见图1,图1是本发明实施例提供的数据解析方法的流程图,如图1所示,包括以下步骤:
166.步骤101、获取待解析目标数据库流量数据。
167.本发明实施例适用于对客户端与服务器之间采用透明网络底层(transparent network substrate,tns)协议进行交互(对目标数据库中的数据进行读写访问)时产生的流量数据进行解析的场景,目的是提取出流量数据即tns数据包中的sql语句。例如,所述目标数据可以是oracle数据库,所述待解析目标数据库流量数据可以是对oracle数据库进行读写访问时产生的流量数据。后续均以oracle数据库为例对本发明实施例进行说明。
168.上述获取待解析目标数据库流量数据,可以是通过镜像流量的方式获取需要解析的目标数据库流量数据。
169.由于所述tns协议并不公开,只已知部分数据结构,因此只能解析到部分子功能类型这一步,对于具体内容部分的详细结构都是未知的,如图2所示,tns协议的前12个字节的内容是已知的,其中第5个字节为类型字段,代表tns数据包的类型,第9个字节和第10个字节代表数据标志data flag,第11个字节代表该类型tns数据包的功能id,第12个字节代表该类型该功能tns数据包的子功能sub id,但后续负载部分的内容数据结构是未知的。本发明实施例的目的便是需要解析出tns数据包中的这部分内容结构,具体可以是解析数据类型的tns数据包中的sql语句内容,以确定客户端对所述目标数据库具体进行了哪些访问,进而满足各企业对数据读写访问的审计需求。
170.需说明的是,本方案只关注sql语句的解析,因此可对tns协议数据内容进行过滤,例如,可只解析第5个字节值为0x06(表示类型为数据data),第11个字节和12个字节组合取值为0x035e或者0x1169的流量数据。因此本方案后续内容中所指的oracle流量数据均可以是指满足该条件(第5个字节值为0x06,第11个字节和第12个字节组合取值为0x035e或者0x1169)的oracle流量数据。
171.步骤102、依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围。
172.上述sql语句提取特征值可以是预先获取的,具体可以是通过对大量不同场景(如不同版本的tns协议、不同版本的数据库、不同客户端和服务器等)中的oracle流量数据采用字符串检索的方式进行逐一解析,确定每条oracle流量数据中的子功能偏移值、sql语句长度标识位的相对偏移值和sql语句起始位的相对偏移值,并对这些值进行统计分析得到能够覆盖大部分场景中的oracle流量数据的特征值。进而通过所述sql语句提取特征值可实现对不同场景中的oracle流量数据进行解析。
173.即所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏
移值常量和sql语句起始位的相对偏移值范围,其中,所述子功能偏移值常量可以用于确定oracle流量数据中目标子功能(如值为0x035e的字节位)的偏移位数,如值为0x1169的字节位至值为0x035e的字节位之间的位数差;所述sql语句长度标识位的相对偏移值常量可以用于确定oracle流量数据中sql语句长度标识位的相对偏移位数,如sql语句长度标识位相对第12个字节位的偏移位数,即等于第12个字节位至sql语句长度标识位之间的位数差(如图2所示,前12个字节是已知的数据结构,sql语句位于第12个字节之后),当存在子功能偏移时,还需再减去子功能偏移值常量;所述sql语句起始位的相对偏移值范围可以用于确定oracle流量数据中sql语句起始位的相对偏移位数,如sql语句起始位相对第12个字节位的偏移位数,即等于第12个字节位至sql语句起始位之间的位数差,当存在子功能偏移时,还需再减去子功能偏移值常量。
174.这样,可以通过所述sql语句提取特征值中的子功能偏移值常量和sql语句长度标识位的相对偏移值常量,确定所述待解析oracle流量数据中的sql语句长度标识位,通过获取该sql语句长度标识位的值,便可确定sql语句的长度;通过所述sql语句提取特征值中的的子功能偏移值常量和sql语句起始位的相对偏移值范围,可以确定所述待解析oracle流量数据中的sql语句起始位的检索范围,并通过在该范围内检索sql语句起始位,可以确定sql语句的起始位置。
175.可选的,所述步骤102之前,所述方法还包括:
176.获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
177.确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
178.基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
179.基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
180.基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
181.将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
182.即可以预先通过抽样不同场景中的oracle流量数据,对这些oracle流量数据进行sql语句解析,并对解析结果进行统计分析来确定所述sql语句提取特征值,以保证后续可以依据所述sql语句提取特征值实现对不同场景中的oracle流量数据的解析。
183.具体地,可以先获取n条oracle抽样流量数据,例如,可以通过镜像流量的方式获取大量的不同场景中的oracle流量数据,并从中抽样部分oracle流量数据,抽样可以是随机抽样,也可以是抽取一段时间内的oracle流量数据,或者抽取几个时间段内的oracle流量数据。其中,n可以取较大的值,以保证最终所确定的sql语句提取特征值能够覆盖大部分场景中的oracle流量数据。
184.然后,可以通过对每条oracle抽样流量数据,采用字符串检索的方式进行逐一解析,例如,检索目标子功能(如0x035e)所在的字节位,检索sql语句起始位,检索sql语句结束位,依据sql语句起始位和sql语句结束位确定sql语句长度,进而确定sql语句长度标识
位,如确定值等于sql语句长度的字节位等,来确定每条oracle抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值。
185.接着,可基于确定的每条oracle抽样流量数据的子功能偏移值,确定子功能偏移值常量,例如,对于n条oracle抽样流量数据,可得到多个不同的子功能偏移值,也存在一些相同的子功能偏移值,如多条oracle抽样流量数据中的子功能偏移值相同,其中,不存在子功能偏移的oracle抽样流量数据,可记其子功能偏移值为0,或者只记录存在子功能偏移的oracle抽样流量数据的子功能偏移值,从而可将多个不同的子功能偏移值中计数最多的子功能偏移值作为子功能偏移值常量,或者,也可以将其中计数较多且值最小或最大的子功能偏移值作为子功能偏移值常量。
186.可基于确定的每条oracle抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围,例如,对于n条oracle抽样流量数据,可得到n个sql语句起始位的相对偏移值,从而可依据这n个sql语句起始位的相对偏移值中的最小值和最大值,确定sql语句起始位的相对偏移值范围,或者,也可以对这n个sql语句起始位的相对偏移值的取值范围进行缩小,取其中计数较高的部分sql语句起始位的相对偏移值中的最小值和最大值,来得到sql语句起始位的相对偏移值范围,以缩小后续解析时检索sql语句起始位的范围,提高检索速度。需说明的是,对于所确定的sql语句起始位的相对偏移值范围,还可以根据实际需求进行灵活调整。
187.还可基于每条oracle抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量,例如,对于n条oracle抽样流量数据,可得到n个sql语句长度标识位的相对偏移值,其中会存在一些相同的sql语句长度标识位的相对偏移值,如多条oracle抽样流量数据中的sql语句长度标识位的相对偏移值相同,从而可将n个sql语句长度标识位的相对偏移值中计数最多的sql语句长度标识位的相对偏移值作为sql语句长度标识位的相对偏移值常量。
188.最后,可将所确定的子功能偏移值常量、sql语句起始位的相对偏移值范围和sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
189.进一步的,所述确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值,包括:
190.分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
191.分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
192.分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
193.依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
194.上述目标子功能值可以是表示携带有sql语句的tns数据包中的功能及子功能编
号,例如,携带有sql语句字段的tns数据包中,目标子功能值为0x035e,也即id和subid字段的组合值为0x035e。
195.该实施方式中,可以通过分别检索每条oracle抽样流量数据中的目标子功能值位置,来确定每条oracle抽样流量数据中的子功能偏移值,具体地,对于每一条oracle抽样流量数据,可以从中检索连续两个字节的组合值为目标子功能值的字节,确定该字节所在的位置,并基于该位置,确定对应的子功能偏移值。例如,可以从某条oracle抽样流量数据中的第11个字节开始,依次检索每个字节的值,当检索到连续两个字节的组合值为0x035e(即两个字节的值分别为0x03和0x5e)时,则以这两个字节位,确定子功能偏移值。再例如,tns协议中,在不存在子功能偏移的情况下,通常第11个字节和第12个字节的组合值为0x035e,若检索到第11个字节和第12个字节的组合值为0x035e,则确定不存在子功能偏移,或者子功能偏移值为0,若检索到第p个字节和第p+1个字节的组合值为0x035e,则可以第p个字节相对第11个字节的偏移位数,确定子功能偏移值为p-11,或以第p+1个字节相对第12个字节的偏移位数,确定子功能偏移值为p+1-12=p-11。
196.在检索每条oracle抽样流量数据中的目标子功能值位置时,还可以进一步检索每条oracle抽样流量数据中的sql语句起始位置,来确定每条oracle抽样流量数据中的sql语句起始位的相对偏移值,具体地,由于sql语句字段通常在目标子功能字段之后,故对于每一条oracle抽样流量数据,可以在检索到目标子功能值后,从该字节的下一字节开始检索sql语句起始位置,例如,检索连续多个字节值对应的字符为字母的字节位置,并可基于该连续字节中的第一字节,确定对应的sql语句起始位的相对偏移值,又例如,第11个字节和第12个字节的组合值为0x035e,检索到第m个字节为sql语句起始位置,则sql语句起始位的相对偏移值为m-13。
197.在检索到每条oracle抽样流量数据中的sql语句起始位置后,可以继续检索每条oracle抽样流量数据中的sql语句结束位置,具体地,对于对于每一条oracle抽样流量数据,可以从检索到的sql语句起始位置之后检索sql语句结束位置,例如,检索sql语句结束标识符,如检索字节值为0x00或0x01的字节,并可基于检索到的sql语句结束位和sql语句起始位,确定对应的sql语句长度,又例如,检索到第m个字节为sql语句起始位,第l个字节为sql语句起始位,则可以确定sql语句长度为m-l。
198.在确定每条oracle抽样流量数据中的sql语句长度后,可以再次从每条oracle抽样流量数据中检索字节值与其sql语句长度匹配的字节,以确定其sql语句长度标识位在oracle抽样流量数据中的位置,并基于该位置,确定sql语句长度标识位的相对偏移值。具体地,由于一个字节所能存储的值范围为0~255,且sql语句长度标识位通常位于目标子功能字节之后,sql语句起始位之前,故对于sql语句长度小于256的oracle抽样流量数据,可以从目标子功能字节至sql语句起始位之间检索值等于其sql语句长度的字节,对于sql语句长度大于256的oracle抽样流量数据,可以从目标子功能字节至sql语句起始位之间检索连续两个字节值按特定公式计算后等于其sql语句长度的字节,该字节即为sql语句长度标识位,并可依据该字节位相对目标子功能位的偏移量确定sql语句长度标识位的相对偏移值。例如,第11个字节和第12个字节的组合值为0x035e,检索到第h个字节为sql语句长度标识位,则可以确定sql语句长度标识位的相对偏移值为h-13。
199.这样,通过分别检索每条oracle抽样流量数据中的目标子功能值位置、sql语句起
始位置和sql语句结束位置,可以保证基于这些位置信息能够较为准确地确定每条oracle抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值。
200.进一步的,所述分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,包括:
201.将偏移量赋值为第一预设值m,m为大于1的整数;
202.获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
203.若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
204.若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
205.若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
206.若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
207.tns协议内容中,每两个数字代表一个字节的内容,假设一条tns协议内容中的字节有序集合为{byte1,byte2,
……
,byten},该集合可表示为字节数组data,对于每一个字节的内容,使用data[off]的形式来表示,off表示偏移量,例如第一个字节的内容偏移量为0,使用data[0]表示,即data[0]=byte1,data[1]=byte2,data[n-1]=byten。整个oracle抽样流量数据集合表示为{data1,data2,
……
,datan}。
[0208]
对于n条oracle抽样流量数据中的任一条oracle抽样流量数据,假设为第一oracle抽样流量数据,可以先将偏移量off赋值为第一预设值m,其中,m的值可以根据目标子功能字节在不存在子功能偏移时的偏移值确定,例如,第11个字节data[10]和第12个字节data[11]的值为0x035e,为目标子功能字节,则可以确定第一预设值m的值为12,即后续从第13个字节data[12]开始检索sql语句起始位。
[0209]
具体地,在检索sql语句起始位之前,可以先获取第一oracle抽样流量数据中的第m-2个字节和第m-1个字节的组合值,记为第一组合值,获取后可以判断第一组合值是否为第一目标值,所述第一目标值可以是目标子功能值,例如,m=12,第一目标值为0x035e,则可以获取data[10]和data[11]字节的组合值,判断其是否为0x035e。
[0210]
若所述第一组合值为第一目标值,则可以从所述第一oracle抽样流量数据中的第m+1个字节即data[m]开始检索sql语句起始位,具体可以是先检索连续多个字节值对应的ascii码为预设字符的字节,如0x73对应字符s,所述预设字符可以包括字母a~z和a~z,即
可以先检索第m+1个字节data[m]和第m+1个字节之后的l个字节是否为字母(此时j=0),其中,l可以根据sql语句与其他内容的区别确定,例如,sql语句至少包括三个以上的连续字母,则l可以取2,此时可以检索data[m]、data[m+1]和data[m+2]是否均为字母,若是,则可以确定第m+1个字节data[m]可能为sql语句的起始位置;若检索到第m+1个字节data[m]或第m+1个字节之后的l个字节不是字母,则可以将偏移量的值加1(即j=0+1),继续检索下一个字节及其之后的l个字节是否为字母,直至检索到连续l+1个字节均为字母为止。
[0211]
假设检索到第m+1+j个字节data[m+j]及第m+1+j个字节之后的l个字节均为预设字符,则可以确定第m+1+j个字节data[m+j]可能为sql语句的起始位置,为保证准确性,可以进一步判断第m+1+j个字节data[m+j]是否为sql语句的起始位置。例如,可以从第m+1+j个字节data[m+j]开始获取其中第一个单词,假设字节data[m+j]至字节data[m+j+g-1]均为连续字母,且字节data[m+j+g]不是字母,则可以获取由这g个字母组成的单词,判断该单词是否为sql语句的关键词,若是,则确定第m+1+j个字节data[m+j]为sql语句的起始位置。
[0212]
在确定第m+1+j个字节即data[m+j]为sql语句的起始位置的情况下,可以确定所述第一oracle抽样流量数据中的sql语句起始位置为data[m+j],可记sql语句起始偏移值sqlstart为m+j,进而可确定所述第一oracle抽样流量数据中的sql语句起始位data[m+j]相对data[m]的偏移值为m+j-m=j,即可记sql语句起始位的相对偏移值offsql为j。
[0213]
这样,通过该实施方式,可准确地检索出每条oracle抽样流量数据中的sql语句起始位,并依据其偏移量确定sql语句起始位的相对偏移值。
[0214]
进一步的,所述判断第m+1+j个字节是否为sql语句的起始位置,包括:
[0215]
从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
[0216]
若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
[0217]
若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
[0218]
判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
[0219]
即可以通过从所述第一oracle抽样流量数据中的第m+1+j个字节开始检索间隔符的方式,来获取其中第一个单词,进而通过判断该单词是否属于sql关键词,来判断第m+1+j个字节data[m+j]是否为sql语句的起始位置。
[0220]
具体地,可以从第m+1+j个字节data[m+j]开始至data[m+j+g]之间,依次检索各字节是否为间隔符,若不是,则将偏移量加1,即将g的值加1,继续检索下一字节,直至检索到间隔符为止,或者未检索到间隔符。其中,所述间隔符可以包括空格、换行符和制表符,g为第二预设值,所述第二预设值可以根据sql关键词的最大长度确定,例如,一般sql关键词不会超过10个字符,则可以设定第二预设值g=10。
[0221]
假设检索到第m+1+j+g个字节data[m+j+g]为间隔符,则可以记data[m+j]至data[m+j+g-1]中的字节内容为sql语句中的第一个单词,并可以将data[m+j]至data[m+j+g-1]字节的值相加,得到总值,再判断所述总值是否属于sql关键词的值集合,若属于,则确定第
m+1+j个字节data[m+j]为sql语句的起始位置,其中,所述sql关键词的值集合可以是通过统计所有sql关键词,并将每个sql关键词中的字母对应的ascii码值相加,得到每个sql关键词对应的值,将这些值集合在一块得到所述sql关键词的值集合。
[0222]
例如,通过统计确定所述sql关键词的值集合包括但不限于以下内容:640,627,661,643,437,628,536,540,652,649,842,421,412,332,870,517。某oracle流量数据从偏移量off(off=m+j)开始的20字节的内容为:select'x'from dual,则则data[off]到data[off+19]的内容为:[115,101,108,101,99,116,32,39,120,39,32,102,114,111,109,32,100,117,97,108],则可从data[off]开始检索到data[off+6]为空格符32,则可将前6位的值相加,即115+101+108+101+99+116=640,而640在sql的关键词的值集合内,因此可判定data[off]为sql语句的起始位置。
[0223]
这样,通过获取oracle抽样流量数据中的首单词是否属于sql关键词,可较为准确地判断当前检索到的字节data[m+j]是否为sql语句起始位。
[0224]
进一步的,所述方法还包括:
[0225]
若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0226]
即在通过上述检索间隔符的方式判断第m+1+j个字节data[m+j]是否为sql语句的起始位置时,若将data[m+j]字节至data[m+j+g-1]字节的值相加得到的总值不属于所述sql关键词的值集合,则可以判定字节data[m+j]并非sql语句的起始位置,需要重新检索,具体地,可以将j的值更新为j+g,即将偏移量更新为m+j+g,检索data[m+j+g]及其之后的l个字节是否为预设字符,以重新检索可能为sql语句起始位的字节。
[0227]
或者,在字节data[m+j]至data[m+j+g]之间未检索到间隔符的情况下,同样可以判定字节data[m+j]并非sql语句的起始位置,需要重新检索,具体地,可以将j的值更新为j+g(此时g=g),即将偏移量更新为m+j+g,检索data[m+j+g]及其之后的l个字节是否为预设字符,以重新检索可能为sql语句起始位的字节。
[0228]
这样,可以保证在不同的检索情况下能通过不同的方式检索到准确的sql语句起始位置。
[0229]
可选的,所述分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值,包括:
[0230]
若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
[0231]
若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
[0232]
若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据库抽样流量数据的子功能偏移值为i+2。
[0233]
即在第一oracle抽样流量数据中检索目标子功能值时,若第m-1个字节和第m个字节的第一组合值不为第一目标值,而为第二目标值时,说明所述第一oracle抽样流量数据中存在子功能偏移,因此,需要从第m+1个字节开始检索组合值为第一目标值的两个字节。例如,m=12,第一目标值为0x035e,第二目标值为0x1169,当获取到第11个字节data[10]和第12个字节data[11]的组合值为0x1169时,需要从第13个字节开始检索组合值为0x035e的两个字节。
[0234]
若检索到第m+1个字节data[m]和第m+2个字节data[m+1]的组合值不为第一目标值,则可以将偏移量off加1,即继续检索下一字节data[off]和字节data[off+1]的组合值(此时off=m+1),直至检索到组合值为第二目标值的两个字节为止。
[0235]
假设检索到第m+1+i个字节data[m+i]和第m+i+2个字节data[m+i+1]的组合值为所述第一目标值,则可以记所述第一oracle抽样流量数据中的目标子功能值位置为第m+1+i个字节data[m+i],并可确定相应的子功能偏移值off5e为m+1+i-(m-1)=i+2。
[0236]
这样,在第一组合值为第二目标值的情况下,可以通过检索组合值为第一目标值的字节位置确定子功能偏移值,进而可通过该方式准确确定存在子功能偏移的oracle抽样流量数据中的子功能偏移值。
[0237]
进一步的,所述确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节之后,所述方法包括:
[0238]
将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0239]
即在确定第一oracle抽样流量数据中存在子功能偏移的情况下,在确定其子功能偏移值off5e后,可以将偏移量的值更新为m+i+2,并从第m+i+3个字节data[m+i+2]开始检索连续l+1个字节为预设字符的字节,以确定所述第一oracle抽样流量数据中可能为sql语句起始位置的字节。
[0240]
且在存在子功能偏移的情况下,sql语句起始位的相对偏移值为sql语句起始位的偏移值减去m+1后还需减去其子功能偏移值,例如,在确定字节data[off]为sql语句起始位(此时off=m+1+i+2+j)时,可以确定sql语句起始位的相对偏移值为off-m-off5e=m+1+i+2+j-(m+1)-(i+2)=j。
[0241]
进一步的,所述分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度,包括:
[0242]
若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
[0243]
若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
[0244]
若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
[0245]
即在通过前述方式确定第m+1+j个字节为sql语句的起始位置的情况下,可以从所述第一oracle抽样流量数据中的第m+1+j个字节开始检索sql语句的结束标识符,例如,可以检索值为0x00或0x01的字节,以确定sql语句结束位置。当然,由于第m+1+j个字节之后的l个字节也为预设字符,故也可以从第m+1+j+l个字节开始检索sql语句的结束标识符。
[0246]
若检索到第m+1+j个字节data[m+j]不为sql语句的结束标识符,则可以将偏移量off加1,即继续检索下一字节data[m+j+1]是否为sql语句的结束标识符,直至检索到sql语句的结束标识符的字节为止。
[0247]
假设检索到第m+1+j+k个字节data[m+j+k]为sql语句的结束标识符,则可以记所述第一oracle抽样流量数据中的sql语句结束位置为第m+1+j+k个字节data[m+j+k],并可依据sql语句起始位置data[m+j]和sql语句结束位置data[m+j+k],确定sql语句长度sqllen为m+j+k-(m+j)=k,即sql语句长度等于sql语句结束位偏移值与sql语句起始位偏移值之差。
[0248]
这样,通过检索每条oracle抽样流量数据中的sql语句的结束标识符,确定其sql语句结束位置,进而可结合其sql语句起始位置和sql语句结束位置确定每条oracle抽样流量数据中的sql语句长度。
[0249]
下面结合图3和图4,对前述实施方式中介绍的对oracle抽样流量数据进行sql语句解析的流程进行举例说明:
[0250]
其中图3所示的sql关键字段提取流程如下:
[0251]
步骤31、将偏移量off赋值为12。
[0252]
步骤32、获取oracle抽样流量数据中的tns协议内容的功能及子功能值func,即为data[10]和data[11]字节的组合值。
[0253]
步骤33、判断func是否为0x035e,若是则进入步骤37,否则进入步骤34。
[0254]
步骤34、判断func是否为0x1169,若是则进入步骤35。
[0255]
步骤35、从data[off]开始,在一定范围内(如可以是12个字节内),检索后续内容中连续两个字节为0x03和0x5e的位置。
[0256]
步骤36、假设检索到data[off+i]值为0x03且data[off+i+1]值为0x5e,记录子功能标识0x1169到0x035e的偏移值off5e=i+2,并且将偏移量off值更新为off+i+2。若未检索到,则忽略该条数据,即放弃对该条数据的解析。
[0257]
步骤37、从data[off]开始检索字母(即检索该字节的值转换为acsii码后是否为a~z或a~z),直到data结尾。
[0258]
步骤38、判断是否检索到data[off+j]为字母,且后续两个字节也是字母,若是则进入步骤310,否则进入步骤39。
[0259]
步骤39、将off赋值为off+j+1,重复上一步骤37。
[0260]
步骤310、将偏移量off更新为off+j,并转入如图4所示的sql关键词判断模块的流程,判断该偏移量是否为sql语句的起始位置。
[0261]
步骤311、若判断结果为假,则将off更新为off+间隔符偏移量(若图4流程中未检索到间隔符,则将off更新为off+g),并重新回到步骤37。
[0262]
步骤312、若判断结果为真,则将当前偏移量off记为sql语句起始偏移值sqlstart,并记录sql语句相对偏移值offsql=sqlstart-12(若data[10]和data[11]字节
为0x1169,则offsql=sqlstart-off5e-12)。
[0263]
步骤313、从data[off]开始检索sql语句结束符(如0x00或0x01),直到data结尾,每检索一个字节,off赋值更新为off+1。
[0264]
步骤314、检索到sql语句结束符后,可记sql语句的长度值sqllen=off-sqlstart。
[0265]
其中图4所示的关键词判断模块的工作流程如下:
[0266]
步骤41、从data[off]开始检索间隔符(包括空格、换行符“/r”“/n”和制表符“/t”),直到data[off+g],例如,g=10。
[0267]
步骤42、判断是否检索到间隔符,若检索到,进入步骤43,否则进入步骤46。
[0268]
步骤43、记当前偏移量为offspace,将data[off]至data[off+offspace-1]的所有字节的值相加,记为k。
[0269]
步骤44、判断k是否在sql关键词的值集合内,其中,若是,则进入步骤45,否则进入步骤46。
[0270]
步骤45、判断结果为真。
[0271]
步骤46、判断结果为假。
[0272]
进一步的,所述依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,包括:
[0273]
在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
[0274]
若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
[0275]
依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0276]
也就是说,在确定每条oracle抽样流量数据中的sql语句长度后,可以依据确定的sql语句长度值,来确定每条oracle抽样流量数据中的sql语句长度标识位,即确定其中字节值与sql语句长度值匹配的字节位,并可依据每条oracle抽样流量数据中的sql语句长度标识字节所在位置确定sql语句长度标识位的相对偏移值。
[0277]
具体地,在确定所述第一oracle抽样流量数据中的sql语句长度为k的情况下,可以先判断k的值是否大于第三预设值,所述第三预设值可以根据一个字节所能存储的值范围确定,例如,一个字节所能存储的值范围为0~255,故第三预设值可以为256。
[0278]
在k的值小于第三预设值的情况下,可以从所述第一oracle抽样流量数据中检索值等于k的字节,具体地,由于sql语句长度标识位通常位于目标子功能位之后,且位于sql语句起始位之前,故可以从第q+1个字节data[q]至第q+1+j个字节data[q+j]之间检索值为k的目标字节,其中q可以等于第一预设值m与子功能偏移值之和,即在所述第一oracle抽样流量数据中不存在子功能偏移时,可以从data[m]至data[m+j]之间检索值为k的目标字节,
此时data[m+j]为sql语句起始位,在所述第一oracle抽样流量数据中存在子功能偏移时,可以从data[m+off5e]至data[m+off5e+j]之间检索值为k的目标字节,此时data[m+off5e+j]为sql语句起始位。
[0279]
在k的值大于或等于第三预设值的情况下,sql语句长度标识位需要两格字节来表示,第一个字节存储k除以第三预设值的商,记为第三目标值,第二个字节存储k除以第三预设值的余数,记为第四目标值,故可以依据k的值确定需要检索的两个字节的值,并从所述第一oracle抽样流量数据中检索连续两个字节值分别为所述第三目标值和所述第四目标值的两个字节,类似地,可以从第q+1个字节data[q]至第q+1+j个字节data[q+j]之间检索,并可将检索到的两个字节中的第一个字节确定为目标字节。
[0280]
例如,若k的值为123,小于256,则可以检索值为123的字节,若k的值为1232,大于256,则需检索两个连续字节,其中第一个字节为1232除以256的商4,第二字节为1232除以256的余数208。
[0281]
在检索到目标字节的情况下,可以依据目标字节的偏移值,确定所述第一oracle抽样流量数据中的sql语句长度标识位的相对偏移值,例如,在所述第一oracle抽样流量数据中不存在子功能偏移的情况下,检索到目标字节偏移值为w,则可以确定其sql语句长度标识位的相对偏移值offlen为w-m,在所述第一oracle抽样流量数据中存在子功能偏移的情况下,检索到目标字节偏移值为w,则可以确定其sql语句长度标识位的相对偏移值offlen为w-m-off5e。
[0282]
这样,通过检索每条oracle数据库抽样流量数据中值与sql语句长度匹配的目标字节,可以依据目标字节所在位置准确地确定sql语句长度标识位的相对偏移值。
[0283]
可选的,所述基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量,包括:
[0284]
对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
[0285]
即对于oracle抽样流量数据集合{data1,data2,
……
,datan},在确定每条oracle抽样流量数据的子功能偏移值后,可以得到子功能偏移值集合{off5e1,off5e2,
……
,off5en},通过对该集合中的数值进行去重计数统计,可以得到不同的子功能偏移值及其计数,并可以将其中计数最高的子功能偏移值记为子功能偏移值常量off_5e,以保证该子功能偏移值常量可以覆盖大部分流量数据中的子功能偏移值。
[0286]
可选的,所述基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围,包括:
[0287]
对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
[0288]
将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
[0289]
依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相对偏移值集合中所有相
对偏移值的计数之和与所述提取比例阈值的乘积;
[0290]
依据所述最小相对偏移值子集合中的最大相对偏移值和最小相对偏移值,确定sql语句起始位的相对偏移值范围。
[0291]
即对于oracle抽样流量数据集合{data1,data2,
……
,datan},在确定每条oracle抽样流量数据中的sql语句起始位的相对偏移值后,可以得到sql语句起始位的相对偏移值集合{offsql1,offsql2,
……
,offsqln},通过对该集合中的数值进行去重计数统计,可以得到不同的sql语句起始位相对偏移值及其计数,每一个sql语句起始位相对偏移值及其计数可记为二元组ai=(ai,ci),a表示sql语句起始位相对偏移值,c表示计数。并可对这些二元组按值大小进行排序,例如,按值从小到大的顺序排序,可得到sql语句相对偏移值计数二元组集合{a1,a2,
……
,a
t
},其中,t小于或等于n。
[0292]
然后,可以依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,所述目标计数值为所述相对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积,其中,所述提取比例阈值可以是为了保证检索速度和降低资源消耗而设定的,具体可以通过多次试验设定合适的阈值,例如可定义为80%,测试结果偏移值取值范围不大于10。
[0293]
具体地,在对二元组按值从小到大的顺序排序,得到sql语句相对偏移值计数二元组集合{a1,a2,
……
,a
t
}后,可以从a1开始按序检索满足公式的相对偏移值子集合,v为提取比例阈值,例如,对偏移值子集合,v为提取比例阈值,例如,可以先判断c1除以c是否大于或等于v,若是,则记录相对偏移值子集合{a1},并停止从a1处开始检索满足公式的相对偏移值子集合,否则继续判断c1+c2除以c是否大于或等于v,若是,则记录相对偏移值子集合{a1,a2},并停止从a1处开始检索满足公式的相对偏移值子集合,否则继续判断c1+c2+c3除以c是否大于或等于v,按照类似的方式确定从a1处开始检索到的满足公式且包含最少数量相对偏移值的的相对偏移值子集合,然后从a2处开始检索满足公式且包含最少数量相对偏移值的相对偏移值子集合,直至检索对a
t
检索完毕。再依据记录的相对偏移值子集合,确定其中相对偏移值范围最小的相对偏移值子集合,即记录的相对偏移值子集合中a
v-au的差值最小的相对偏移值子集合,其中,av为相对偏移值子集合中的最大值,au为相对偏移值子集合中的最小值。
[0294]
假设得到的最小相对偏移值子集合为{au,a
u+1
,
……
,av},则可以记sql语句提取偏移值最小为off_sql_min=au,最大为off_sql_max=av,即sql语句起始位的相对偏移值范围为off_sql_min到off_sql_max。
[0295]
这样,通过该实施方式,可确定提取sql语句的偏移值范围,并可保证后续检索sql语句起始位时能够具有较快的检索速度,减少资源消耗。
[0296]
可选的,所述基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量,包括:
[0297]
对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
[0298]
即对于oracle抽样流量数据集合{data1,data2,
……
,datan},在确定每条oracle抽样流量数据中的sql语句长度标识位的相对偏移值后,可以得到sql语句长度标识位的相对偏移值集合{offlen1,offlen2,
……
,offlenn},通过对该集合中的数值进行去重计数统计,可以得到不同的sql语句长度标识位相对偏移值及其计数,并可以将其中计数最高的sql语句长度标识位相对偏移值记为sql语句长度标识位的相对偏移值常量off_len,以保证该sql语句长度标识位的相对偏移值常量可以覆盖大部分流量数据中的sql语句长度标识位相对偏移值。
[0299]
可选的,所述基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量,包括:
[0300]
对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
[0301]
即对于oracle抽样流量数据集合{data1,data2,
……
,datan},在确定每条oracle抽样流量数据中的sql语句长度标识位的相对偏移值后,可以得到sql语句长度标识位的相对偏移值集合{offlen1,offlen2,
……
,offlenn},通过对该集合中的数值进行去重计数统计,可以得到不同的sql语句长度标识位相对偏移值及其计数,并可以将其中计数最高的sql语句长度标识位相对偏移值记为sql语句长度标识位的相对偏移值常量off_len,以保证该sql语句长度标识位的相对偏移值常量可以覆盖大部分流量数据中的sql语句长度标识位相对偏移值。
[0302]
步骤103、依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
[0303]
然后,可以依据所确定的sql语句的长度和起始位置,从所述待解析oracle流量数据中提取sql语句,具体可以是基于所述sql语句的长度和起始位置,确定sql语句的结束位置,然后从所述待解析oracle流量数据中提取的sql语句的起始位置至结束位置之间的内容,得到所述待解析oracle流量数据中的sql语句内容。提取得到的sql语句内容可用于企业进行数据访问审计。
[0304]
可选的,所述步骤102包括:
[0305]
将偏移量赋值为第一预设值m,m为大于1的整数;
[0306]
获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
[0307]
若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
[0308]
依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
[0309]
依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
[0310]
若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标
识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
[0311]
若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
[0312]
对于所述待解析oracle流量数据每一个字节的内容,使用data[off]的形式来表示,off表示偏移量,例如第一个字节的内容偏移量为0,使用data[0]表示,即data[0]=byte1,data[1]=byte2,data[n-1]=byten。
[0313]
即在获取到待解析oracle流量数据后,可以将偏移量off赋值为第一预设值m,所述m的值与对oracle抽样流量数据进行解析时使用的m值一样,同样可以是根据目标子功能字节在不存在子功能偏移时的偏移值确定,例如,第11个字节data[10]和第12个字节data[11]的值为0x035e,为目标子功能字节,则可以确定第一预设值m的值为12,即后续从第13个字节data[12]开始检索sql语句长度标识位和sql语句起始位。
[0314]
具体地,可以先获取所述待解析oracle流量数据中的第m-1个字节和第m个字节的组合值,记为第三组合值,获取后可以判断所述第三组合值是否为第一目标值,所述第一目标值可以是目标子功能值,例如,m=12,第一目标值为0x035e,则可以获取data[10]和data[11]字节的组合值,判断其是否为0x035e。
[0315]
若所述第三组合值为第一目标值,则可以依据所述sql语句提取特征值中的sql语句长度标识位的相对偏移值常量off_len,获取所述待解析oracle流量数据中的第m+off_len个字节即data[m+off_len-1]的值,来得到sql语句长度标识位数,其中,字节data[m+off_len]为sql语句长度标识位,sql语句长度标识位的前一字节存储的是sql语句长度标识位数,故可以通过获取字节data[m+off_len-1]的值,得到sql语句长度标识位数,sql语句长度标识位数为1或2,例如,当所述待解析oracle流量数据中中的sql语句长度小于256时,sql语句长度标识位数为1位,当所述待解析oracle流量数据中中的sql语句长度大于或等于256时,sql语句长度标识位数为2位。
[0316]
然后,可以依据获取到的sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析oracle流量数据中的sql语句的长度,具体地,若所述sql语句长度标识位数为1,则可以获取第m+off_len+1个字节即data[m+off_len]的值,得到所述待解析oracle流量数据中的sql语句的长度,该字节data[m+off_len]中存储的便是sql语句的长度值;若所述sql语句长度标识位数为2,则可以获取第m+off_len+1个字节即data[m+off_len]和第m+off_len+2个字节即data[m+off_len+1]的值,sql语句的长度=data[m+off_len]
×
256+data[m+off_len+1]。
[0317]
接着,可依据所述sql语句提取特征值中的sql语句起始位的相对偏移值范围,从所述待解析oracle流量数据中检索sql语句开始标识符,具体地,可以从第m+off_sql_min+1个字节data[m+off_sql_min]开始检索sql语句开始标识符,并且检索范围为data[m+off_sql_min]至data[m+off_sql_max],其中,off_sql_min为sql语句起始位的最小相对偏移值,off_sql_max为sql语句起始位的最大相对偏移值。所述sql语句开始标识符可以包括三种,一种是连续两个字节的组合值为0xfe40,二是sql语句长度标识位数为1位时的sql语句长度值(即sql语句起始位的前一位为sql语句长度标识位),三是连续多个字节值为0x00,但后一位字节是可见字符。
[0318]
假设检索到所述待解析oracle流量数据中的第m+r-1个字节data[m+r-2]为sql语
句开始标识符,则可以进一步判断sql语句开始标识符的后一个字节即第m+r个字节data[m+r-1]是否为sql语句的起始位置,具体地判断方式可参见前述实施方式中介绍的对oracle抽样流量数据进行解析时所使用的sql语句起始位置判断方式,在此不作赘述。
[0319]
若判定第m+r个字节data[m+r-1]为sql语句的起始位置,则可以确定所述待解析oracle流量数据中的sql语句的起始位置为第m+r个字节data[m+r-1]。
[0320]
这样,通过该实施方式,可以依据所述sql语句提取特征值,快速地检索到所述待解析oracle流量数据中的sql语句长度标识位和sql语句起始位,进而可以快速确定所述待解析oracle流量数据中的sql语句长度和sql语句起始位置。
[0321]
进一步的,所述获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值之后,所述方法还包括:
[0322]
若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
[0323]
即在获取到所述待解析oracle流量数据中的第m-1个字节和第m个字节的第三组合值不为第一目标值而是为第二目标值的情况下,可以确定该条oracle流量数据中存在子功能偏移,故可以依据所述sql语句提取特征值中的子功能偏移值常量off_5e,更新所述偏移量后,再使用前述实施方式来快速地检索所述待解析oracle流量数据中的sql语句长度标识位和sql语句起始位。即将偏移量更新为m+off_5e,然后获取所述待解析oracle流量数据中的第m+off_5e+off_len个字节的值,来得到sql语句长度标识位数,并可依据所述sql语句起始位的相对偏移值范围,从所述待解析oracle流量数据中第m+off_5e+off_sql_min+1个字节data[m+off_5e+off_sql_min]至data[m+off_5e+off_sql_max]之间检索sql语句开始标识符,来确定sql语句起始位置。
[0324]
这样,在所述待解析oracle流量数据存在子功能偏移的情况下,通过依据所述sql语句提取特征值中的子功能偏移值常量,可以快速准确地检索到sql语句长度标识位和sql语句起始位,进而可快速确定所述待解析oracle流量数据中的sql语句长度和sql语句起始位置。
[0325]
进一步的,所述步骤103包括:
[0326]
从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
[0327]
在确定所述待解析oracle流量数据中的sql语句起始位置为第m+r个字节,且sql语句的长度为w的情况下,可以直接从所述待解析oracle流量数据中提取第m+r个字节data[m+r-1]至第m+r+w-1个字节data[m+r+w-1]间的内容,得到所述待解析oracle流量数据中的sql语句内容。
[0328]
这样,依据所确定的sql语句起始位置和长度信息,可从所述待解析oracle流量数据中快速准确地提取出sql语句内容。
[0329]
进一步的,所述方法还包括:
[0330]
若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
[0331]
在依据所述sql语句提取特征值对所述待解析oracle流量数据进行sql语句提取
的过程中,可能会存在提取失败的情况下,例如,在获取到的sql语句长度标识位数不为第五目标值,如不为1或2的情况下,可以确定通过该方式提取失败,或者,在data[m+off_sql_min]至data[m+off_sql_max]间或data[m+off_5e+off_sql_min]至data[m+off_5e+off_sql_max]间未检索到sql语句开始标识符的情况下,也可以确定通过该方式提取失败,还或者,在判定第m+r个字节不为sql语句的起始位置的情况下,也确定通过该方式提取失败。在确认提取失败的情况下,可以输出提取失败提示,以提示用户对该条oracle流量数据未能解析成功。
[0332]
这样,通过在这几种情况下,确认提取失败,可以避免对所述待解析oracle流量数据的解析流程陷入死循环。
[0333]
可选的,所述确认sql语句提取失败之后,所述方法还包括:
[0334]
从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
[0335]
若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的最大值,o为大于o的整数;
[0336]
若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
[0337]
若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
[0338]
从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
[0339]
若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
[0340]
该实施方式中,在确认提取失败的情况下,可以转入另一种sql提取流程,以保证对每条待解析oracle流量数据均能成功提取出sql语句。
[0341]
具体地,可以预先定义检索偏移范围,假设为o~o,o为最小检索偏移值,o为最大检索偏移值,o的值不大于oracle流量数据的总长度减去第一预设值m的差值,其中该o值若太大,会导致检索范围增大,影响检索效率,若太小,可能会存在漏报,例如可定义为400左右,o的值可小于或等于对oracle抽样流量数据进行解析时统计出的最小sql语句起始位相对偏移值a1,其中该值若太小,会导致检索范围增大,影响检索效率,若太大,可能会存在漏报,例如可定义为a
1-10。
[0342]
然后,可依据所述预先定义的检索偏移范围,将所述偏移量off赋值为m+o,从所述待解析oracle流量数据中的第m+o+1个字节data[m+o]开始检索连续的预设字符如字母,具体可以是检索连续多个字节值对应的ascii码为预设字符的字节,即可以先检索字节data[m+o]和data[m+o]之后的l个(如2个)字节是否为预设字符(此时s=0),若是,则可以确定
data[m+o]可能为sql语句的起始位置;若检索到data[m+o]或data[m+o]之后的l个字节不是预设字符,则可以将偏移量的值加1(即s=0+1),继续检索下一个字节及其之后的l个字节是否为预设字符,直至检索到连续l+1个字节均为预设字符为止。
[0343]
需说明的是,在第m-1个字节data[m-2]和第m个字节data[m-1]的组合值为第二目标值的情况下,说明存在子功能偏移,此时可以从data[m]开始检索连续两个字节的组合值为第一目标值的字节,假设检索到data[m+i]的值为0x03,且data[m+i+1]的值为0x5e,则可以将偏移量更新为m+i+2+o(即用m+i+2代替m),以从所述待解析oracle流量数据中的字节data[m+i+2+o]开始检索连续的预设字符,具体地检索方式与前述类似,再此不作赘述。
[0344]
假设检索到字节data[m+o+s]及data[m+o+s]之后的l个字节均为预设字符,则可以进一步判断data[m+o+s]是否为sql语句的起始位置,具体地判断方式可参见前述实施方式中介绍的对oracle抽样流量数据进行解析时所使用的sql语句起始位置判断方式,在此不作赘述。
[0345]
在判定字节data[m+o+s]为sql语句的起始位置的情况下,可以记录data[m+o+s]为所述待解析oracle流量数据中的sql语句的起始位置,并可以从所述待解析oracle流量数据中的data[m+o+s]开始检索sql语句结束标识符,如检索值为0x00或0x01的字节,其中,每检索一个字节,将偏移量的值加1。其中,需说明的是,在判定字节data[m+o+s]不为sql语句的起始位置的情况下,可以按照前述实施方式中介绍的对oracle抽样流量数据进行解析时判断不为sql语句起始位置的情况下所采取的处理方式,将偏移量的值更新为增加到间隔符的长度后,继续检索可能为sql语句起始位置的字节,直至检索到sql语句的起始位置为止,具体实施方式可参见前述介绍,在此不作具体详述。
[0346]
若检索到所述待解析oracle流量数据中的第t个字节为sql语句结束标识符,则可以从所述待解析oracle流量数据中提取sql语句起始位,即第m+o+1+s个字节data[m+o+s],至sql语句结束位,即第t-1个字节data[t-2]之间的内容为sql语句内容。
[0347]
这样,通过该实施方式,可以保证在依据所述sql语句提取特征值对所述待解析oracle流量数据提取sql语句失败的情况下,还能够通过检索sql语句的方式来提取出所述待解析oracle流量数据中的sql语句内容,通过这两种提取方式的互补结合,可保证对不同场景中的oracle流量数据,均能够成功提取出sql语句。
[0348]
下面结合图4、图5和图6,对前述实施方式中介绍的对待解析oracle流量数据进行sql语句提取的流程进行举例说明:
[0349]
其中图5所示的依据sql语句提取特征值提取sql语句的流程如下:
[0350]
步骤51、将偏移量off赋值为12。
[0351]
步骤52、获取待解析oracle流量数据中的tns协议内容的功能及子功能值func,即为data[10]和data[11]字节的组合值。
[0352]
步骤53、判断func是否为0x035e,若是则进入步骤56,否则进入步骤54。
[0353]
步骤54、判断func是否为0x1169,若是则进入步骤55。
[0354]
步骤55、将off赋值更新为off+off_5e,其中,off_5e为sql语句提取特征值中的子功能偏移值常量。
[0355]
步骤56、获取sql语句长度标识符的位数,即获取data[off+off_len-1]的值,并判断该位数值是否为1或2,若是,则进入步骤57,否则进入步骤512。其中,off_len为sql语句
提取特征值中的sql语句长度标识位的相对偏移值常量。
[0356]
步骤57、依据sql语句长度位数值,获取sql语句的长度sqllen。具体的,如果位数值为1位,则sqllen=data[off+off_len];若位数值为2位,则sqllen=data[off+off_len]
×
256+data[off+off_len+1]。
[0357]
步骤58、从data[off+off_sql_min]开始检索sql语句开始标识符,直到data[off+off_sql_max],其中,off_sql_min和off_sql_max分别为sql语句提取特征值中的sql语句起始位的相对偏移值范围中的最小值和最大值。
[0358]
步骤59、判断是否检索到sql语句开始标识符,其中,若是,则进入步骤510,否则进入步骤512。
[0359]
步骤510、假设data[off+i]为检索到的sql语句开始标识符之后的第一个字节,将偏移量off更新为off+i,并转入如图4所示的sql关键词判断模块的流程,判断该偏移量是否为sql语句的起始位置,其中,若判断结果为真,则进入步骤511,若判断结果为假,则进入步骤512。
[0360]
步骤511、将当前偏移量off记为sql语句起始偏移值sqlstart,并提取data[sqlstart]至data[sqlstart+sqllen]区间的内容为sql语句。
[0361]
步骤512、确认提取失败,转入如图6所示的sql语句检索提取流程。
[0362]
其中图6所示的sql语句检索提取流程如下:
[0363]
步骤61、将偏移量off赋值为12。
[0364]
步骤62、定义最大检索相对偏移o和最小检索相对偏移o。
[0365]
步骤63、获取待解析oracle流量数据中的tns协议内容的功能及子功能值func,即为data[10]和data[11]字节的组合值。
[0366]
步骤64、判断func是否为0x035e,若是则进入步骤68,否则进入步骤65。
[0367]
步骤65、判断func是否为0x1169,若是则进入步骤67。
[0368]
步骤66、从data[off]开始,在一定范围内(例如可以是12个字节),检索后续内容中连续两个字节为0x03和0x5e的位置。
[0369]
步骤67、假设检索到data[off+i]值为0x03且data[off+i+1]值为0x5e,则将偏移量off值更新为off+i+2。若未检索到,则忽略该条数据,即放弃对该条数据的解析。
[0370]
步骤68、将偏移量off值更新为off+o。
[0371]
步骤69、从data[off]开始检索字母(即检索该字节的值转换为acsii码后是否为a~z或a~z),直到data[off+o]。
[0372]
步骤610、若检索到data[off+j]为字母,且后续两个字节也是字母,则进入步骤612,否则进入步骤611。
[0373]
步骤611、将off赋值为off+j+1,并重复上一步骤69。
[0374]
步骤612、将偏移量off更新为off+j,并转入如图4所示的sql关键词判断模块的流程,判断该偏移量是否为sql语句的起始位置。
[0375]
步骤613、若判断结果为假,则将off更新为off+间隔符偏移量(若图4流程中未检索到间隔符,则将off更新为off+g),并重新回到步骤69。
[0376]
步骤614、若判断结果为真,则将当前偏移量off记为sql语句起始偏移值sqlstart。
[0377]
步骤615、从data[off]开始检索sql语句结束符(如0x00或0x01),直到data结尾,每检索一个字节,off赋值更新为off+1。
[0378]
步骤616、获取data[sqlstart]到data[off]区间的内容为sql语句。
[0379]
本发明实施例中的数据解析方法,获取待解析目标数据库流量数据;依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。这样,通过预先获取sql语句提取特征值,从而在对目标数据库流量数据进行解析时,可以依据所述sql语句提取特征值中的子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围,确定该目标数据库流量数据中的sql语句的长度和起始位置,进而可基于该长度和起始位置信息,从该目标数据库流量数据中提取出sql语句,该方式可适用于对不同场景中的目标数据库流量数据进行sql语句解析。
[0380]
另外,本发明实施例中的方法,不仅可对于多种场景下产生的oracle流量均可解析,而且不需要关联数据库连接connect过程的数据包来获取版本信息,对于单个的oracle流量数据包也可解析。
[0381]
本发明实施例还提供了一种数据解析装置。参见图7,图7是本发明实施例提供的一种数据解析装置的结构图。
[0382]
该数据解析装置包括sql语句提取特征值计算模块710和sql语句解析模块720两部分。其中,sql语句提取特征值计算模块710在随着流量解析功能部署到一个系统或网络中时,需要首先运行该sql语句提取特征值计算模块710来生成该系统或网络的tns协议解析的sql语句提取特征值组合,该sql语句提取特征值计算模块710包括关键字段提取子模块711、特征值计算子模块712和特征值存储子模块713。sql语句解析模块720是在计算完成sql语句提取特征值后,对所有oracle流量数据中的sql语句进行解析,其包括sql语句提取子模块721和sql语句检索匹配子模块722。
[0383]
关键字段提取子模块711的功能主要是对于输入的oracle流量数据,解析tns协议,提取出其中的功能及子功能值、功能及子功能值为0x1169时到0x035e的子功能偏移值、sql语句起始位的相对偏移值、sql语句的长度、sql语句长度标识位的相对偏移值等关键字段,并进行记录。
[0384]
特征值计算子模块712的功能主要是对关键字段提取子模块711中提取得到的关键字段进行统计和计算,生成该系统或网络的tns协议解析的sql语句提取特征值组合,包括子功能偏移值常量off_5e,sql语句提取偏移值范围(即sql语句起始位的相对偏移值范围)[off_sql_min,off_sql_max],sql语句长度标识位的相对偏移值常量off_len。
[0385]
特征值存储子模块712的功能主要是对特征值计算子模块712生成的sql语句提取特征值组合,结合该系统或网络标识进行存储,方便后续使用。
[0386]
sql语句提取子模块721的功能主要是对满足偏移规则的oracle流量数据直接提取sql语句,主要步骤是结合子功能偏移值常量off_5e和sql语句长度标识位的相对偏移值常量off_len,获取sql语句长度,结合sql语句提取偏移值范围,在小范围内查找满足规则
的sql语句起始偏移,并结合获取到的sql语句长度,提取得到sql语句内容。
[0387]
sql语句检索匹配子模块722的功能主要是对不满足偏移规则的oracle流量数据通过字符检索匹配得到sql语句,主要步骤是直接检索和匹配sql语句起始偏移,然后检索sql语句结束标识,并结合起始偏移,提取得到sql语句内容。
[0388]
本发明实施例还提供了另一种数据解析装置。参见图8,图8是本发明实施例提供的数据解析装置的结构图。由于该数据解析装置解决问题的原理与本发明实施例中数据解析方法相似,因此该数据解析装置的实施可以参见方法的实施,重复之处不再赘述。
[0389]
如图8所示,数据解析装置800包括:
[0390]
第一获取模块801,用于获取待解析目标数据库流量数据;
[0391]
第一确定模块802,用于依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;
[0392]
提取模块803,用于依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
[0393]
可选的,数据解析装置800还包括:
[0394]
第二获取模块,用于获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
[0395]
第二确定模块,用于确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
[0396]
第三确定模块,用于基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
[0397]
第四确定模块,用于基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
[0398]
第五确定模块,用于基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
[0399]
第六确定模块,用于将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
[0400]
可选的,所述第二确定模块包括:
[0401]
第一确定子模块,用于分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
[0402]
第二确定子模块,用于分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
[0403]
第三确定子模块,用于分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
[0404]
第四确定子模块,用于依据每条目标数据库抽样流量数据中的sql语句长度,确定
每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0405]
可选的,所述第二确定子模块包括:
[0406]
赋值单元,用于将偏移量赋值为第一预设值m,m为大于1的整数;
[0407]
获取单元,用于获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
[0408]
第一检索单元,用于若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
[0409]
第一执行单元,用于若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
[0410]
判断单元,用于若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
[0411]
第一确定单元,用于若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
[0412]
可选的,所述判断单元包括:
[0413]
检索子单元,用于从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
[0414]
执行子单元,用于若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
[0415]
处理子单元,用于若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
[0416]
判断子单元,用于判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
[0417]
可选的,所述第二确定子模块还包括:
[0418]
第二执行单元,用于若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0419]
可选的,所述第一确定子模块包括:
[0420]
第二检索单元,用于若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
[0421]
第三执行单元,用于若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
[0422]
第二确定单元,用于若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据库抽样流量数据的子功能偏移值为i+2。
[0423]
可选的,所述第一确定子模块还包括:
[0424]
第四执行单元,用于将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0425]
可选的,所述第三确定子模块包括:
[0426]
第三检索单元,用于若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
[0427]
第五执行单元,用于若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
[0428]
第三确定单元,用于若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
[0429]
可选的,所述第四确定子模块包括:
[0430]
第四检索单元,用于在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
[0431]
第五检索单元,用于若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
[0432]
第四确定单元,用于依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0433]
可选的,所述第三确定模块用于对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
[0434]
可选的,所述第四确定模块包括:
[0435]
第五确定子模块,用于对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
[0436]
排序子模块,用于将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
[0437]
第六确定子模块,用于依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相
对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积;
[0438]
第七确定子模块,用于依据所述最小相对偏移值子集合中的最大相对偏移值和最小相对偏移值,确定sql语句起始位的相对偏移值范围。
[0439]
可选的,所述第五确定模块用于对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
[0440]
可选的,第一确定模块802包括:
[0441]
赋值子模块,用于将偏移量赋值为第一预设值m,m为大于1的整数;
[0442]
第一获取子模块,用于获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
[0443]
第二获取子模块,用于若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
[0444]
第三获取子模块,用于依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
[0445]
第一检索子模块,用于依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
[0446]
第一判断子模块,用于若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
[0447]
第八确定子模块,用于若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
[0448]
可选的,第一确定模块802还包括:
[0449]
第一执行子模块,用于若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
[0450]
可选的,提取模块803用于从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
[0451]
可选的,数据解析装置800还包括:
[0452]
处理模块,用于若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
[0453]
可选的,所述处理模块包括:
[0454]
第二检索子模块,用于从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
[0455]
第二执行子模块,用于若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及
第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的最大值,o为大于o的整数;
[0456]
第二判断子模块,用于若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
[0457]
记录子模块,用于若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
[0458]
第三检索子模块,用于从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
[0459]
提取子模块,用于若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
[0460]
本发明实施例提供的数据解析装置,可以执行上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
[0461]
本发明实施例的数据解析装置800,通过预先获取sql语句提取特征值,从而在对目标数据库流量数据进行解析时,可以依据所述sql语句提取特征值中的子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围,确定该目标数据库流量数据中的sql语句的长度和起始位置,进而可基于该长度和起始位置信息,从该目标数据库流量数据中提取出sql语句,该方式可适用于对不同场景中的目标数据库流量数据进行sql语句解析。
[0462]
本发明实施例还提供了一种数据解析装置。由于该数据解析装置解决问题的原理与本发明实施例中数据解析方法相似,因此该数据解析装置的实施可以参见方法的实施,重复之处不再赘述。如图9所示,本发明实施例的数据解析装置,包括:处理器900,用于读取存储器910中的程序,执行下列过程:
[0463]
获取待解析目标数据库流量数据;
[0464]
依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;
[0465]
依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
[0466]
其中,在图9中,总线架构可以包括任意数量的互联的总线和桥,具体由处理器900代表的一个或多个处理器和存储器910代表的存储器的各种电路链接在一起。总线架构还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口提供接口。处理器900负责管理总线架构和通常的处理,存储器910可以存储处理器900在执行操作时所使用的数据。
[0467]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0468]
获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
[0469]
确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
[0470]
基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
[0471]
基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
[0472]
基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
[0473]
将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
[0474]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0475]
分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
[0476]
分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
[0477]
分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
[0478]
依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0479]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0480]
将偏移量赋值为第一预设值m,m为大于1的整数;
[0481]
获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
[0482]
若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
[0483]
若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
[0484]
若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
[0485]
若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
[0486]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0487]
从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
[0488]
若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
[0489]
若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
[0490]
判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
[0491]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0492]
若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0493]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0494]
若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
[0495]
若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
[0496]
若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据库抽样流量数据的子功能偏移值为i+2。
[0497]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0498]
将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0499]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0500]
若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
[0501]
若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
[0502]
若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
[0503]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0504]
在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+
j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
[0505]
若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
[0506]
依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0507]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0508]
对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
[0509]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0510]
对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
[0511]
将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
[0512]
依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积;
[0513]
依据所述最小相对偏移值子集合中的最大相对偏移值和最小相对偏移值,确定sql语句起始位的相对偏移值范围。
[0514]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0515]
对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
[0516]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0517]
将偏移量赋值为第一预设值m,m为大于1的整数;
[0518]
获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
[0519]
若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
[0520]
依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
[0521]
依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
[0522]
若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
[0523]
若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
[0524]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0525]
若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
[0526]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0527]
从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
[0528]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0529]
若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
[0530]
处理器900还用于读取存储器910中的程序,执行如下步骤:
[0531]
从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
[0532]
若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的最大值,o为大于o的整数;
[0533]
若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
[0534]
若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
[0535]
从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
[0536]
若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
[0537]
本发明实施例提供的数据解析装置,可以执行上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
[0538]
此外,本发明实施例的计算机可读存储介质,用于存储计算机程序,所述计算机程序可被处理器执行实现以下步骤:
[0539]
获取待解析目标数据库流量数据;
[0540]
依据预先获取的结构化查询语言sql语句提取特征值,确定所述待解析目标数据库流量数据中的sql语句的长度和起始位置,其中,所述sql语句提取特征值包括子功能偏
移值常量、sql语句长度标识位的相对偏移值常量和sql语句起始位的相对偏移值范围;
[0541]
依据所述sql语句的长度和起始位置,从所述待解析目标数据库流量数据中提取sql语句,得到所述待解析目标数据库流量数据中的sql语句内容。
[0542]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0543]
获取n条目标数据库抽样流量数据,n为大于1的整数,所述n条目标数据库抽样流量数据包括不同场景中的目标数据库流量数据;
[0544]
确定每条目标数据库抽样流量数据的子功能偏移值、sql语句起始位的相对偏移值和sql语句长度标识位的相对偏移值;
[0545]
基于每条目标数据库抽样流量数据的子功能偏移值,确定子功能偏移值常量;
[0546]
基于每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值,确定sql语句起始位的相对偏移值范围;
[0547]
基于每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值,确定sql语句长度标识位的相对偏移值常量;
[0548]
将所述子功能偏移值常量、所述sql语句起始位的相对偏移值范围和所述sql语句长度标识位的相对偏移值常量确定为所述sql语句提取特征值。
[0549]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0550]
分别检索每条目标数据库抽样流量数据中的目标子功能值位置,并依据每条目标数据库抽样流量数据中的目标子功能值位置,确定每条目标数据库抽样流量数据的子功能偏移值;
[0551]
分别检索每条目标数据库抽样流量数据中的sql语句起始位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置,确定每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值;
[0552]
分别检索每条目标数据库抽样流量数据中的sql语句结束位置,并依据每条目标数据库抽样流量数据中的sql语句起始位置和sql语句结束位置,确定每条目标数据库抽样流量数据中的sql语句长度;
[0553]
依据每条目标数据库抽样流量数据中的sql语句长度,确定每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0554]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0555]
将偏移量赋值为第一预设值m,m为大于1的整数;
[0556]
获取第一目标数据库抽样流量数据中的第m-1个字节和第m个字节的第一组合值,其中,所述第一目标数据库抽样流量数据为所述n条目标数据库抽样流量数据中的任一条目标数据库抽样流量数据;
[0557]
若所述第一组合值为第一目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符,l为正整数,j的初始值为0;
[0558]
若检索到第m+1+j个字节不为预设字符,或者第m+1+j个字节之后的l个字节不为预设字符,则将j的值加1,并重复上述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符;
[0559]
若检索到第m+1+j个字节及第m+1+j个字节之后的l个字节为预设字符,则判断第m+1+j个字节是否为sql语句的起始位置;
[0560]
若确定第m+1+j个字节为sql语句的起始位置,则确定所述第一目标数据库抽样流量数据中的sql语句起始位置为第m+1+j个字节,并确定所述第一目标数据库抽样流量数据中的sql语句起始位的相对偏移值为j。
[0561]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0562]
从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+g个字节是否为间隔符,g的初始值为0;
[0563]
若检索到第m+1+j+g个字节不为间隔符,则将g的值加1,并重复上述检索第m+1+j+g个字节是否为间隔符的步骤,直至检索到第m+1+j+g个字节为间隔符,或者g等于第二预设值;
[0564]
若检索到第m+1+j+g个字节为间隔符,则将第m+1+j个字节至第m+j+g个字节的值相加,得到总值;
[0565]
判断所述总值是否属于sql关键词的值集合,其中,若所述总值属于sql关键词的值集合,则确定第m+1+j个字节为sql语句的起始位置。
[0566]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0567]
若所述总值不属于sql关键词的值集合,或者未检索到间隔符,则确定第m+1+j个字节不为sql语句的起始位置,并将j的值更新为j+g,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0568]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0569]
若所述第一组合值为第二目标值,则从所述第一目标数据库抽样流量数据中的第m+1个字节开始,检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值,i的初始值为0;
[0570]
若所述第二组合值不为所述第一目标值,则将i的值加1,并重复上述检索第m+1+i个字节和第m+i+2个字节的第二组合值是否为所述第一目标值的步骤,直至检索到所述第二组合值为所述第一目标值;
[0571]
若所述第二组合值为所述第一目标值,则确定所述第一目标数据库抽样流量数据中的目标子功能值位置为第m+1+i个字节,并确定所述第一目标数据库抽样流量数据的子功能偏移值为i+2。
[0572]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0573]
将所述m的值更新为m+i+2,并执行所述检索第m+1+j个字节及第m+1+j个字节之后的l个字节是否为预设字符的步骤。
[0574]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0575]
若确定第m+1+j个字节为sql语句的起始位置,则从所述第一目标数据库抽样流量数据中的第m+1+j个字节开始,检索第m+1+j+k个字节是否为sql语句的结束标识符,k的初始值为0;
[0576]
若检索到第m+1+j+k个字节不为sql语句的结束标识符,则将k的值加1,并重复上述检索第m+1+j+k个字节是否为sql语句的结束标识符,直至检索到第m+1+j+k个字节为sql语句的结束标识符;
[0577]
若检索到第m+1+j+k个字节为sql语句的结束标识符,则确定所述第一目标数据库抽样流量数据中的sql语句结束位置为第m+1+j+k个字节,并确定所述第一目标数据库抽样流量数据中的sql语句长度为k。
[0578]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0579]
在确定所述第一目标数据库抽样流量数据中的sql语句长度为k的情况下,若所述k的值小于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索值为k的目标字节,其中,q等于所述第一预设值与所述第一目标数据库抽样流量数据的子功能偏移值之和;
[0580]
若所述k的值大于或等于第三预设值,则在所述第一目标数据库抽样流量数据中的第q+1个字节至第q+1+j个字节之间检索连续两个字节值分别为第三目标值和第四目标值的两个字节,并将所述两个字节中的第一个字节确定为目标字节,其中,所述第三目标值为k除以所述第三预设值的商,所述第四目标值为k除以所述第三预设值的余数;
[0581]
依据所述目标字节所在的位置,确定所述第一目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值。
[0582]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0583]
对所述每条目标数据库抽样流量数据的子功能偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据的子功能偏移值中计数最高的子功能偏移值确定为子功能偏移值常量。
[0584]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0585]
对所述每条目标数据库抽样流量数据中的sql语句起始位的相对偏移值进行去重计数统计,得到p个不同的sql语句起始位的相对偏移值,并确定每个sql语句起始位的相对偏移值对应的计数,p为小于或等于n的正整数;
[0586]
将所述p个不同的sql语句起始位的相对偏移值按值的大小进行排序,得到排序后的sql语句起始位的相对偏移值集合;
[0587]
依据预先设定的提取比例阈值,确定所述相对偏移值集合中计数之和大于目标计数值的最小相对偏移值子集合,其中,所述目标计数值等于所述相对偏移值集合中所有相对偏移值的计数之和与所述提取比例阈值的乘积;
[0588]
依据所述最小相对偏移值子集合中的最大相对偏移值和最小相对偏移值,确定sql语句起始位的相对偏移值范围。
[0589]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0590]
对所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值进行去重计数统计,将所述每条目标数据库抽样流量数据中的sql语句长度标识位的相对偏移值中计数最高的sql语句长度标识位的相对偏移值,确定为sql语句长度标识位的相对偏移值常量。
[0591]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0592]
将偏移量赋值为第一预设值m,m为大于1的整数;
[0593]
获取所述待解析目标数据库流量数据中的第m-1个字节和第m个字节的第三组合值;
[0594]
若所述第三组合值为第一目标值,则依据所述sql语句长度标识位的相对偏移值
常量off_len,获取所述待解析目标数据库流量数据中的第m+off_len个字节的值,得到sql语句长度标识位数;
[0595]
依据所述sql语句长度标识位数和所述sql语句长度标识位的相对偏移值常量,获取所述待解析目标数据库流量数据中的sql语句的长度;
[0596]
依据所述sql语句起始位的相对偏移值范围,从所述待解析目标数据库流量数据中检索sql语句开始标识符;
[0597]
若检索到所述待解析目标数据库流量数据中的第m+r-1个字节为sql语句开始标识符,则判断第m+r个字节是否为sql语句的起始位置,r为正整数;
[0598]
若确定第m+r个字节为sql语句的起始位置,则确定所述待解析目标数据库流量数据中的sql语句的起始位置为第m+r个字节。
[0599]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0600]
若所述第三组合值为第二目标值,则依据所述子功能偏移值常量off_5e,将所述m的值更新为m+off_5e,并执行所述获取所述待解析目标数据库流量数据中的第m+off_len个字节的值的步骤。
[0601]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0602]
从所述待解析目标数据库流量数据中提取第m+r个字节至第m+r+w-1个字节的内容为sql语句内容,其中,w为所述待解析目标数据库流量数据中的sql语句的长度。
[0603]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0604]
若所述sql语句长度标识位数不为第五目标值,或者,未检索到sql语句开始标识符,或者,确定第m+r个字节不为sql语句的起始位置,则确认sql语句提取失败。
[0605]
可选的,所述计算机程序还可被处理器执行实现以下步骤:
[0606]
从所述待解析目标数据库流量数据中的第m+o+1个字节开始,检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符,o为预设检索偏移范围的最小值,o为正整数,l为正整数,s的初始值为0;
[0607]
若检索到第m+o+1+s个字节不是预设字符,或者第m+o+1+s个字节之后的l个字节不是预设字符,则将s的值加1,并重复上述检索第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节是否为预设字符的步骤,直至检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,或者,o+s=o,o为所述预设检索偏移范围的最大值,o为大于o的整数;
[0608]
若检索到第m+o+1+s个字节及第m+o+1+s个字节之后的l个字节为预设字符,则判断第m+o+1+s个字节是否为sql语句的起始位置;
[0609]
若确定第m+o+1+s个字节为sql语句的起始位置,则记录第m+o+1+s个字节为所述待解析目标数据库流量数据中的sql语句的起始位置;
[0610]
从所述待解析目标数据库流量数据中的第m+o+1+s个字节开始检索sql语句结束标识符;
[0611]
若检索到所述待解析目标数据库流量数据中的第t个字节为sql语句结束标识符,则从所述待解析目标数据库流量数据中提取第m+o+1+s个字节至第t-1个字节的内容为sql语句内容,其中,t为大于m+o+1+s的整数。
[0612]
在本技术所提供的几个实施例中,应该理解到,所揭露方法和装置,可以通过其它
的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0613]
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0614]
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述收发方法的部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,简称rom)、随机存取存储器(random access memory,简称ram)、磁碟或者光盘等各种可以存储程序代码的介质。
[0615]
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1