一种基于数据库DML同步的持续数据保护方法及装置与流程

文档序号:19786552发布日期:2020-01-24 13:39阅读:298来源:国知局
一种基于数据库DML同步的持续数据保护方法及装置与流程

本发明涉及计算机数据备份容灾技术领域,特别是涉及一种基于数据库dml同步的持续数据保护(cdp,continuousdataprotection)方法及装置。



背景技术:

在计算机领域,为了保护重要的数据信息,通常采用数据备份技术,在数据不可用时从备份介质中恢复数据。但是在恢复数据时,两次备份之间的数据可能会丢失,对于一些关键的信息系统,所能容忍的数据丢失量,即恢复点目标(rpo,recoverypointobject)要尽可能地低,这就需要应用连续数据保护(cdp,continuousdataprotection)技术。

oracle数据库是一种市面上被广泛使用的高性能关系数据库,大量企业的核心数据都保存在oracle数据库系统中。一旦生产系统出现软硬件失效,数据丢失甚至无法恢复,造成的损失将是巨大的,因此对核心数据库进行备份是必不可少的。

由于数据库内部数据逻辑的复杂性,一般的物理层面基于数据块的或者针对文件系统的数据备份和cdp系统无法保护oracle的数据,其复制出的数据往往无法被oracle识别和使用,更无法实现将数据变化立即同步到备份机并查询的功能。数据库提供的定期的数据库备份任务无法实现实时的、细粒度的数据同步和保护。针对数据库系统的保护必须从逻辑层面将库中的数据取出并通过数据库接口将数据装载到备份库中。

目前的数据库同步软件从原理上大致分为两类,一类是在数据库的表上添加触发器,另一类是通过分析数据库的redolog获取增量数据。其中触发器的方式需要修改表结构,在需要同步的表上对每个字段添加触发器从而捕获到对表数据的修改,对数据库性能等方面影响太大。而基于redolog的方式则只需要读取日志文件,从文件系统直接获取数据,极大的减少了与数据库的交互,对系统性能影响降到最小。

根据数据库的先写日志(wal,write-aheadlogging)原则,数据库的所有操作都会写入重写日志文件(redolog)中,通过解析重写日志文件redolog就可以获取数据库中表数据的所有变化,然后将这些变化数据还原为sql语句装载入备份库中,即可实现对数据库的高效的连续性数据保护(cdp)。

数据库日志也分为两种,一种是直接记录操作的sql,一种是记录具体的数据变化,并以特定的格式写入二进制的文件中。直接记录sql的方式看似简单直接,但对于某些操作无法反映其真实数据,比如时间日期类型的列中直接使用sysdate,对于update操作也无法记录update操作之前的值。

oracle的redolog(重做日志文件)是二进制的,其中详细记录了每个操作的类型及其数据,通过分析可以从redolog的记录格中解析出每个操作的时间戳(scn)、事务id、操作对象、原始数据(old)和变化后的数据(new)。数据库的修改操作大致分为增(irp)、删(drp)、改(urp)三种,不同的操作在日志中以不同的格式进行记录,并用不同的操作码进行标识。

oracle的redolog分为在线日志和归档日志,其中归档日志只有在开启归档的模式下才会保存。在线日志则是几个固定的文件,循环写入,在非rac(realapplicationcluster,实时应用集群)的情况下只有一个是当前(current)正在写入的日志。

然而,在现有的数据库同步技术和实现中,基线(baseline)的导出和增量的衔接大多比较繁琐,有些实现只有增量部分,baseline的导出和装载则需要使用其他工具单独进行,有些还需要经过繁琐的手动配置,效率较低。



技术实现要素:

为克服上述现有技术存在的不足,本发明之目的在于提供一种基于数据库dml同步的持续数据保护方法及装置,以实现高效地对oracle数据库的连续性数据保护的目的。

为达上述目的,本发明提出一种基于数据库dml同步的持续数据保护方法,包括如下步骤:

步骤s1,导出源端数据库的数据字典;

步骤s2,启动日志分析进程,监听源端数据库的重做日志文件的变化,于监听到重做日志文件中写入新的数据时,读取新写入的内容,从读取的二进制数据中解析出具体的增量dml操作,并进行缓存;

