一种关系数据库前映像的附加日志解析方法转让专利

申请号 : CN201710622151.4

文献号 : CN107436938B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 聂庆节杨华飞刘嘉华刘军刘赛周忠冉张磊马悦皎缪骞云周建华崔林

申请人 : 国家电网公司南京南瑞集团公司南京南瑞信息通信科技有限公司国网江苏省电力公司电力科学研究院

摘要 :

本发明公开一种关系数据库前映像的附加日志解析方法:(1)获取数据库版本信息、解析前映像的change第四块中的KDO数据,提取其中的操作码;(2)根据不同的操作码采用不同的解析方式,获取附加日志数据块编号;(3)根据附加日志结构,获取附加日志内部的主键列数据;(4)将获取的主键列数据依次添加到改变列数据中。本发明可以依据主键精确定位变化数据的行号,同时不会影响数据库自身性能。

权利要求 :

1.一种关系数据库前映像的附加日志解析方法,其特征在于,包括以下步骤:(1)获取数据库版本信息,根据KDO公共结构解析change第四块中的KDO数据,提取其中的操作码;

(2)针对不同的操作码采用不同的解析方式,获取附加日志开始change数据块编号;具体如下:如果操作码为OP_ROW_INSERT,则根据OP_ROW_INSERT后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,判断opUndoSec.OpMajor==

0x05&&opUndoSec.OpMinor==0x01是否为真,如果为真,则附加日志开始change数据块编号index=6+opKdo.cc,否则附加日志开始change数据块编号index=5+opKdo.cc;

如果操作码为OP_ROW_UPDATE,则根据OP_ROW_UPDATE后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,每两位代表一个列值,从第5块数据中获取改变的列编号,每两位一个,返回改变列号list,从change第6块数据开始,根据kdo.nchanged,逐个解析,获得列数据,columnid与改变列号list对应,如果opKdo.opcode()&0x40)!=0成立,则附加日志开始change数据块编号index=opKdo.nchanged+7,否则附加日志开始change数据块编号index=opKdo.nchanged+6;

如果操作码为OP_ROW_DELETE,则表示无剩余KDO数据,附加日志开始change数据块编号index=5;

(3)根据附加日志结构,获取附加日志内部的主键列数据;

(4)将获取的主键列数据依次添加到改变列数据列表中。

2.根据权利要求1所述的关系数据库前映像的附加日志解析方法,其特征在于,步骤(1)中change第四块中的KDO数据结构如下:标识Bdba所占字节区间为[0,3];

标识hdba所占字节区间为[4,7];

标识Maxfr所占字节区间为[8,9];

标识opcode所占字节区间为第10字节;

标识Xtype所占字节区间为第11个字节;

标识itli所占字节区间为第12字节;

标识Ispac所占字节区间为第13字节。

3.根据权利要求1所述的关系数据库前映像的附加日志解析方法,其特征在于,步骤(2)中获取附加日志开始change数据块编号的具体方法为:根据不同的DML操作码确定后续KDO内部数据结构;

根据KDO内部结构,获取附加日志开始change数据块编号。

4.根据权利要求1所述的关系数据库前映像的附加日志解析方法,其特征在于,OP_ROW_INSERT操作码对应的后续KDO数据结构为:标识flag所占字节区间为第16字节;

标识lb所占字节区间为第17字节;

标识cc所占字节区间为第18字节;

标识cki所占字节区间为第19字节;

标识hrid所占字节区间为[20,23];

标识hridMinor所占字节区间为[24,25];

标识nrid所占区间为[28,31];

标识nridMinor所占字节区间为[32,33];

标识size所占字节区间为[40,41];

标识slot所占字节区间为[42,43];

标识tabn所占字节为第44个字节。

5.根据权利要求1所述的关系数据库前映像的附加日志解析方法,其特征在于,OP_ROW_UPDATE操作码对应的后续KDO数据结构为:标识flag所占字节区间为第16字节;

标识lock所占字节为第17字;

标识ckix所占字节为第18个字节;

标识tabn所占字节为第19字节;

标识slot所占字节区间为[20,21];

