一种基于物理级的数据库日志挖掘方法
技术领域
本发明涉及一种基于物理级的数据库日志挖掘方法,属于数据库数据复制技术领域。
背景技术
随着信息技术的深入发展,应用系统的不断升级,数据已经逐步成为了信息系统中的关键部分。然而,所有针对数据的处理都包含着一个基本的假设——数据的可用性和可靠性。数据库技术作为当前在金融、电力电信等领域的主流数据处理技术,其数据的可用性和与可靠性自然备受关注。数据库日志挖掘技术正是在这种要求下产生的。
国内外关系型数据库日志挖掘技术分为两种类型,一种是基于逻辑级日志挖掘技术、一种是基于物理级Redo挖掘技术。数据库日志挖掘技术在信息灾备领域应用广泛,主要使用的是基于逻辑级日志挖掘技术,但在实际的使用中,由于基于逻辑级数据库挖掘出的数据无法支持全部的数据库对象,导致从生产库挖掘出的数据投递到灾备库不能保证数据对象的一致性。传统的逻辑级日志挖掘是通过日志抽取SQL的方式实现,不支持所有DDL操作的复制,不支持触发器、存储过程等数据库关键功能的复制,经常会发生由于生产库数据库结构变更造成灾备库日志挖掘中断甚至崩溃,不能保证数据库日志挖掘的完整性。目前传统的基于物理级Redo日志挖掘技术,不能较好的解决数据库日志挖掘效率问题,并且对生产库影响较大。
发明内容
针对现有技术存在的不足,本发明目的是提供一种基于物理级的数据库日志挖掘方法,可以从根本上实现挖掘出的日志信息与生产库的一致性与完整性,还能降低数据库日志挖掘对生产库的性能影响。
为了实现上述目的,本发明是通过如下的技术方案来实现:
本发明的一种基于物理级的数据库日志挖掘方法,包括以下几个步骤:
(1)从数据库表v$archived_log获取当前操作系统数据块大小;并从数据库表v$archived_log中获取Redo日志(重做日志)全路径名,根据Redo日志全路径名判断日志文件是存储在文件系统还是Oracle自带自动存储管理ASM上,如果Redo日志文件存储在ASM上,则从数据库表v$asm_disk中取得路径;
(2)从数据库表v$log,v$logfile中获取数据库Redo日志组信息;
(3)根据数据库Redo日志组信息,启动多个子进程,对每一个Redo日志组进行单独进程挖掘;根据数据库Redo日志文件头标志位信息,挖掘日志文件头信息,比对thread(一个数据库实例产生一个thread)和dbid(数据库ID),判断是否和生产库一致,如果不一致,则返回错误,如果一致,则从日志文件头中获取当前的日志序列sequence号,判断日志序列是否存在,如果不存在则返回错误,如果存在,则检查当前日志文件头中序列是否和之前获取的日志序列sequence号一致,如果不一致,说明当前文件已经被覆盖,则返回错误信息,终止当前日志挖掘,等待归档流程处理,如果一致,则转向步骤(4);
(4)开始挖掘日志文件头后的数据块,每次挖掘固定大小数据,记录当前挖掘的数据块数,将数据块内容写入新建的临时文件,临时文件名根据业务系统id、在线日志组号、sequence号(数据库系统按照一定规则自动增加的数字序列)以及当前数据块编号进行命名,如果当前日志文件挖掘没有结束,则返继续执行步骤(4),如果当前日志文件挖掘结束,则转向步骤(5);
(5)重新挖掘日志文件头,获取日志结束标志,并写入临时文件中,然后计算日志文件校验和,并将校验和写入到日志头的第14-15字节,结束当前文件挖掘,然后开始挖掘下一日志文件。
步骤(1)中,对数据库表v$archived_log、v$asm_disk的调用关系如下表1所示:
表1获取操作系统数据块大小与日志路径相关操作
步骤(2)中,对数据库表v$log,v$logfile的调用关系如下表2所示:
表2获取数据库RedoLog日志组信息
表名称 |
操作权限 |
关键操作栏位 |
v$log |
dba |
thread |
v$logfile |
dba |
group,type |
步骤(3)中,日志文件头标志位信息如下表3所示:
表3日志文件头标志位信息表
步骤(4)中,临时文件命名规则是:thread号+sequence号+resetlogs_id+数据块编号;将当前数据挖掘块数写入到日志文件头的第24-27字节,数据块数计算公式是:index/blocksize-1。
步骤(5)中,重新挖掘日志文件头即修改日志文件头表示日志类型的第236-239字节,将原记录在线日志修改为归档日志类型,如果是oracle10g数据库写入17,如果是oracle11g数据库写入8388625。
步骤(5)中,重写日志头文件后再写入日志文件校验和,其校验和计算方法如下:
步骤一,将日志头分成多个64字节的端;
步骤二,首先将第一个段分为四个16字节的段,第1和第2段进行16字节异或得到值a,第3和第4段进行16字节异或得到值b,初始化变量c为0,将a和c异或得到c,将c与b进行异或得到c;
步骤三,将64字节段循环执行以上操作,每次和上一轮得到c值进行异或,c为全局变量,不是每次取初始值;
步骤四,等待全部计算完,得到最终的c值,将16字节的c分为4个4字节段r1、r2、r3、r4,将上述四个值分别按位异或得到值r0;
步骤五,将r0按位右移16位得到g,将r0与g进行异或得到校验和反数m;
步骤六,将m与0xFFFF按位与,得到最终的校验和;
步骤七,将计算的校验和写到日志文件头的第14-15字节,结束校验。
本发明通过对Oracle数据库在文件系统格式下、裸设备下以及对基于数据库特殊卷管理器格式下的Redo日志的解析,在数据库日志变化的第一时间挖掘日志出变化日志片段,重置日志片段中的日志头标记位,生成归档日志文件数据块。通过本发明的方法不但可以确保挖掘出的日志文件与原数据库数据的一致性与完整性,数据库日志挖掘效率高,还能降低数据库日志挖掘对生产库的性能影响,确保信息灾备系统安全稳定的运行具有重要的实际意义。
附图说明
图1是本发明的基于物理级的数据库日志挖掘方法工作流程图;
图2是基于物理级的数据库日志挖掘的架构图。
具体实施方式
为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体实施方式,进一步阐述本发明。
本发明提供一种适用于oracle10g、oracle11g的在线日志挖掘方法,系统利用一个主备数据库复制组来确立其参照关系,通过对Oracle数据库在文件系统格式下、裸设备下以及对基于数据库特殊卷管理器格式下的Redo日志的解析,在日志变化的第一时间挖掘日志捕获数据变化片段,重置数据块的日志标志位,将数据块文件写入到文件系统中。实现数据库在线日志实时挖掘功能。
本发明一种基于物理级的数据库日志挖掘方法,该方法采用多进程的方式对生产库在线日志进行数据块挖掘,每次挖掘的数据存入一个临时文件中,并按照固定规则进行命名编号。
在线日志挖掘对数据库表的调用关系如表1所示。
表0在线日志挖掘对数据库表的调用关系
一种基于物理级的数据库日志挖掘方法具体步骤流程如图1所示:
(1)获取数据库系统数据块大小、在线日志全路径名、日志存储文件系统格式,具体包括:
从生产库v$archived_log获取当前数据库系统数据块大小;
获取生产库一条在线日志全路径名,根据全路径名判断是存储在文件系统中还是ASM上,如果日志文件存在ASM上,则从表v$asm_disk中取得路径;
对表v$archived_log、v$asm_disk的调用关系如下表1所示。
表1获取数据块大小与日志路径相关操作
(2)从数据库v$log、v$logfile中获取当前日志组信息,获取操作信息,其中涉及到的数据库表的调用关系如下表2所示。
表2获取日志组信息相关操作
表名称 |
操作权限 |
关键操作栏位 |
v$log |
dba |
thread |
v$logfile |
dba |
group,type |
(3)挖掘日志文件头信息,从日志文件头中获取当前的日志序列;挖掘信息具体包括:
针对每个在线日志组启动对应的日志挖掘子进程,当某一个在线日志组处于时活动状态时,对应的子进程就会相应活动状态;
日志文件头标志位信息如下表3所示,挖掘日志文件头信息,比对thread和dbid,是否和生产库一致,如果不一致,则返回错误;
从日志文件头中获取当前的日志序列sequence号,检查日志序列是否存在,不存在则返回错误;
检查当前日志文件头中序列是否和之前获取的sequence一致,如果不一致,说明当前文件已经被覆盖,返回错误信息,终止当前日志挖掘,等待归档流程处理,开始挖掘新的日志文件;
表3文件头标志位信息表
(4)开始挖掘日志文件头后的数据块,每次挖掘1M数据,记录当前挖掘的数据块数,将数据块内容写入新建的临时文件,临时文件名根据thread号、sequence号、resetlogs_id以及当前数据块编号进行命名,如果获取失败则返回错误信息,终止当前挖掘;
(5)从文件头获取文件结束标志,检查是否已经挖掘结束,如果没有结束,则跳到步骤5,挖掘下一数据块;如果文件已经结束,重新挖掘日志文件头,写入日志头数据块临时文件,覆盖之前的内容,并存入结束标志,结束当前文件挖掘,开始挖掘下一日志文件。
上述步骤(4)中临时文件命名规则是:thread号+sequence号+resetlogs_id+数据块编号;
当前数据挖掘块数写入到日志文件头的第24-27字节,数据块数计算公式是:index/blocksize-1;
上述步骤(5)重写日志头文件,修改日志文件头表示日志类型的第236-239字节,将原记录在线日志修改为归档日志类型,如果是oracle10g数据库写入17,如果是oracle11g数据库写入8388625;
上述步骤(5)重写日志头文件后再做日志文件校验,其校验步骤如下:
步骤一,将日志头分成多个64字节的端;
步骤二,首先将第一个段分为四个16字节的段,第1和第2段进行16字节异或得到值a,第3和第4段进行16字节异或得到值b,初始化变量c为0,将a和c进行异或得到新的c,将c与b进行异或得到新的c;
步骤三,将大的64字节段循环执行以上操作,每次和上一轮得到c值进行异或,c为全局变量,不是每次取初始值;
步骤四,等待全部计算完,得到最终的c值,将16字节的c分为4个4字节段r1、r2、r3、r4,将上述四个值分别按位异或得到值r0;
步骤五,将r0按位右移16位得到g,将r0与g进行异或得到m;
步骤六,将m与0xFFFF按位与,得到最终的校验和;
步骤七,将计算的校验和重写到日志头的第14-15字节。
本发明的原理如图2所示,通过对Oracle数据库在文件系统格式下、裸设备下以及对基于数据库特殊卷管理器格式下的Redo日志的解析,在数据库日志变化的第一时间挖掘日志出变化日志片段,重置日志片段中的日志头标记位,生成归档日志文件数据块。通过该方法不但可以支持所有复制对象,还能降低数据库日志挖掘对生产库的性能影响,对于消除生产库数据复制到灾备库导致的数据不一致性与不完整性等潜在的隐患,确保信息灾备系统安全稳定运行具有重要的实际意义。
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。