一种基于日志解析的DDL分析方法及装置与流程

文档序号:24552043发布日期:2021-04-06 12:03阅读:132来源:国知局
一种基于日志解析的DDL分析方法及装置与流程

本发明涉及计算机数据库技术领域,特别是涉及一种oracle数据库基于日志解析的ddl(datadefinitionlanguage,数据定义语言)分析方法及装置。



背景技术:

oracle是一种非常流行的关系数据库,应用广泛,非常受市场欢迎。针对oracle的各种研究也很活跃,其中基于在线日志(redolog)解析的数据库备份、保护、双活是一个重要方向。基于在线日志(redolog)的数据库备份有各种优点,例如对业务影响小,对数据库依赖低,性能影响小等。为了完整的实现数据库保护,从redo中分析ddl是很重要的一环。但由于ddl在日志中的记录方式较为复杂,解析较难且易错,因此目前大多产品不支持ddl分析,或者通过在库中创建触发器(修改了库)、定期查询系统表的方式获取,一般情况下,创建触发器、修改源库存在无法确定的影响,尤其是创建触发器,不但导致数据库性能下降,还可能导致数据错误,而定期查询则是一种效率低下、占用大量数据库io的方案。



技术实现要素:

为克服上述现有技术存在的不足,本发明之目的在于提供一种基于日志解析的ddl分析方法及装置,以完全基于日志redo分析从而实现ddl解析的目的。

为达上述目的,本发明提出一种基于日志解析的ddl分析方法,包括如下步骤:

步骤s1,连接数据库,从所述数据库中导出所需系统表的基本信息;

步骤s2,读取重做日志文件redo,从读取的redo文件中分析出dll事务及dml详细信息,对比匹配分析dll事务中的详细信息与步骤s1中导出的所需系统表的基本信息,若出现匹配,则进入步骤s3,否则跳过当前事务,继续读取分析下一个事务;

步骤s3,解析步骤s2得到的dll事务,统计本dll事务中对各系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型;

步骤s4,返回步骤s2,直至所述重做日志文件redo读取完毕。

优选地,所需系统表包括sys.obj$表、sys.tab$表、sys.col$表、sys.part$表。

优选地,于步骤s2中,对比所述dll事务中dml的对象号与步骤s1中导出的系统表对象号,若所述dll事务中dml的对象号中出现了步骤s1中导出的系统表对象号,则进入步骤s3,若没有则跳过所述的dll事务,继续读取redo文件分析并对比下一个事务。

优选地,于步骤s2中,若读取的是在线日志并已读到最新redo末尾,则等待预设时长后重新尝试读取,如果不是末尾则继续分析,从读到的重做日志文件redo数据中分析出dll事务及dml详细信息。

优选地,于步骤s3之前,还包括如下步骤:

步骤s0,运行解析过程读取到在线日志最新位置,保证当前库中没有其他事务,执行ddl事务,记录下本事务的日志中系统表的dml操作类型及数量,并选取有代表性的系统表及操作类型作为判断此ddl事务的特征,多次运行上述过程从而得到多个dll事务的特征。

优选地,于步骤s0中,进一步分析dml操作的具体数据内容,以此作为判断dll事务的特征。

为达到上述目的,本发明还提供一种基于日志解析的ddl分析装置,包括:

系统表基本信息获取单元,用于连接数据库,从所述数据库中导出所需系统表的基本信息;

重做日志文件读取对比单元,用于读取重做日志文件redo,从读取的redo数据中分析出dll事务及dml详细信息,对比匹配分析dll事务中的详细信息与所述系统表基本信息获取单元中导出的所需系统表的基本信息,若出现匹配,则进入dll事务解析单元,否则跳过当前事务,继续读取分析下一个事务;

dll事务解析单元,用于解析所述重做日志文件读取对比单元得到的dll事务,统计本dll事务中对各个系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型。

优选地,所述重做日志文件读取对比单元对比所述dll事务中dml的对象号与系统表基本信息获取单元中导出的系统表对象号,若所述dll事务中dml的对象号中出现了系统表基本信息获取单元中导出的系统表对象号,则进入所述dll事务解析单元,若没有则跳过所述的dll事务,继续读取redo文件分析并对比下一个事务。