标识ncol所占字节区间为第22个字节;

标识nchanged所占区间为第23个字节;

标识size所占区间为[24,25]。

6.根据权利要求1所述的关系数据库前映像的附加日志解析方法,其特征在于,步骤(3)获取附加日志内部的主键列数据的具体方法如下:将附加日志结构为标识flag的值赋给数据块记录的flag标记,从change的附加日志开始位置后移一个数据块,读取主键的列id,得到列号索引,从change的第附加日志开始位置index+3块数据开始,逐个解析附加日志结构里的totalCols数据,获得主键列数据。

7.根据权利要求6所述的关系数据库前映像的附加日志解析方法,其特征在于,附加日志结构为:标识flag所占字节区间第1个字节;

标识totalCols所占字节区间为[2,3];

标识objv所占字节区间为[4,5];

标识startColumn所占字节区间为[6,7];

标识startColumn所占字节区间为[8,9]。

说明书 :

一种关系数据库前映像的附加日志解析方法

技术领域

[0001] 本发明涉及一种关系数据库前映像的附加日志解析方法,属于数据库数据复制技术领域。

背景技术

[0002] 随着信息技术的深入发展,应用系统的不断升级,系统之间的集成贯通越来越多的需要数据交互,数据抽取已经逐步成为了信息系统融合的关键部分。然而,所有针对数据的抽取与交互都包含着一个基本的假设——数据的可用性和可靠性。数据库附件日志解析技术作为确定数据变化的关键,其数据的可用性和与可靠性自然备受关注。数据库前映像附件日志解析技术正是在这种要求下产生的。
[0003] 国内外关系型数据库日志挖掘技术分为两种类型,一种是基于逻辑级日志抽取技术、一种是基于物理级Redo抽取技术。数据库日志抽取技术在信息系统集成交互领域应用广泛,主要使用的是基于逻辑级日志抽取技术,该抽取技术的前提需要快速实现对附加日志的解析确定变化行的主键信息,传统的附加日志解析方法多数采用数据库自带插件实现,会对数据库自身性能产生影响,不能较好的解决数据库日志抽取效率问题,并且对生产库影响较大。

发明内容