步骤s3,在日志分析启动后,利用步骤s1导出的数据字典将源端数据库的基线导出,并通过数据字典将基线数据装载到备份数据库;

步骤s4,获取步骤s2得到的dml操作,根据其操作类型、操作对象及数据结合数据字典将其装载到备份数据库中;

步骤s5,往复循环执行步骤s2的日志分析进程及步骤s4的dml增量同步。

优选地,于步骤s1中,导出数据字典时记录每个表的对象号、表的基本属性,包括但不限于表的列信息、索引信息、约束信息、触发器信息,并记录下数据字典的导出时间戳。

优选地,步骤s2进一步包括:

步骤s200,从源数据库中查询出当前日志的路径,读取到最新的写入位置;

步骤s201,读取日志文件内容,若解析到新写入的数据时,从中读取新加的内容,并从二进制数据中分析出具体的dml操作,其中包含但不限于操作类型,操作对象的id,时间戳及操作产生的数据;

步骤s202,判断解析得到的操作对象是否在所述数据字典中,若该操作对象不在所述数据字典中,则丢弃该操作对象对应的dml操作,否则将解析得到的dml操作写入缓存文件中进行保存,记录下该dml操作的信息;

优选地,于步骤s200中,若日志分析进程无法于在线日志被覆盖之前读取其中的内容,则从归档日志中继续读取,若没有归档日志,则同步失败,并返回步骤s1重新导出数据字典和基线并从新的位置解析当前日志。

优选地,于步骤s3中,根据先前导出的数据字典拼接出正确的sql语句,以select语句的形式从源端数据库中查询出所需表数据,在导出的基线中记录每个表的基线的导出时间戳。

优选地,于步骤s202中,将增量dml操作的时间戳和对应操作的表的基线的导出时间戳进行对比,如果该增量操作先于该对象的导出时间戳,则将该增量dml操作丢弃

优选地,于步骤s3中,当导出基线后,通过数据字典拼接出正确的装载sql,将数据字典和基线数据以insert的形式装载到所述备份数据库中。

优选地,于步骤s4中,从缓存文件中读出增量dml的事务操作,根据其操作类型、操作对象及数据结合数据字典还原出sql语句,并装载到所述备份数据库库中。

为达到上述目的,本发明还提供一种基于数据库dml同步的持续数据保护装置,包括:

数据字典导出模块,用于导出源端数据库的数据字典;

日志分析模块,用于启动日志分析进程,监听源端数据库的重做日志文件的变化,于监听到所述重做日志文件中写入新的数据时,读取新写入的内容,从读取的二进制数据中解析出具体的增量dml操作,并进行缓存;

基线导出装载模块,用于在所述日志分析进程启动后,利用所述数据字典导出模块导出的数据字典将所述源端数据库的基线导出,并通过所述数据字典将基线数据装载到所述备份数据库中;

增量dml装载模块,用于获取解析到的dml操作,根据其操作类型、操作对象及数据结合数据字典将其装载到所述备份数据库中。

循环执行控制模块,用于往复循环执行所述日志分析模块的日志分析进程及所述增量dml装载模块的dml增量同步。

优选地,所述日志分析模块进一步包括:

日志读取单元,用于从源端数据库中查询出当前日志的路径,读取到最新的写入位置;

解析单元,用于读取日志文件内容,若解析到新写入的数据时,从中读取新加的内容,并从二进制数据中分析出具体的dml操作,其中包含但不限于操作类型,操作对象的id,时间戳及操作产生的数据;

判断处理单元,用于判断解析得到的操作对象是否在所述数据字典中,若该操作对象不在所述数据字典中,则丢弃该操作对象对应的dml操作,否则将解析得到的dml操作写入缓存文件中进行保存,记录下该dml操作的信息。

与现有技术相比,本发明提供一种基于数据库dml同步的持续数据保护方法,自动导出数据字典和基线baseline,通过分析重写日志文件redolog获取源端数据库的增量数据dml,将增量数据dml装载到备份数据库中,在数据库正常运行的情况下进行基线baseline和增量数据dml的衔接,实现了一种方便易用且高效的对于oracle数据库的连续性数据保护技术。

