基于Oracle日志分析技术的数据库消息服务


1        概述

1.1      问题的提出

现在很多应用都是将数据存储在数据库中,并不断从数据库中读出数据并加以处理。在业务处理中,应用经常被分为两种类型:数据消费者应用(简称“生产者”或“生产者应用”)、数据生产者应用(简称“消费者”或“消费者应用”),消费者是以往数据库中写数据为主的应用,而生产者是从数据库中读取数据的应用。在传统的设计模式、开发模式中,消费者都是通过对数据库的不断轮询来获取数据库数据的,这种设计模式功能上能满足应用的需求,但从资源使用与效率上却消耗太大而且效率不高,因为:应用查询一次数据库需要建立数据库连接、占用数据库的SQL缓冲、内存缓冲以及数据库的CPU时间片,并且还占用网络带宽;如果数据量比较大且应用没有做增量获取数据的处理,那么每轮询一次并把最新的数据结果集读取到应用中所需要消耗的时间是很长的;随着生产者、消费者越来越多、越来越复杂,这种通过轮询来获取最新数据的方法在资源消耗、效率上的表现将越来越不如意。

1.2      解决方案概述

为了解决上述问题,本文提出基于日志分析技术的数据库消息服务,它是通过对Oracle日志文件的监控与分析以从数据库外部的方式获取Oracle数据库的变化事件,包括Oracle数据库管理系统中DDL、DML等SQL操作,并能够按照应用预先定制的格式与数据内容将捕获的事件内容转化为消息中间所认识的消息,继而通过消息中间件发送给订阅了该消息的相关消费者应用。

关心数据库变化的消费者应用通过该系统可以实时的获取变更信息,避免了对数据库的重复连接与轮询,在提高了实时性的同时减少了数据库资源占用量。

基于日志分析技术的数据库消息服务特别适合于那些对实时反应能力要求比较高而且且数据库变化事件发生随机性大的场合;而且它也提供了一种应用之间松耦合的高效通信方式,方便分布式软件的开发,即,消息生产者应用可以在消息消费者应用不在线的情况下,对数据库进行操作,且操作的结果消息将保留在消息中间件,而消息消费者应用可以在消息生产者不在线的情况下,从消息中间件中读取消息。

2        数据库变化信息捕获技术研究与初步比较

学者们一直致力于解决数据库变化捕获的问题,到目前为止,已经出现了多种捕获数据库变化事件的技术,其中,由于Oracle数据库使用最广泛,因此,对Oracle数据库变化事件的捕获方法是最多、最全面的,这些技术中包括:数据库轮询技术、数据库触发器技术、基于程序控制逻辑的数据变化技术、基于LogMiner的Oracle日志捕获技术。下面对这几种技术分别进行介绍,最后,对将这些技术与本文介绍的日志监控与分析技术进行比较。

2.1      数据库轮询技术

在开篇提出的问题中,对对这种数据库变化的捕获方法进行了介绍,并指出了其局限性与缺点,即:消耗资源太多、效率比较低。

2.2      数据库触发器技术

数据库触发器技术[1]是通过为感兴趣的数据建立触发器,在数据有变化时,数据库管理系统会根据数据库操作的类型(Insert/Update/Delete)而激活相应的触发器,从而在触发器代码中我们可以添加我们对数据库变化事件的处理代码。该技术的使用比较简单,在目前应用中使用比较普遍。

这种方法具有反应快、效率高的优势。它同样具有数据库轮询技术占用资源高的缺点,因为如果消费者应用很多且关注的数据源不一样,那么就需要为每一个表都建立Insert、Update、delete三个触发器,如果该数据库中有1000个消费者应用关心的表,就需要建立3000个触发器,那么一旦数据生产者对数据库操作很频繁,那么这将极大的占用数据库的内存、CPU资源,从而导致数据库服务器运行的性能降低。