[0004] 本发明的目的是克服现有技术中的不足,提供一种关系数据库前映像的附加日志解析方法,解决现有技术中附加日志解析方法采用自带插件实现,对数据库自身存在影响,数据库日志抽取效率低的技术问题。
[0005] 为解决上述技术问题,本发明所采用的技术方案是:一种关系数据库前映像的附加日志解析方法,包括以下步骤:
[0006] (1)获取数据库版本信息,根据KDO公共结构解析change第四块中的KDO数据,提取其中的操作码;
[0007] (2)针对不同的操作码采用不同的解析方式,获取附加日志数据块编号;
[0008] (3)根据附加日志结构,获取附加日志内部的主键列数据;
[0009] (4)将获取的主键列数据依次添加到改变列数据列表中。
[0010] 步骤(1)中change第四块中的KDO数据结构如下:
[0011] 标识Bdba所占字节区间为[0,3];
[0012] 标识hdba所占字节区间为[4,7];
[0013] 标识Maxfr所占字节区间为[8,9];
[0014] 标识opcode所占字节区间为第10字节;
[0015] 标识Xtype所占字节区间为第11个字节;
[0016] 标识itli所占字节区间为第12字节;
[0017] 标识Ispac所占字节区间为第13字节。
[0018] 步骤(2)中针对不同的操作码采用不同的解析方式,具体如下:
[0019] 如果操作码为OP_ROW_INSERT,则根据OP_ROW_INSERT后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,判断opUndoSec.OpMajor==0x05&&opUndoSec.OpMinor==0x01是否为真,如果为真,则附加日志开始change数据块编号index=6+opKdo.cc,否则附加日志开始change数据块编号index=5+opKdo.cc;
[0020] 如果操作码为OP_ROW_UPDATE,则根据OP_ROW_UPDATE后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,每两位代表一个列值,从第5块数据中获取改变的列编号,每两位一个,返回改变列号list,从change第6块数据开始,根据kdo.nchanged,逐个解析,获得列数据,columnid与改变列号list对应,如果opKdo.opcode()&0x40)!=0成立,则附加日志开始change数据块编号index=opKdo.nchanged+7,否则附加日志开始change数据块编号index=opKdo.nchanged+6;
[0021] 如果操作码为OP_ROW_DELETE,则表示无剩余Kdo数据,附加日志开始change数据块编号index=5。
[0022] 步骤(2)中获取附加日志开始change数据块编号的具体方法为:
[0023] 根据不同的DML操作码确定后续KDO内部数据结构;
[0024] 根据KDO内部结构,获取附加日志开始change数据块编号。
[0025] OP_ROW_INSERT操作码对应的后续KDO数据结构为:
[0026] 标识flag所占字节区间为第16字节;
[0027] 标识lb所占字节区间为第17字节;
[0028] 标识cc所占字节区间为第18字节;
[0029] 标识cki所占字节区间为第19字节;
[0030] 标识hrid所占字节区间为[20,23];
[0031] 标识hridMinor所占字节区间为[24,25];
[0032] 标识nrid所占区间为[28,31];
[0033] 标识nridMinor所占字节区间为[32,33];
[0034] 标识size所占字节区间为[40,41];
[0035] 标识slot所占字节区间为[42,43];
[0036] 标识tabn所占字节为第44个字节。
[0037] OP_ROW_UPDATE操作码对应的后续KDO数据结构为:
[0038] 标识flag所占字节区间为第16字节;
[0039] 标识lock所占字节为第17字;
[0040] 标识ckix所占字节为第18个字节;
[0041] 标识tabn所占字节为第19字节;
[0042] 标识slot所占字节区间为[20,21];
[0043] 标识ncol所占字节区间为第22个字节;
[0044] 标识nchanged所占区间为第23个字节;
[0045] 标识size所占区间为[24,25]。
[0046] 步骤(3)获取附加日志内部的主键列数据的具体方法如下:
[0047] 将附加日志结构为标识flag的值赋给数据块记录的flag标记,从change的附加日志开始位置后移一个数据块,读取主键的列id,得到列号索引,从change的第附加日志开始位置index+3块数据开始,逐个解析附加日志结构里的totalCols数据,获得主键列数据。
[0048] 附加日志结构为:
[0049] 标识flag所占字节区间第1个字节;
[0050] 标识totalCols所占字节区间为[2,3];
[0051] 标识objv所占字节区间为[4,5];
[0052] 标识startColumn所占字节区间为[6,7];
[0053] 标识startColumn所占字节区间为[8,9]。
[0054] 与现有技术相比,本发明所产生的有益效果是:
[0055] 一种适用于oracle9i、oracle10g、oracle11g、oracle12c的附加日志解析方法,通过对Oracle数据库在文件系统格式下、裸设备下以及对基于数据库特殊卷管理器格式下的前映像日志数据的分析与定位,在日志变化的第一时间抽取日志变化数据,实现数据库附加日志的主键数据提取,依据主键精确定位变化数据的行号,同时不会影响数据库自身性能,对确保数据库的安全稳定的运行,具有重要的实际意义。

附图说明

[0056] 图1是本发明基于前映像的附加日志解析方法流程图;
[0057] 图2是基于逻辑级的数据库日志抽取的架构图。

具体实施方式

