本发明涉及Oracle数据库领域,尤指Oracle数据库表数据历史轨迹的保存方法及系统。
背景技术:
对于数据库表的数据操作历史轨迹保存,在实际应用中起到非常关键的作用。
Oracle GoldenGate软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。GoldenGate软件可以在异构的IT基础结构,包括几乎所有常用操作系统平台和数据库平台之间实现大量数据亚秒一级的实时复制。
Oracle GoldenGate的数据复制过程如下:
利用捕捉进程(Capture Process)在源系统端读取Online Redo Log或Archive Log,然后进行解析,只提取其中数据的变化如增、删、改操作,并将相关信息转换为Oracle GoldenGate自定义的中间格式存放在队列文件中。再利用传送进程将队列文件通过TCP/IP传送到目标系统。捕捉进程在每次读完log中的数据变化并在数据传送到目标系统后,会写检查点,记录当前完成捕捉的log位置,检查点的存在可以使捕捉进程在中止并恢复后可从检查点位置继续复制;
目标系统接受数据变化并缓存到Oracle GoldenGate队列当中,队列为一系列临时存储数据变化的文件,等待投递进程读取数据;
Oracle GoldenGate投递进程从队列中读取数据变化并创建对应的SQL语句,通过数据库的本地接口执行,提交到数据库成功后更新自己的检查点,记录已经完成复制的位置,数据的复制过程最终完成。
但目前Oracle GoldenGate不能区分同一批数据操作的先后顺序,历史轨迹表中对于同一批操作保存的是相同的时间,尤其在例如金融行业,会每隔一段时间对数据库中的数据进行批量操作,Oracle GoldenGate对于每一条记录,并不能区分操作的先后顺序,这使数据操作历史轨迹精确性下降,在查看数据操作历史轨迹或相关操作带来问题。
现在还存在着其它的数据同步软件,都可以实现类似Oracle GoldenGate软件的功能,但同样都存在着不能区分操作的先后顺序的问题。
技术实现要素:
本发明为了解决上述数据同步软件不能区分同一批数据操作的先后顺序的问题,提供一种Oracle数据库表数据历史轨迹的保存方法及系统,使历史轨迹表保存历史轨迹表每一具体记录的创建时间。
为了实现本发明以上发明目的,本发明是通过以下技术方案实现的:
一种Oracle数据库表批量操作的历史轨迹保存方法,包括步骤:
S10用户表进行批量操作;
S20通过预先配置的数据同步软件,按批量操作执行顺序,同步保存用户表操作尚未保存的一条历史轨迹数据到历史轨迹表新创建的一条记录中,其中所保存的数据包括操作类型与第一时间,所述第一时间为GoldenGate软件记录的批量操作时间;
S30读取当前系统时间为第二时间,保存第二时间到历史轨迹表中新创建的记录中;
S40判断是否还存在批量操作历史轨迹数据未保存到历史轨迹表,如果存在,则进入步骤S20,如果不存在,则完成本次批量操作的历史轨迹保存。
优选的,在S30步骤中,所述第二时间为SYSTIMESTAMP时间。
优选的,在步骤S30中,通过为历史轨迹表预先创建的触发器,读取当前系统时间为所述第二时间,保存第二时间到历史轨迹表中新创建的记录中。
优选的,数据库包括源端数据库与目标端数据库,用户表位于源端数据库,历史轨迹表位于目标端数据库。
优选的
配置数据同步软件的步骤包括:
S01添加抽取进程,抽取进程用于抽取用户表的操作数据;
S02启动抽取进程;
S03添加复制进程,复制进程用于将所抽取的数据复制到历史轨迹表;
S04启动复制进程。
本发明还提供一种Oracle数据库表批量操作的历史轨迹保存系统,包括:
操作模块,用于对用户表进行批量操作;
轨迹保存模块,用于按批量操作执行顺序,同步保存用户表操作尚未保存的一条历史轨迹数据到历史轨迹表新创建的一条记录中,其中所保存的数据包括操作类型与第一时间,所述第一时间为GoldenGate软件记录的批量操作时间;
时间保存模块,用于读取当前系统时间为第二时间,保存第二时间到历史轨迹表中新创建的记录中;
判断模块,用于判断是否还存在批量操作历史轨迹数据未保存到历史轨迹表,如果存在,则轨迹保存模块继续保存历史轨迹数据,如果不存在,则完成本次批量操作的历史轨迹保存。
优选的,时间保存模块,读取的所述第二时间为SYSTIMESTAMP时间;
优选的,时间保存模块,还包括:
触发子模块,通过为历史轨迹表预先创建触发器,读取当前系统时间为所述第二时间,时间保存模块保存第二时间到历史轨迹表中新创建的记录中。
优选的,数据库包括源端数据库与目标端数据库,用户表位于源端数据库,历史轨迹表位于目标端数据库。
优选的,还包括:
数据同步配置模块,用于配置数据同步软件,使用户表操作的历史轨迹保存到历史轨迹表。
本发明至少具有以下有益效果:
1、在每保存一条历史轨迹同时或之后,在历史轨迹表中保存当前系统时间,可以区分同一批操作中的每一具体操作的先后顺序,通过严格记录数据的操作顺序,使历史轨迹具有可读性,历史轨迹用来恢复数据时按操作顺序恢复,能够保证数据准确性;
2、保存的操作系统时间精度高,能够在计算机高速处理情况下保证区分操作的先后顺序;
3、用户表和历史轨迹表保存于不同的数据库,使数据保存安全、方便。
附图说明
下面结合附图和具体实施方式对本发明作进一步详细说明:
图1为Oracle数据库表批量操作的历史轨迹保存方法流程示意图;
图2为Oracle数据库表批量操作的历史轨迹保存系统第一实施例示意图;
图3为Oracle数据库表批量操作的历史轨迹保存系统第二实施例示意图;
图4为Oracle数据库表批量操作的历史轨迹保存方法第二实施例数据插入测试结果界面;
图5为Oracle数据库表批量操作的历史轨迹保存方法第二实施例数据更新测试结果界面;
图6为Oracle数据库表批量操作的历史轨迹保存方法第二实施例数据删除测试结果界面;
图中:
1操作模块 2轨迹保存模块
3时间保存模块 31触发子模块
4判断模块
具体实施方式
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,以下说明和附图对于本发明是示例性的,并且不应被理解为限制本发明。以下说明描述了众多具体细节以方便对本发明理解。然而,在某些实例中,熟知的或常规的细节并未说明,以满足说明书简洁的要求。
数据库中,用户表用来保存基础数据,例如,员工表、工资表等都是用户表;历史轨迹表是为了保存用户表的历史轨迹所创建的表,例如,保存员工表历史轨迹的员工历史轨迹表,保存工资表历史轨迹的工资历史轨迹表。
对于Oracle数据库通常使用数据同步软件进行操作轨迹数据复制,所复制的数据保存到历史轨迹表,但目前数据同步软不能区分批量操作时同一批数据操作的先后顺序,历史轨迹表中对于批量操作保存的是相同的操作时间,而本发明对此提供了方便的解决方案,使历史轨迹表每创建一条记录,即在该记录中保存当时系统时间,用以区分同一批操作的先后顺序。
本发明提供一种Oracle数据库表批量操作的历史轨迹保存方法,在安装有Oracle数据库及数据同步软件的操作系统下,创建用户表及历史轨迹表,通过配置数据同步软件,按批量操作执行顺序,同步保存用户表操作尚未保存的第一条历史轨迹数据到历史轨迹表新创建的第一条记录中,其中所保存的历史轨迹数据包括操作类型与第一时间,所述第一时间为GoldenGate软件记录的批量操作系统时间;
读取当前系统时间为第二时间,保存第二时间到历史轨迹表中新创建的第一条记录中;
之后按批量操作执行顺序同步保存用户表操作尚未保存的下一条历史轨迹数据到历史轨迹表新创建的下一条记录中,读取当前系统,保存到历史轨迹表中新创建的下一条记录中;
重复保存下一条历史轨迹数据到历史轨迹表中创建的下一条记录中,与保存当时系统时间到下一条记录中的动作,直至该批量操作的历史轨迹保存完成。
在每保存一条历史轨迹时,在历史轨迹表中保存当前系统时间,可以区分同一批操作中的每一具体操作的先后顺序,在大批量数据操作情况下,能够区分操作的先后顺序有着重大意义,例如银行等单位的批量操作,同一批操作的先后顺序不同,数据结果差距巨大,只有严格记录数据的操作顺序,才使历史轨迹具有可读性,历史轨迹用来恢复数据时按顺序恢复,才能保持数据准确。
本发明的具体实施例:
第一实施例:
操作系统需要安装有Oracle数据库软件及Oracle GoldenGate软件,操作系统可以是各种可以使用Oracle数据库的操作系统。
在Oracle数据库中创建用户表,表名为TESTTABLE,
创建用户表的SQL代码为:
CREATE TABLE TESTTABLE(NO NUMBER,IPHONE NUMBER);
TESTTABLE表包括:
字段NO:NUMBER数据类型,用于保存序号;
字段IPHONE:NUMBER数据类型,用于保存数值。
在Oracle数据库中创建历史轨迹表,表名为TESTTABLE_HIS,创建历史轨迹表的SQL代码为:
TESTTABLE_HIS表包括:
字段NO:NUMBER数据类型,用于保存TESTTABLE历史轨迹时记录TESTTABLE表中的NO值;
字段IPHONE:NUMBER数据类型,用于保存TESTTABLE历史轨迹时记录TESTTABLE表中的IPHONE值;
字段BEFORE_AFTER:VARCHAR2数据类型,数据长度为40,用于记录当前数据状态,即是当前记录的数据NO、IPHONE是对TESTTABLE表操作前的数据或是对TESTTABLE操作后面数据;
字段DML:VARCHAR2数据类型,数据长度为32,用于记录对表TESTTABLE的操作类型,包括:INSERT操作、UPDATE操作、DELETE操作等;
字段GOLGENGATE:VARCHAR2数据类型,数据长度为40,用于记录GOLGENGATE本身自带功能的批量操作的系统时间;
字段TRIGGERDADTE:VARCHAR2数据类型,数据长度为40,字段TRIGGERDADTE用于记录历史轨迹表每条记录创建时的系统时间;
历史轨迹表TESTTABLE_HIS每条记录创建时的系统时间可以是SYSDATE、SYSTIMESTAMP等ORACLE常见系统时间中的任意一种。
SYSDATE可以精确到秒,直接使用SYSTIMESTAMP可以精确到千分之一秒,使用SYSTIMESTAMP是较好的方案,使保存的TESTTABLE_HIS中记录的生成时间更为精确。
配置Oracle GoldenGate软件使操作用户表的历史轨迹同步保存于历史轨迹表,具体步骤为:
S01添加抽取进程,抽取进程用于抽取对于用户表的操作数据;
SQL代码为:
GETUPDATEBEFORES
NOCOMPRESSDELETES
TABLE TEST.TESTTABLE;
S02启动抽取进程;
S03添加复制进程,复制进程用于将所抽取的数据复制到历史轨迹表;
SQL代码为:
S04启动复制进程,使操作用户表TESTTABLE时的历史轨迹自动同步保存于历史轨迹表TESTTABLE_HIS。
创建历史轨迹表记录时,SQL代码:
TRIGGERDADTE VARCHAR2(40)DEFAULT SYSTIMESTAMP
按代码创建历史轨迹表记录时,默认记录创建时的系统时间保存到所创建记录的TRIGGERDADTE字段中,也可以不定义TRIGGERDADTE字段为DEFAULT SYSTIMESTAMP,记录创建完成后,再更新系统时间到所创建的记录TRIGGERDADTE字段,后写入的系统时间会比创建时同时写入的系统时间稍晚,但本发明目的在于区分操作的先后顺序,而不是需要知道操作的精确时间,所以只要每创建一条历史轨迹记录,保存当前系统时间到所创建的记录中,再创建下一条历史轨迹记录,都可以达到本发明的目的。
在本实施例中,Oracle数据库表批量操作的历史轨迹保存步骤,如图1所示,
S10用户表进行批量操作;
S20通过预先配置的Oracle GoldenGate软件,按批量操作执行顺序,同步保存用户表操作尚未保存的一条历史轨迹数据到历史轨迹表新创建的一条记录中,其中所保存的数据包括操作类型与第一时间,所述第一时间为GoldenGate软件记录的批量操作时间;
S30读取当前系统时间为第二时间,保存第二时间到历史轨迹表中新创建的记录中;
S40判断是否还存在操作历史轨迹未保存到历史轨迹表,如果存在,则进入步骤S20,如果不存在,则完成本次批量操作的历史轨迹保存。
相应的,本实施例还提供一种Oracle数据库表批量操作的历史轨迹保存系统,包括:
操作模块1,用于对用户表进行批量操作;
轨迹保存模块2,用于按批量操作执行顺序同步保存用户表操作的一条历史轨迹数据到历史轨迹表新创建的一条记录中,其中所保存的数据包括操作类型与第一时间,所述第一时间为GoldenGate软件记录的批量操作时间;
时间保存模块3,用于读取当前系统时间为第二时间,保存第二时间到历史轨迹表中新创建的记录中;
判断模块4,用于判断是否还存在批量操作历史轨迹数据未保存到历史轨迹表,如果存在,则轨迹保存模块继续保存历史轨迹数据,如果不存在,则完成本次批量操作的历史轨迹保存。
为了使保存的系统时间更精确,时间保存模块3,读取的所述第二时间为SYSTIMESTAMP时间。
第二实施例
本实施例与第一实施例基本方案相同,由于现在计算机处理能力强大,千分之一秒的精确度仍然不能完全区分TESTTABLE_HIS表中每一条记录创建的先后顺序,本实施例手工写触发器,通过触发器读取当系统时间,这种方式可以使保存到TESTTABLE_HIS表中记录中TRIGGERDADTE字段时间精确到百万分之一秒,在计算机处理能力强大情况下,仍然可以区分TESTTABLE_HIS表中每一条记录生成的先后顺序,使TESTTABLE_HIS具有更强的可读性与可用性。
触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。
ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
触发器组成:
触发事件:引起触发器被触发的事件。例如:DML语句(INSERT,UPDATE,DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
触发事件既可以是单个触发事件,也可以是多个触发事件的组合。
触发时间:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER的操作顺序。
如果指定为BEFORE,则表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;如果指定为AFTER,则表示在执行DML操作之后触发,以便记录该操作或做某些事后处理。
触发操作:即该TRIGGER被触发之后的目的和意图,正是触发器本身要做的事情,例如:PL/SQL块。
触发对象:指定触发器是创建在哪个表、视图、模式、数据库上,只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
触发类型:是语句级还是行级触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
触发条件:由WHEN子句指定一个逻辑表达式,只允许在行级触发器上指定触发条件,指定UPDATING后面的列的列表。
在本实施例中为历史轨迹表创建触发器,
SQL代码:
CREATE OR REPLACE TRIGGER TRG_TESTTABLE_HIS BEFORE INSERT OR UPDATE ON TEST.TESTTABLE_HIS FOR EACH ROW BEGIN:NEW.TRIGGERDATE:SYSTIMESTAMP;END;
BEFORE和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
在本实施例中选择BEFORE方式,在创建记录前触发,读取系统时间。
FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW选项时,BEFORE和AFTER触发器为语句触发器,而INSTEAD OF触发器则只能为行触发器。
在行触发器的PL/SQL块和WHEN子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。:NEW修饰符访问操作完成后列的值,:OLD修饰符访问操作完成前列的值。
在本实施例中,数据库表批量操作的历史轨迹保存步骤,在步骤S30中,通过为历史轨迹表预先创建的触发器,读取当前系统时间为所述第二时间,保存第二时间到历史轨迹表中新创建的记录中。
相应的,本实施例提供的Oracle数据库表批量操作的历史轨迹保存系统与第一实施例基本相同,其区别在于,
进一步地,为了使保存的系统时间更精确,时间保存模块3,还包括:
触发子模块31,通过为历史轨迹表预先创建触发器,读取当前系统时间为所述第二时间。
本实施例的测试运行效果:
用户表数据插入测试:
用户表批量插入数据的SQL代码为:
INSERT INTO TESTTABLE VALUE(1,11111);
INSERT INTO TESTTABLE VALUE(2,11112);
INSERT INTO TESTTABLE VALUE(3,11113);
INSERT INTO TESTTABLE VALUE(4,11114);
INSERT INTO TESTTABLE VALUE(5,11115);
INSERT INTO TESTTABLE VALUE(6,11116);
插入执行完成后,查询TESTTABLE_HIS,SQL代码为:
SELECT*FROM TESTTABLE_HIS;
查询结果界面截图如图4所示,保存了6条历史轨迹数据,GOLGENGATE字段的6条记录的时间完全相同,TRIGGERDADTE字段的6条记录的时间有所区别,通过GOLGENGATE字段数据可以读出批量插入操作时间,通过TRIGGERDADTE字段数据可以读出每一条记录创建时的系统时间,TRIGGERDADTE字段数据可以严格区分操作的先后顺序。
用户表数据更新测试:
用户表批量更新数据的SQL代码为:
UPDATE TESTTABLE SET IPHONE=999999;
更新执行完成后,查询TESTTABLE_HIS,SQL代码为:
SELECT*FROM TESTTABLE_HIS;
查询结果界面截图如图5所示,保存了12条历史轨迹数据,同样,对一用户表中的每一条记录的更新对应两条历史轨迹数据,分别是更新前的数据与更新后的数据,通过GOLGENGATE字段数据可以读出批量更新操作时间,通过TRIGGERDADTE字段数据可以读出历史轨迹数据创建时的系统时间,TRIGGERDADTE字段数据可以严格区分操作的先后顺序。
用户表数据删除测试:
用户表数据删除的SQL代码为:
DELETE TESTTABLE_HIS;
删除执行完成后,查询TESTTABLE_HIS,SQL代码为:
SELECT*FROM TESTTABLE_HIS;
查询结果界面截图如图6所示,保存了6条历史轨迹数据,同样,通过GOLGENGATE字段数据可以读出批量删除操作时间,通过TRIGGERDADTE字段数据可以读出历史轨迹数据创建时的系统时间,TRIGGERDADTE字段数据可以严格区分操作的先后顺序。
第三实施例
在数据库中使用过程中,会产生大量的用户数据和历史轨迹数据,一般为了方便管理,会将两部分数据存于不同的数据库服务器,存储用户数据的数据库称为源端数据库,存储历史轨迹的数据库称为目标端数据库。
本实施例与第一实施例和第二实施例基本相同,其区别在于,用户表创建于源端数据库,历史轨迹表创建于目标端数据库。
以上所述仅是本发明的优选实施方式,应当指出,其它数据同步软件也可以通过上述实施例的方法达到同样的功能,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。