从触发器的内部机理来分析,该技术是建立在数据库内部的捕获技术,因此消息的捕获都是由数据库内部进程通过回调机制来实现的,故它将比较占用数据库的资源。

2.3      基于程序控制逻辑的数据变化技术

基于程序控制逻辑的数据变化技术是通过为需要跟踪的多个表建立一个跟踪表来记录其变化情况,跟踪表的结构比较简单,主要是记录变化的表名、操作类型等轻量级的数据,而跟踪程序,即数据库事件捕获程序对跟踪表进行轮询,比如著名的数据库同步产品Data Mirror的早期版本就是通过该技术来捕获数据库变化的。

由此可见,该技术是绕过数据库管理系统的内部功能来实现数据捕获,其优势是比较节省数据库资源,虽然它也是一种轮询技术,但比普通的数据库轮询技术更加节省资源,因为它查询的不是整个数据表,而是记录数据变化的“跟踪表”。该技术的缺点是,作为一种轮询技术,同样需要占用CPU的时间片资源,同时,如果数据生产者对数据库的操作很频繁,由于需要对跟踪表进行写入、读取操作,将导致效率比较低的问题。

2.4      基于LogMiner的Oracle日志捕获技术

LogMiner[2]是Oracle公司从产品8.0以后提供的一个有用的分析工具,使用该工具可以轻松获得Oracle重作日志文件中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。该工具特别适用于调试、审计或者回退某个特定的事务。 目前很多应用都通过LogMiner来获得数据库的变化事件。

与前面几种技术相比,LogMiner的优势是它从数据库的外部日志来捕获数据库变化信息,因此,不占用数据库与系统的资源。

LogMiner的缺点是,它首先需要把Oracle的数据字典导出到一个文件中,比较适合于数据字典不再变化的应用,如果数据字典变化了,那么需要重新执行LogMiner的配置流程;同时,它对应用提供的接口是PL/SQL接口,不适合应用开发工作。

2.5      日志监控与分析技术

本文所介绍的日志监控与分析技术,是通过监控Oracle的Redo日志文件以及对该文件进行手工分析,抽取出最新变化的SQL语句与数据,并为上层提供定制的访问接口,从而实现数据变化事件捕获的能力。

与上述四种方法相比,日志监控与分析技术是自身研究的技术,可以控制对外提供的访问接口,即可以提供SQL语句,也可以提供变化的数据;同时从外部对数据变化进行监控,不占用数据库的资源;并且由于分析、捕获的是变化的最新日志内容,因此,数据捕获的效率很高。通过实际的应用效果来分析,日志监控与分析技术是所有数据变化捕获技术中综合评价最好的一种技术。

3        体系结构设计与功能概述

基于日志分析技术的数据库消息服务的体系结构如下图所示。由数据生产者应用、数据消费者应用、消息中间件、数据库消息转换、日志监控与分析、数据库管理系统等组成。

其中,数据生产者应用、数据消费者应用、数据库管理系统应用系统固有的部分,而数据库消息转换、日志监控与分析是组成日志分析技术的数据库消息服务的关键部件。因此,在下面的介绍中,将重点对消息中间件、数据库消息转换、日志监控与分析两大核心功能模块进行介绍:

图1 基于日志分析技术的数据库消息服务务体系结构


3.1      消息中间件

消息中间件是实现应用程序之间松耦合通信的一种机制,它的工作机是订阅/分发或者是主动拉取机制。其中订阅/分发机制是应用程序对它感兴趣的某个消息队列进行注册、订阅,然后该应用就继续它的应用流程,当消息中间件系统产生一个该消息队列中的内容后,就能通过Windows的回调机制主动将数据推送到应用程序中。当然,消息中间件系统也提供拉取机制,即等待应用程序来读取消息。

引入消息中间件的主要目的是为了达到按需发布消息的目的,因为,不是所有的应用都需要所有消息,而是特定的应用需要接收特定的消息。