[0058] 为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体实施方式,进一步阐述本发明。
[0059] 如图1所示,一种关系数据库前映像的附加日志解析方法,包括以下步骤:
[0060] (1)获取数据库版本信息,根据KDO公共结构解析change第四块中的KDO数据,提取其中的操作码;
[0061] change第四块中的KDO数据结构如下:
[0062] 标识Bdba所占字节区间为[0,3];
[0063] 标识hdba所占字节区间为[4,7];
[0064] 标识Maxfr所占字节区间为[8,9];
[0065] 标识opcode所占字节区间为第10字节;
[0066] 标识Xtype所占字节区间为第11个字节;
[0067] 标识itli所占字节区间为第12字节;
[0068] 标识Ispac所占字节区间为第13字节。
[0069] (2)针对不同的操作码采用不同的解析方式,获取附加日志数据块编号;
[0070] 针对不同的操作码采用不同的解析方式,具体如下:
[0071] 如果操作码为OP_ROW_INSERT,则根据OP_ROW_INSERT后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,判断opUndoSec.OpMajor==0x05&&opUndoSec.OpMinor==0x01是否为真,如果为真,则附加日志开始change数据块编号index=6+opKdo.cc,否则附加日志开始change数据块编号index=5+opKdo.cc;
[0072] 如果操作码为OP_ROW_UPDATE,则根据OP_ROW_UPDATE后续的KDO结构解析change第4块中余下KDO数据,从第5块开始根据改变列数量读取各列的值,每两位代表一个列值,从第5块数据中获取改变的列编号,每两位一个,返回改变列号list,从change第6块数据开始,根据kdo.nchanged,逐个解析,获得列数据,columnid与改变列号list对应,如果opKdo.opcode()&0x40)!=0成立,则附加日志开始change数据块编号index=opKdo.nchanged+7,否则附加日志开始change数据块编号index=opKdo.nchanged+6;
[0073] 如果操作码为OP_ROW_DELETE,则表示无剩余Kdo数据,附加日志开始change数据块编号index=5。
[0074] 获取附加日志开始change数据块编号的具体方法为:
[0075] 根据不同的DML操作码确定后续KDO内部数据结构;
[0076] 根据KDO内部结构,获取附加日志开始change数据块编号。
[0077] OP_ROW_INSERT操作码对应的后续KDO数据结构为:
[0078] 标识flag所占字节区间为第16字节;
[0079] 标识lb所占字节区间为第17字节;
[0080] 标识cc所占字节区间为第18字节;
[0081] 标识cki所占字节区间为第19字节;
[0082] 标识hrid所占字节区间为[20,23];
[0083] 标识hridMinor所占字节区间为[24,25];
[0084] 标识nrid所占区间为[28,31];
[0085] 标识nridMinor所占字节区间为[32,33];
[0086] 标识size所占字节区间为[40,41];
[0087] 标识slot所占字节区间为[42,43];
[0088] 标识tabn所占字节为第44个字节。
[0089] OP_ROW_UPDATE操作码对应的后续KDO数据结构为:
[0090] 标识flag所占字节区间为第16字节;
[0091] 标识lock所占字节为第17字;
[0092] 标识ckix所占字节为第18个字节;
[0093] 标识tabn所占字节为第19字节;
[0094] 标识slot所占字节区间为[20,21];
[0095] 标识ncol所占字节区间为第22个字节;
[0096] 标识nchanged所占区间为第23个字节;
[0097] 标识size所占区间为[24,25]。
[0098] (3)根据附加日志结构,获取附加日志内部的主键列数据;
[0099] 附加日志结构为:
[0100] 标识flag所占字节区间第1个字节;
[0101] 标识totalCols所占字节区间为[2,3];
[0102] 标识objv所占字节区间为[4,5];
[0103] 标识startColumn所占字节区间为[6,7];
[0104] 标识startColumn所占字节区间为[8,9]。
[0105] 获取附加日志内部的主键列数据的具体方法如下:
[0106] 将附加日志结构为标识flag的值赋给数据块记录的flag标记,从change的附加日志开始位置后移一个数据块,读取主键的列id,得到列号索引,从change的第附加日志开始位置index+3块数据开始,逐个解析附加日志结构里的totalCols数据,获得主键列数据。
[0107] (4)将获取的主键列数据依次添加到改变列数据列表中。
[0108] 如图2所示,通过对Oracle数据库在文件系统格式下、裸设备下以及对基于数据库特殊卷管理器格式下的Redo日志的分析与定位,在数据库日志变化的第一时间抽取日志变化数据,生成变化日志数据集合,为后续数据格式转换、日志入库提供基础。通过该方法不但可以精确的抽取出变化数据,还能降低数据库日志抽取对生产库的性能影响,对于确保信息灾备系统安全稳定运行具有重要的实际意义。
[0109] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。