附图说明

图1为本发明一种基于数据库dml同步的持续数据保护方法的步骤流程图;

图2为本发明一种基于数据库dml同步的持续数据保护装置的系统架构图;

图3为本发明具体实施例中日志分析模块的细部结构图;

图4示出了本发明具体实施例中导出数据字典和baseline的过程。

图5示出了本发明具体实施例中增量日志分析和装载的过程。

具体实施方式

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

图1为本发明一种基于数据库dml同步的持续数据保护方法的步骤流程图。如图1所示,本发明一种基于数据库dml同步的持续数据保护方法,包括如下步骤:

步骤s1,导出源端数据库的数据字典。

具体地说,从源端oracle数据库中查询需要同步的表的结构及其他元数据,即数据字典,在本发明具体实施例中,导出数据字典时会记录下每个表的对象号(object#,oracle中每个对象都有唯一的对象号,表也是一种对象)、表的基本属性包括表的列信息、索引信息、约束信息、触发器信息等,同时记录下数据字典的导出时间戳(scn)。一般地,数据库的元数据存储在数据库的系统表中,包括sys.obj$、sys.tab$、sys.col$等,以select的形式从系统表中查询出所需元数据。

步骤s2,启动日志分析进程,监听源端数据库的重做日志文件(redolog)的变化,于监听到重做日志文件(redolog)中写入新的数据时,读取新写入的内容,从读取的二进制数据中解析出具体的增量dml操作,并进行缓存。

具体地,步骤s2进一步包括:

步骤s200,从源数据库中查询出当前(current)日志的路径,读取到最新的写入位置。优选地,在日志分析过程中,可能会出现系统事务量大,日志写入速度快,导致日志分析进程无法于在线日志(onlinelog)被覆盖之前读取其中的内容,此时就需要从归档日志(archived_log)中继续读取,如果没有归档日志,则同步失败,此时cdp无法继续,只能返回步骤s1重新导出数据字典和baseline并从新的位置解析当前日志。

步骤s201,读取日志文件内容,若解析到新写入的数据时,从中读取新加的内容,并从二进制数据中分析出具体的dml操作,其中包含了操作类型,操作对象(表)的id,及操作产生的行数据。在顺序读取日志文件内容的时候,如果解析得到了旧的日志块,则等待若干时间(该时间可以预设,例如可以是几十到几百毫秒)再重新读,若没有新文件块则继续等待,直到出现新文件块则继续往下读。

步骤s202,判断解析得到的操作对象是否在数据字典中,若得到的操作对象不在数据字典中,则丢弃此操作对象对应的dml操作,否则将解析得到的dml操作写入缓存文件中进行保存,记录下所有的dml操作的事务id、scn(时间戳)、操作类型(irp,drp,urp)、操作对象(object#)及数据(new,old)等。

步骤s3,在日志分析进程启动后,利用步骤s1导出的数据字典将源端数据库的基线(baseline)导出,并将数据字典和baseline数据发送到备份数据库。在本发明具体实施例中,根据先前导出的数据字典拼接出正确的sql语句,以select语句的形式从数据库中查询出所需表数据,即基线(baseline)。由于数据字典中导出了每个表的所有列信息,这里用表名和列名构成一个“select列1,列2,列3from表”形式的语句从表中抽取数据,在导出的基线(baseline)中记录每个表的基线(baseline)导出时间戳(scn),当导出基线(baseline)后,,装载程序通过数据字典拼接出正确的装载sql,将数据字典和基线(baseline)数据以insert的形式装载到备份数据库中。

这里需说明的是,由于基线(baseline)数据的导出通常耗时较长且每个数据表是逐个导出,此时数据库中的业务正常进行,为保证导出baseline期间增量数据不丢失,步骤s2的日志分析最好先于baseline导出开始进行。

优选地,由于在导出的baseline中记录每个表的baseline导出时间戳(scn),因此,于步骤s202中,还将增量dml操作的时间戳(scn)和对应操作的表的baseline的导出时间戳(scn)进行对比,如果该增量操作先于该对象的导出时间戳(scn),则将该增量dml操作丢弃。这种情况是可能出现的,因为日志分析是先于基线(baseline)导出开始进行。

步骤s4,获取步骤s2得到的增量dml操作,根据其操作类型、操作对象及数据结合数据字典将其装载到备份数据库中。在本发明具体实施例中,从缓存文件中读出增量dml的事务操作,根据其操作类型、操作对象及数据结合数据字典还原出sql语句(insert、delete、update)并装载到备份数据库库中,本发明使用sql语句进行装载保证了装载的数据立即可用。也就是说,当基线(baseline)数据装载完成之后,则将解析得到的dml操作发送到装载模块,装载模块则将获取的操作结合数据字典还原为sql,以insert、delete、update的形式装载到备份数据库中。

步骤s5,往复循环执行步骤s2的重做日志文件redolog的日志分析进程及步骤s4的dml增量同步,即可实现oracle数据库dml操作的连续复制,继而对oracle数据库实现了cdp保护。

图2为本发明一种基于数据库dml同步的持续数据保护装置的系统架构图。如图2所示,本发明一种基于数据库dml同步的持续数据保护装置,包括:

数据字典导出模块201,用于导出源端数据库的数据字典。

具体地说,从源端oracle数据库中查询需要同步的表的结构及其他元数据,即数据字典,在本发明具体实施例中,数据字典导出模块201导出数据字典时会记录下每个表的对象号(object#,oracle中每个对象都有唯一的对象号,表也是一种对象)、表的基本属性包括表的列信息、索引信息、约束信息、触发器信息等,同时记录下数据字典的导出时间戳(scn)。一般地,数据库的元数据存储在数据库的系统表中,包括sys.obj$、sys.tab$、sys.col$等,以select的形式从系统表中查询出所需元数据。

日志分析模块202,用于启动日志分析进程,监听源端数据库的重做日志文件(redolog)的变化,于监听到重做日志文件(redolog)中写入新的数据时,读取新写入的内容,从读取的二进制数据中解析出具体的增量dml操作,并进行缓存。

具体地,如图3所示,日志分析模块202进一步包括:

日志读取单元2021,用于从源端数据库中查询出当前(current)日志的路径,读取到最新的写入位置。优选地,在日志分析过程中,可能会出现系统事务量大,日志写入速度快,导致日志分析进程无法于在线日志(onlinelog)被覆盖之前读取其中的内容,此时日志读取单元2021就需要从归档日志(archived_log)中继续读取,如果没有归档日志,则同步失败,此时cdp无法继续,只能返回数据字典导出模块201重新导出数据字典和baseline并从新的位置解析当前日志

解析单元2022,用于读取日志文件内容,若解析到新写入的数据时,从中读取新加的内容,并从二进制数据中分析出具体的dml操作,其中包含了操作类型,操作对象(表)的id,及操作产生的行数据。解析单元2022在顺序读取日志文件内容的时候,如果解析得到了旧的日志块,则等待若干时间(该时间可以预设,例如可以是几十到几百毫秒)再重新读,若没有新文件块则继续等待,直到出现新文件块则继续往下读。

判断处理单元2023,用于判断解析得到的操作对象是否在数据字典中,若得到的操作对象不在数据字典中,则丢弃此操作对象对应的dml操作,否则将解析得到的dml操作写入缓存文件中进行保存,记录下所有的dml操作的事务id、scn、操作类型(irp,drp,urp)、操作对象(object#)及数据(new,old)等。

基线导出模块203,用于在日志分析进程启动后,利用数据字典导出模块201导出的数据字典将源端数据库的基线(baseline)导出,并通过数据字典将基线(baseline)数据装载到备份数据库。在本发明具体实施例中,根据先前导出的数据字典拼接出正确的sql语句,以select语句的形式从数据库中查询出所需表数据,即基线(baseline)。由于数据字典中导出了每个表的所有列信息,这里用表名和列名构成一个“select列1,列2,列3from表”形式的语句从表中抽取数据,在导出的基线(baseline)中记录每个表的基线(baseline)导出时间戳(scn)。当基线导出模块203导出基线(baseline)数据后,通过数据字典拼接出正确的装载sql,将基线(baseline)数据以insert的形式装载到备份数据库中

这里需说明的是,由于基线(baseline)数据的导出通常耗时较长且每个数据表是逐个导出,此时数据库中的业务正常进行,为保证导出baseline期间增量数据不丢失,日志分析模块的日志分析最好先于基线导出模块203的基线(baseline)导出开始进行。

优选地,由于在导出的baseline中记录每个表的baseline导出时间戳(scn),于日志分析模块202的判断处理单元2023中,还将增量dml操作的时间戳(scn)和对应操作的表的baseline的导出时间戳(scn)进行对比,如果该增量操作先于该对象的导出时间戳(scn),则将该增量dml操作丢弃。这种情况是可能出现的,因为日志分析是先于基线(baseline)导出开始进行。

增量dml装载模块204,用于获取解析到的dml操作,根据其操作类型、操作对象及数据结合数据字典将其装载到备份数据库中。在本发明具体实施例中,于基线(baseline)数据装载完成之后,增量dml装载模块204则从缓存文件中读出增量dml的事务操作,根据其操作类型、操作对象及数据结合数据字典还原出sql语句,以insert、delete、update的形式,将其装载到备份数据库库中,在本发明具体实施例中,增量dml装载模块使用sql语句进行装载保证了装载的数据立即可用。

循环执行控制模块205,用于往复循环执行所述日志分析模块的日志分析进程及所述增量dml装载模块的dml增量同步,即可实现oracle数据库dml操作的连续复制,继而对oracle数据库实现了cdp保护。

以下将通过具体实施例来进一步说明本发明:

1、从数据库中查询需要同步的表的结构及其他元数据,即数据字典,导出数据字典。

在本发明具体实施例中,数据库的元数据存储在数据库的系统表中,包括sys.obj$、sys.tab$、sys.col$等,以select的形式从系统表中查询出所需元数据。如图4所示。

2、启动redolog解析:

日志解析程序监听redolog日志文件的变化,首先从数据库中查询出当前(current)日志的路径,打开并读取到最新的写入位置。

当redolog中写入新的数据时,从中读取新加的内容,并从二进制数据中分析出具体的dml操作,其中包含了操作类型,操作对象(表)的id,及操作产生的行数据。如图5所示。

在顺序读取日志文件内容的时候,如果解析得到了旧的日志块,则等待一定时间(可以是几十到几百毫秒)重新读,没有新文件块则继续等待,直到出现新块就继续往下读。

3、基线(baseline)数据的导出及装载:

使用先前导出的数据字典拼接出正确的sql语句,以select语句的形式从数据库中查询出所需表数据,即基线(baseline)。

将数据字典和基线(baseline)数据发送到备份数据库上后,装载程序通过数据字典拼接出正确的装载sql,将baseline数据以insert的形式装载到备份数据库中。

4、将解析到的增量dml进行装载:

当基线(baseline)装载完成之后,将解析得到的dml操作发送到装载端,装载程序将获取的操作结合数据字典还原为sql,以insert、delete、update的形式装载到备份数据库中。

5、往复循环执行redolog解析及dml增量同步,即可实现oracle数据库dml操作的连续复制,继而对oracle数据库实现了cdp保护。

6、在日志分析过程中,可能会出现系统事务量大,日志写入速度快,导致解析进程无法于在线日志(onlinelog)被覆盖之前读取其中的内容,此时就需要从归档日志(archived_log)中继续读取,如果没有归档日志,则同步失败。此时cdp无法继续,只能重新导出数据字典和baseline数据并从新的位置解析当前日志。

综上所述,本发明一种基于数据库dml同步的持续数据保护方法及装置自动导出数据字典和基线baseline,通过分析重写日志文件redolog获取源端数据库的增量数据dml,将增量数据dml装载到备份数据库中,在数据库正常运行的情况下进行基线baseline和增量数据dml的衔接,实现了一种方便易用且高效的对于oracle数据库的连续性数据保护技术。

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

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