发明内容
本发明的目的在于克服现有技术的不足,提供一种基于Oracle数据库的一致点捕获方法,该方法能够及时捕获Oracle数据库处于一致性状态的时间点,能够保证数据库处于事务一致性状态,解决了现有存储技术中无法获取数据库一致性状态的问题。
本发明解决其技术问题是采取以下技术方案实现的:
一种基于Oracle数据库的一致点捕获方法,其特征在于:包括以下步骤:
步骤1、使用SYS帐户连接到需要捕获一致性点的Oracle数据库,并保持数据库连接,定时对数据库数据字典X$Kcccp表进行查询,取得表中CPHBT字段、CPODT字段及CPODR_SEQ字段值;
步骤2、将首次查询到的CPHBT字段值、CPODT字段值及CPODR_SEQ字段值要作为基准参考值进行保存;
步骤3、分析CPHBT字段是否发生变化,如果没有发生变化,则等待进行下一查询周期;
步骤4、如果CPHBT字段发生变化,则说明数据库已进入另一数据写磁盘周期,进入步骤5;
步骤5、分析CPODR_SEQ字段是否变化?如果CPODR_SEQ值变化,说明则此时数据库处于一致性状态,记录此CPODR_SEQ对应的CPODT时间点,并更新作为参考的三个数值为当前查询到的数值以备下次查询使用,同时更新两个CPHBT周期内的CPODT时间数组,本次捕获一致性点周期结束,等待进行下一查询周期;如果CPODR_SEQ值没有变化,则进入步骤6;
步骤6、分析CPODT字段值是否变化,如果没有变化,等待进行下一查询周期,同时CPODT数组更新记录本次查询到两个CPHBT前的CPODT时间,作为之后的数据分析所用;
步骤7、分析CPODT字段值与上一次一致性点时的CPODT字段值是否相同?如果不相同,则更新作为参考的三个数值为当前查询到的数值以备下次查询使用,并更新记录两个CPHBT周期内的CPODT时间数组,本次捕获一致性点周期结束,等待进行下一查询周期;如果相同,则等待进行下一查询周期。
而且,所述CPHBT字段用于Oracle中检查点事件的心跳,检查点事件每三秒发生一次;所述CPODT字段用于检查点事件将数据库Redo日志写到磁盘上的最晚时间,精度为秒;所述CPODR_SEQ字段用于检查点事件写入日志文件的最后一个RBA的日志序列号。
而且,所述步骤1使用SYS帐户连接到需要捕获一致性点的Oracle数据库是通过JDBC实现的。
而且,所述步骤1定时对数据库数据字典X$Kcccp表进行查询的周期1秒。
本发明的优点和积极效果是:
本发明设计合理,其可以在Oracle数据库相应事务结束后秒级时间内确定事务的一致性时间点,当处于CDP状态的Oracle数据库需要进行数据恢复时,可以对照被捕获的一致性状态时间点,将数据库数据恢复到最近的一致性时间点,从而保证数据库处于事务一致性状态。
具体实施方式
以下结合附图对本发明做进一步详述。
一种基于Oracle数据库的一致点捕获方法,是基于Oracle数据库的以下特点实现的:
检查点(CKPT)是一个Oracle数据库事件,其能够将修改数据从高速缓存写入磁盘,并更新控制文件和数据文件,该检查点事件的处理过程如图1所示。在Oracle中所有被修改过的块统称为脏块,所有的脏块被一个链表串连起来,称做检查点队列,有了检查点队列之后,脏块按照首次变脏的时间顺序排列,DBWR每到一定的时机就会被触发,沿着检查点队列的顺序刷新脏块,具体在Oracle中有几个参数用来确定检查点队列的长度。Oracle数据库有一个CKPT进程,会监控检查点队列的长度,当检查点队列的长度达到一定限制时,CKPT会通知DBWR写脏块。CKPT会根据参数的设置和I/O的速度以及繁忙程度,计算出来一个Target RBA(目标RBA),DBWR会沿着检查点队列将所有Target RBA之前的脏块刷新到磁盘。通知DBWR写脏块,这是CKPT的任务之一,CKPT另有一个任务,就是每3秒,检测一次DBWR的写进度。检查点队列最前面的块被称为检查点位置,DBWR沿检查点队列写脏块,CKPT每3秒钟查看一下DBWR沿检查点队列写到了哪里,并且将这个位置设置为检查点位置。也就是说检查点位置之前的块,都是已被DBWR刷新到磁盘上的块。这个3秒一次检查DBWR进度的工作,也是CKPT的一个重要的任务。CKPT每3秒一次将检查点位置记录进控制文件,当然同时被记录进控制文件的还有“心跳”等其他信息。CKPT每3秒一次的工作和CKPT定期触发DBWR,这两项操作合一起被称为增量检查点。
在增量检查点事件中,我们在两种情况下可认定数据库处于一致性状态。其一,检查点事件更新日志文件的最后一个RBA(On Disk Redo Byte Address)的日志序列号时,此时由于日志更新完成时的时间点是磁盘日志写的截止点,同时也是恢复数据库时所能达到的最新一致性状态,则此情况可以认为数据库是一致性的;其二,当数据库的CPODT在至少两个心跳周期无变化时,表明没有新的数据写入数据库,为数据库事务操作的间歇期,此时数据库处于一致性状态。这两种情况下所需的分析数据可以在Oracle数据字典的X$表中查到。
X$数据结构是Oracle数据库管理系统(DBMS)的核心。在数据库管理系统的内核中,它们保存着数据库实例运行期间的各种统计信息。X$视图的内容一般只存在于内存中,因此不可将它们导出到其他的数据库中,因为它们在数据字典中没有相关信息。它们也不像普通的表那样可以设置存储参数,但是某些固定的列上可以有索引。X$视图的名字都是以K开头,表示内核(kernel)。
本发明涉及的X$内部表为:X$kcccp——[K]Kernel[c]Cache[c]Controlfile management[c]Checkpoint[p]Progress,此表记录的就是增量检查点的运行情况,从而反映出数据库的一致性状态。本发明方法涉及到此表的三个字段:
1、CPHBT字段:Oracle中检查点事件的心跳,检查点事件每三秒发生一次,故此字段每三秒钟加一。在同一检查点周期内,无法判断数据库是否处于一致性状态,因此,在实际捕获一致性点时需要比较两个不同CPHBT值时的表内其它数据。
2、CPODT字段:On Disk RBA的时间,精度到秒,此数据记录的是检查点事件将数据库Redo日志写到磁盘上的最晚时间。数据写入Redo日志即可在将来的数据库恢复操作中被写入日志文件,当数据库的CPODT在至少两个心跳周期无变化时,表明没有新的数据写入数据库,此时数据库处于一致性状态。
3、CPODR_SEQ字段:检查点事件写入日志文件的最后一个RBA(On Disk RedoByte Address)的日志序列号,On Disk RBA就是LGWR的写进度,LGWR写日志文件的最末位置的地址(没有写进日志文件的日志会被丢弃),也就是写到磁盘上的日志的截止点。这是恢复所能达到的最新状态。当此序列号改变时,标志着一次事务的写日志结束,故最后一个可查的序列号所对应的时间点,数据库处于一致性状态。
通过以上述信息便可确定检查点事件的运行情况,从而确定一致性时间点。
一种基于Oracle数据库的一致点捕获方法,如图2所示,具体包括以下步骤:
步骤1、通过JDBC使用SYS帐户(由于X$Kcccp表是保存数据库信息,只有SYS帐户能能够对其进行查询)连接到需要捕获一致性点的Oracle数据库,并保持数据库连接。每一秒钟对数据库数据字典X$Kcccp表进行一次查询,取得表中CPHBT、CPODT及CPODR_SEQ三个字段数据,并对之进行分析。
步骤2、将首次查询到的CPHBT、CPODT及CPODR_SEQ三个字段值要作为基准参考值进行保存,用来与之后取得的字段值进行比较分析,从而得到一致性时间点。每轮查询结束需要及时更新作为参考标准的字段值。另有一个数组记录两个CPHBT周期内CPODT字段数值的变化情况,数组第一位记录两CPHBT周期前的CPODT值得,最后一位记录本次查询得到的CPODT值。此数组用来对比当前的CPODT值与两个CPHBT周期前的CPODT值相比是否有变化,从而确定两个CPHBT周期内数据库是否有写入数据,如两个CPHBT周期内数据库没有数据写入,表明数据库处于一致性状态。
步骤3、查询得到的以上三个字段值,首先需要分析的是CPHBT字段。每次查询得到CPHBT字段值要与上次查询时存储的作为基准值的CPHBT值得相比较,看其是否变化。
CPHBT(Check Point Heart Beat Time)作为一个Oracle内部数据,其作用是标识数据库的检查点事件周期,同一检查点周期也是同一个数据写周期,在同一检查点周期内,由于数据的写状态无法查询,故只有通过对两个或两个以上数据写周期时间后数据库参数的变化进行比较,才能够判断数据库是否处于一致性状态。
如果本次查询得到的CPHBT值与上次查询记录的值相同,说明数据库仍然在一个数据写周期,无法判断其一致性,需要等待适当时间后进入进行下一查询周期。另外,需要使用本次CPHBT对应的CPODT值更新步骤2中所述的记录CPODT变化数组,以作下次数据分析所用。
步骤4、如果查询到的CPHBT值与上次记录值不同,说明数据库已进入另一数据写磁盘周期,此时数据库有可能处于一致性状态,需要对本次查询得到的其它数据分别进行分析来进行判断,进入步骤5。
步骤5、如果CPHBT值有变化,则需分析此次得到的字段CPODR_SEQ。所得CPODR_SEQ值与上次查询进行比较,查看其是否变化。检查点事件写入日志文件的最后一个RBA(On Disk Redo Byte Address)的日志序列号,On Disk RBA就是LGWR(Log Writer)的写进度,LGWR写日志文件的最末位置的地址(没有写进日志文件的日志会被丢弃),也就是写到磁盘上的日志的截止点。
如果CPODR_SEQ值变化,说明则此时数据库处于一致性状态,记录此CPODR_SEQ对应的CPODT时间点,并更新作为参考的三个数值为当前查询到的数值以备下次查询使用,同时还需更新记录两个CPHBT周期内的CPODT时间数组。之后本次捕获一致性点周期结束,等待适当时间后进入进行下一查询周期。
若本次查询CPODR_SEQ值与上次记录值无变化,则需进入步骤6进行对其它数据的分析。
步骤6、如果CPODR_SEQ字段数值无变化,继续检查CPODT数值的变化情况。CPODT记录的是Redo Log On Disk Rba的时间,在有数据写入Oracle数据库时,CPODT会每三秒变化一次(无论是实际的用户数据还是数据库本身的运行数据均会导致此数据值的变化)。在一个事务发生时,为了减少磁盘IO压力,数据库会连续地将数据写入磁盘,中间并不间断。如果连续两个心跳周期其值没有变化,表明最近一次事务更改的数据已全部写入数据库,并且没有新的事务产生,此时数据库处于数据一致性状态。
本步骤运行要首先检测本次取得的CPODT与上次捕获一致性点取得的CPODT是否相同,如果两值相同,说明数据库此时与上次查询时一致性状态相同,无需捕获此次时间点,需要等待适当时间后进入进行下一查询周期。同时CPODT数组需要更新记录本次查询到两个CPHBT前的CPODT时间,作为之后的数据分析所用。
步骤7、如果CPODT与两个心跳周期前记录的数据相比较无变化,且不等同于上一次一致性点时的CPODT,说明上一次事务的数据写入工作结束。而较长时间没有数据写入磁盘,表明数据库在此段时间内没有新的事务产生。此时查询得到的CPODT时间点为一致性点。同时需更新作为参考的三个数值为当前查询到的数值以备下次查询使用,同时还需更新记录两个CPHBT周期内的CPODT时间数组。之后本次捕获一致性点周期结束,等待适当时间后进入进行下一查询周期。
以上处理步骤是本发明捕获Oracle数据库一致性点的全部过程,当数据库宕机等事件发生,需要对数据库恢复操作时,对照捕获到的一致性时间点对数据库进行数据恢复,数据库启动后其处于一致性状态。
本方法可以在Oracle数据库相应事务结束后秒级时间内确定事务的一致性时间点。从而使数据库需要进行恢复操作时,可以依据时间点信息恢复到距当前时间最近的事务一致性点。如下表(捕获的一致性点实例)所示,右侧所列每一个被捕获的时间点处,Oracle数据库均处于一致性状态。
数据库主机IP |
捕获的一致性时间点 |
192.168.1.244 |
2013-07-0114:27:26 |
192.168.1.244 |
2013-07-0114:28:20 |
192.168.1.244 |
2013-07-0114:29:03 |
192.168.1.244 |
2013-07-0114:29:41 |
192.168.1.244 |
2013-07-0114:30:20 |
192.168.1.244 |
2013-07-0114:31:03 |
192.168.1.244 |
2013-07-0114:32:03 |
192.168.1.244 |
2013-07-0114:32:41 |
192.168.1.244 |
2013-07-0114:33:24 |
另外,由于本方法采用分析数据库内部表方法捕获数据库一致性点,因此,本方法适用于8.0版本(由于本方法涉及Oracle增量检查点信息,而Oracle从8i开始引入了增量检查点的概念)以上的所有Oracle数据库,并支持windows,linux,unix等多操作平台下应用。
需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明包括并不限于具体实施方式中所述的实施例,凡是由本领域技术人员根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。