消息中间件的产品很多,有很多成熟的商用软件,比如IBM MQ Serials和Microsoft的MSMQ,也有国产软件,比如金蝶、东方通、等。在本系统中,将直接采纳中国电子科技集团第十五研究所研制的国产消息中间件。

3.2      数据库消息转换

该部件用于监听来自日志分析服务的数据库变化事件,并将数据库变化事件按照事先的订阅情况发布到消息队列中,而数据消费者可以从消息队列中实时获得最新的数据库变化的消息。它主要包括消息侦听、消息转发、消息映射管理。

3.2.1       消息侦听

该模块的主要功能是对底层日志监控与分析服务进行侦听,通过调用将该服务的回调函数,能够实时获得该服务所捕获的最新数据。

3.2.2       消息转发

该模块是对消息侦听模块所收到的消息按照预先的配置与映射,将数据变化信息转换成符合数据消费者应用所需要的格式,并将该消息按照消息中间件的消息格式进行封装,最后将该消息发送到指定的消息队列中。

3.2.3       消息映射管理

该模块的主要功能是为应用消费者提供一个配置消息的工具,消费者从数据库表中选择感兴趣的数据库表与字段集,并确定它所认识的消息内容的格式(消息转发服务将按照此格式来对消息内容进行组装),同时将为该消息确定需要发送的消息代理的名称,并维护从表到消息代理的映射关系,最后指定消息订阅的模式(实时推送/主动拉取)。

3.3      日志监控与分析

日志监控与分析模块的主要功能是对Oracle数据库的重做日志与归档日志进行监控、分析变化内容、并将变化的日志内转化成应用能理解的数据格式。它包括日志实时监控、日志内容分析与抽取两个主要模块。

3.3.1       日志实时监控

由于Oracle的重做日志与归档日志是以Windows操作系统文件的形式存在的,因此可以通过Windows提供的机制来监控这两类日志文件的变化情况。主要是通过Windows提供的API来实现文件监控:SHChangeNotifyRegister、SHChangeNotifyDeregister与SHChangeNotifyRegister。首先调用SHChangeNotifyRegister函数将本监控进程添加到系统消息通告链中,并利用SetWindowLong函数改变监控进程的缺省的消息处理函数,当接受到系统通告消息后,根据传递的参数获得系统通告的内容并启动日志分析逻辑。退出程序时调用SHChangeNotifyDeregister函数注销系统消息通告。

3.3.2       日志内容分析与抽取

该模块的主要功能是读取Oracle重做日志、归档日志文件中内容,并获取自上次读取的时间到本次读取期间的变化的数据块;然后对获取的数据块进行分析,按照事务提取出数据变化的SQL语句、数据内容,并将提取出来的数据内容通过回调函数的形式返回给感兴趣的应用(在这里是数据库消息转换模块)。

4        关键技术实现

从上述功能可见,实现本系统最主要的关键技术包括三个部分:建立从数据库到应用之间的关系流程、建立数据库表与消息代理之间的消息映射、日志分析与抽取技术。

4.1      系统运行流程

下面是基于日志分析技术的数据库消息服务的运行流程图:




图2 基于日志分析技术的数据库消息服务的流程图

在系统运行过程中,数据生产者应用通过数据库访问接口对数据库进行Insert/updagte/delete操作来修改数据库中的数据,同时Oracle数据库将往日志文件中填写操作日志;日志监控与分析模块监控到日志文件变化后,就分析与提取日志文件的内容;数据库消息转换模块将监控到的内容转换成应用预定义的内容格式并发送到消息队列中,消息中间件将消息队列中的消息发送给数据消费者应用。这样就完成了一个完整的数据库消息捕获、转发过程。

4.2      消息映射技术

本系统的消息映射关系是通过消息映射工具来建立的,在可视化界面中,不仅可以可视化创建消息中间件里的消息队列,还可以浏览所有的Oracle数据对象,并为感兴趣的数据对象选取感兴趣的字段、确定消息格式的结构、指定消息发送的目的地(确定表与消息队列的映射关系)。如下是对数据库表与消息队列的映射关系:  