优选地,所述基于日志解析的ddl分析装置还包括:

学习单元,用于运行解析过程读取到在线日志最新位置,保证当前库中没有其他事务,执行ddl操作,记录下本事务的日志中系统表的dml操作类型及数量,并选取有代表性的系统表及操作类型作为判断此ddl事务的特征,多次运行上述过程从而得到多个dll事务的特征。

优选地,所述学习单元还分析dml操作的具体数据内容,以此作为判断dll事务的特征。

与现有技术相比,本发明一种基于日志解析的ddl分析方法及装置通过先从数据库中导出所需系统表的基本信息,然后读取重做日志文件redo,从读取的redo数据中分析出dll事务及dml详细信息,对比匹配分析dll事务中的详细信息与步骤s1中导出的所需系统表的基本信息,若出现匹配,则解析得到的dll事务,统计本dll事务中对各个系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型,从而达到通过解析日志实现ddl事务分析的目的。

附图说明

图1为本发明一种基于日志解析的ddl分析方法的步骤流程图;

图2为本发明一种基于日志解析的ddl分析装置的系统架构图;

图3为本发明实施例之基于日志解析的ddl分析的流程图。

具体实施方式

以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。

在oracle数据库中,oracle的数据库对象的详细信息以数据表的形式存储在库中,例如sys.obj$表、sys.tab$表、sys.col$表、sys.ind$表等,其中sys.obj$表是oracle数据库字典表中的对象基础表,sys.obj$表中存储了对象的对象号、名称、所属用户号、类型、创建时间、修改时间等,sys.tab$表存储了所有表的对象号、部分属性值,sys.col$表用于保存表列的定义信息,其存储了所有表的对象号、列id、列名称、列长度、列数据类型等,sys.ind$表存储了所有索引的对象号、所属表、创建修改时间等。所有系统表(如sys.obj$、sys.tab$等,系统表除包含上述列举的几个表外还有大量其他系统表)也是数据表,其基本信息如对象号、名称、列信息、索引信息等,也存储在系统表中,即系统表的结构信息也由系统表维护,同时也维护了用户数据表的结构信息,如sys.tab$是一个系统表,其对象号可以在sys.obj$中查询得到,其各个列的信息则可以在sys.col$中查询得到。

一个ddl操作实际是对一个或多个系统表的一系列dml(datamanipulationlanguage,数据操纵语言,包含irp、drp、urp三种操作,分别对应insert、delete、update操作,并记录了所操作的对象号),这些dml在日志中记录为一个事务(transaction)。每个事务都有一个事务号,一个事务的一系列dml都有这个事务号,因此可以根据事务号将一个事务的dml查找出来并组装成一个完整的事务。例如一个建表操作,sys.obj$产生一条irp(insert即插入操作),sys.tab$产生一条irp,sys.col$产生多条irp,如果同时创建了索引则sys.ind$产生一条或多条irp。其他数据库对象的ddl操作类似,会在不同的系统表上产生一个或多个dml操作。从这些dml操作中可以反向推断出ddl操作。

图1为本发明一种基于日志解析的ddl分析方法的步骤流程图。如图1所示,本发明一种基于日志解析的ddl分析方法,包括如下步骤:

步骤s1,连接数据库,从所述数据库中导出所需系统表的基本信息。

在本发明具体实施例中,所述数据库为oracle数据库,即从oracle数据库导出所需系统表的基本信息,所需系统表例如sys.obj$、sys.tab$、sys.col$、sys.part$等,导出这些表的基本信息,如对象号(从sys.obj$表中导出)、列信息(从sys.col$表中导出)等。在本发明具体实施例中,导出使用select语句,按照名称查询,形如select*fromsys.obj$wherename=‘obj$’,select*fromsys.col$whereobj#=(selectobj#fromsys.obj$wherename=‘obj$’)。

步骤s2,读取重做日志文件redo,从读取的redo数据中分析出事务及其dml详细信息,对比匹配分析事务中的详细信息与步骤s1中导出的所需系统表的基本信息,若出现匹配,则进入步骤s3,否则跳过当前事务,继续步骤s2继续下一个事务。由于redo文件中的数据以特定格式的二进制存储,其中包含了大量的标签,每个事务有相同的事务id,按照事务id可以将同一个事务的日志解析出来。