表1

数据库表名

消息队列名

消息格式定义(字段值间的分隔符)

订阅方式

SCOTT.EMP

Queue_EMP

/

实时推送

从此映射关系中,我们可以看到,消费者对SCOTT.EMP这个表的变化感兴趣,这个表的变化信息将被发送到Queue_EMP这个消息队列中,而消息内容的格式是用“/”来分割每个字段值的,订阅的方式是实时推送的模式。

4.3      日志分析技术

4.3.1       数据库重做日志文件简介

日志文件是数据中数据变化的记录的汇集。日志完整记录了数据库所有活动,其中包括数据操作的历史:DML(Insert、Update、Delete)以及DDL(Create、Alter、Drop),也包含有事务的历史:Begin、Commit和 Rollback。重做日志通过把事务的所有实际操作推迟到事务提交后才进行,在事务提交后根据日志记录中对数据库数据的修改信息对数据文件进行写入,从而实现事务的原子性。所有的Oracle数据操作都要记录日志,因此,通过对重做日志的的分析与恢复,能够从Oracle的外部获得数据的变化信息。

Oracle的重做日志分为两类:联机重做日志和归档重做日志。联机重做日志是每个Oracle数据库必须有的日志,它支持着数据库的正常运作。一旦相关联的数据库发生了变更,那些记录就会被写入联机日志。联机日志由两个以上的文件组成,它们循环地记录着数据库当前的变更,当一个日志文件写满后,日志管理进程会使用另一个日志文件,直到所有的日志文件都写了一遍后,再重新写第一个文件,开始新的一轮循环。

归档重做日志记录的是变更记录的历史,联机日志记录的是当前最近的变更记录。通过合理使用这两类的日志文件,可以把Oracle数据库恢复到任何一个历史状态。在归档日志中通过日志序列号LSN(Log Sequence Number)来唯一确定每一个联机日志。

4.4     Oracle重做日志文件结构分析

由于重做日志[3]是Oracle数据库的不对外公开的技术,外界没有重做日志结构的描述,除了Oracle数据库自带的LogMiner软件包以外,也没有对重做日志访问[4]的其他软件,更没有第三方软件。但前面介绍了LogMiner的缺陷,因此对经过我们对Oracle重做日志运行机制、Oracle日志转储、Oracle重做日志文件的长期分析,我们总结出了Oracle重做日志文件的结构组成。

4.4.1       重做日志文件结构初步

表2是Oracle重做日志文件的物理块、逻辑块的初步结构:

表2

物理块号

第0块

第1块

第2块

第3块

第4块

第5块

第6块

第M块

逻辑块号

第0块

第1块

第2块

第3块

第4块

第N-2块

存储内容

文件头

重做记录头

重做记录块1

重做记录块2

重做记录块3

重做记录块N

从表2中,我们可以把Oracle逻辑与物理文件块组成:

1)        物理块:重做日志从物理上,是按照512字节为一块的。对于内容比较少的SQL操作,可以将一个SQL操作放在一块中来记录。但对于对于包含varchar(4000)或者BLOB或者CLOB类型的SQL日志,512字节则容纳不下,因此需要对这些块进行扩充,这就引出了逻辑块的概念。

2)        逻辑块:Oracle是以逻辑块的形式对日志进行管理的,每个逻辑块每个块大小最小为512字节,或者512字节的整数倍。

3)        文件头:日志文件的第一、第二个物理块为文件头;

4)        文件体:除前两块以外的文件的其他部分

5)        逻辑块头:从第二块(即重做日志头)起,每块都有一个20字节的块头,块头由REDOLOG顺序号sequence,块号blocknumber,块更新时间write time,第一个redo记录的位置offset,以及校验和check sum组成,块头含有redo记录的redo块地址。

6)        逻辑块内容:记录包含ORACLE数据库的事务信息和物理操作信息。

  • 1
  • 2
  • 下一页

相关内容