具体地,读取重做日志文件redo,如果读取的是在线日志并已经读到最新redo末尾,则等待一定时长后重新尝试读取,如果不是末尾则继续分析,从读到的重做日志文件redo数据中分析出事务及dml详细信息,所述详细信息包括对象号(obj#)、操作类型(drp、urp、irp)、列数据等,对比事务中dml的对象号与步骤s1中导出的系统表对象号,若事务中dml的对象号中出现了步骤s1中导出的系统表对象号,则进入步骤s3,若没有则跳过当前事务,继续本步骤,继续读取redo文件分析并对比下一个事务。

步骤s3,解析步骤s2得到的dll事务,统计本dll事务中对各个系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型,更进一步的,结合dml中的具体数据可以获取该ddl操作的具体内容,如建表操作所建表的名称、对象号、列信息、索引信息等全部信息,这些ddl信息可以用作数据库的保护、维护、检查等。

具体地,比如,若统计结果包含了sys.obj$一个irp、sys.tab$一个irp、sys.col$一个或多个irp,则推断本ddl事务为建表操作。这个反推的依据,需要预先根据反复实验获取,即通过执行特定的ddl操作,然后统计事务中所出现的各个系统表的各种dml操作数量,从而得到该特定ddl操作对应的各种dml操作数量。

因此,优选地,于步骤s3之前,还包括如下步骤:

步骤s0,运行日志读取,读取到在线日志最新位置,保证当前库中没有其他事务(因为库的所有操作都会记录在日志中,这样可以保证接下来读取到的事务就是要执行的ddl,防止混淆),执行ddl操作,读取事务日志,记录下本事务的日志中各个系统表的dml操作类型及数量。并选取可以区分各个ddl的系统表及操作类型作为判断此ddl事务的特征,例如建表与删表都会对sys.obj$、sys.tab$、sys.col$产生dml操作,不同的是建表产生的是irp,删表产生的是drp,因此可以选取这几个系统表的irp数量、drp数量作为判断这两个ddl的特征,且通过更多实验可以发现这个特征不会发生在其他ddl操作上(如创建视图、索引、分区等),因此是合理的。多次运行上述过程从而得到多个dll事务的特征。

优选地,由于某些ddl操作比较容易混淆,比如truncate与move操作,其系统表dml有较多重复,特征相似,此时还需更进一步地分析对比dml具体数据内容,例如解析出sys.tabpart$的urp操作的ts#列的值,如果ts#的新旧值不相等则是move操作,如果相等则是truncate操作。

步骤s4,返回步骤s2,直至所述重做日志文件redo读取完毕。

图2为本发明一种基于日志解析的ddl分析装置的系统架构图。如图2所示,本发明一种基于日志解析的ddl分析装置,包括:

系统表基本信息获取单元201,用于连接数据库,从所述数据库中导出所需系统表的基本信息。

在本发明具体实施例中,所述数据库为oracle数据库,即从oracle数据库导出所需系统表的基本信息,所需系统表如sys.obj$、sys.tab$、sys.col$、sys.part$等,导出这些表的基本信息,例如对象号(从sys.obj$表中导出)、列信息(从sys.col$表中导出)等。在本发明具体实施例中,导出使用select语句,按照名称查询,形如select*fromsys.obj$wherename=‘obj$’,select*fromsys.col$whereobj#=(selectobj#fromsys.obj$wherename=‘obj$’)。

重做日志文件读取对比单元202,用于读取重做日志文件redo,从读取的redo数据中分析出事务及dml详细信息,对比匹配分析事务中的详细信息与系统表基本信息获取单元201中导出的所需系统表的基本信息,若出现匹配,则进入dll事务解析单元203,否则跳过当前事务,继续下一个事务的读取对比分析。

具体地,重做日志文件读取对比单元202读取重做日志文件redo,如果读取的是在线日志并已经读到最新redo末尾,则等待一定时长后重新尝试读取,如果不是末尾则继续分析,从读到的重做日志文件redo数据中分析出事务及dml详细信息,所述详细信息包括对象号(obj#)、操作类型(drp、urp、irp)、列数据等,对比事务中dml的对象号与系统表基本信息获取单元201中导出的系统表对象号,若事务中dml的对象号中出现了系统表基本信息获取单元201中导出的系统表对象号,则进入dll事务解析单元203,若没有则跳过当前事务,继续读取redo文件分析并对比下一个事务。

dll事务解析单元203,解析重做日志文件读取对比单元202得到的dll事务,统计本dll事务中对各个系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型。

具体地,比如,若统计结果包含了sys.obj$一个irp、sys.tab$一个irp、sys.col$一个或多个irp,则推断本ddl事务为建表操作。这个反推的依据,需要预先根据反复实验获取,即通过执行特定的ddl操作,然后统计事务中所出现的各个系统表的各种dml操作数量,从而得到该特定ddl操作对应的各种dml操作数量。

优选地,本发明之基于日志解析的ddl分析装置,还包括:

学习单元,用于运行解析过程读取到在线日志最新位置,保证当前库中没有其他事务,执行ddl操作,记录下本事务的日志中系统表的dml操作类型及数量。并选取有代表性的系统表及操作类型作为判断此ddl事务的特征,多次运行上述过程从而得到多个dll事务的特征。

优选地,某些ddl操作比较容易混淆,比如truncate与move操作,其系统表dml有较多重复,特征相似,此时还需更进一步地分析dml具体数据内容,以此作为判断dll事务的特征。

实施例

如图3所示,在本实施例中,一种基于日志解析的ddl分析包括:

一、解析过程

001,连接数据库,从库中导出所需系统表的基本信息,所需系统表如sys.obj$、sys.tab$、sys.col$、sys.part$等,导出这些表的对象号(从sys.obj$中导出)、列信息(从sys.col$中导出)。导出使用select语句,按照名称查询,形如select*fromsys.obj$wherename=‘obj$’,select*fromsys.col$whereobj#=(selectobj#fromsys.obj$wherename=‘obj$’)。

002,读取重做日志文件redo,如果读取的是在线日志并已经读到最新redo末尾,则等待一定时长后重新尝试读取,如果不是末尾则继续分析。从读到的redo数据中分析出事务及dml详细信息,详细信息包括对象号(obj#)、操作类型(drp、urp、irp)、列数据。对比事务中dml的对象号与步骤001中导出的系统表对象号,如果出现了这些对象号,则进入下一步,如果没有则跳过这个事务,继续本步骤。

003,解析步骤002中得到的事务,统计本事务中对各个系统表的dml操作类型及数量。比如,如果统计结果包含了sys.obj$一个irp、sys.tab$一个irp、sys.col$一个或多个irp,则推断本ddl事务为建表操作。这个反推的依据,需要从反复实验中获取,即执行特定的ddl操作,然后观察事务中所出现的各个系统表的各种dml操作数量。

004,重复步骤002、003,直至重做日志文件redo读取结束。

二、学习过程

逻辑上,学习过程应该在解析过程之前完成,因为解析过程实际是在应用学习过程所得的结果。在实施过程中这是两个密切相关的过程。具体的学习过程如下:

001,实现一个解析过程,解析过程003步骤中的获得ddl类型没有实现,因为目前尚不清楚各个ddl包含的系统表dml。

002,运行解析过程读取到在线日志最新位置,保证当前库中没有其他事务,执行ddl操作,记录下本事务的日志中系统表的dml操作类型及数量。选取有代表性的系统表及操作类型作为判断此ddl的特征。

003,某些ddl操作比较容易混淆,比如truncate与move操作,其系统表dml有较多重复,特征相似,此时就要更加进一步的分析dml具体数据内容,以此作为判断特征。

004,将学习得到的特征写入解析过程中,继续学习其他ddl事务。

综上所述,本发明一种基于日志解析的ddl分析方法及装置通过先从数据库中导出所需系统表的基本信息,然后读取重做日志文件redo,从读取的redo数据中分析出dll事务及dml详细信息,对比匹配分析dll事务中的详细信息与步骤s1中导出的所需系统表的基本信息,若出现匹配,则解析得到的dll事务,统计本dll事务中对各个系统表的dml操作类型及数量,根据预先学习确定的dll事务的特征确定当前ddl事务的类型,从而达到通过解析日志实现ddl事务分析的目的。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1