Streams捕获进程

Streams捕获进程 

重做日志与捕获进程
 

每个Oracle数据库都包含至少两个重做日志文件,这些文件被共同称为数据库重做日志。重做日志的主要用途是用来记录数据库产生的所有变更。 
当人为或硬件原因导致数据出错时,重做日志能确保数据恢复到之前的状态。捕获进程是Oracle的可选后台组件之一,扫描重做日志以捕获对数据库进行的DML和DDL操作,该重做日志所在的数据库称为源数据库。 

LCRs(Logical Change Records,逻辑变更记录)  
捕获进程从重做日志中捕获到变更事件后将其格式化为LCRs。LCR是一种用来描述数据库变更事件的特殊消息,分为两种类型:row LCRs 和 DDL LCRs。 

Row LCRs  

Row LCR 是对库表中单行记录变更的描述信息,一条DML可能同时更新多行记录,所以一条DML可能产生多条Row LCR。而对某一行的LONG,LONG RAW,或是LOB类型字段更新时,同样可能产生多条Row LCR。 
Row LCR将被包装为LCR$_ROW_RECORD类型,包含以下属性: 
 source_database_name:源数据库名称。 
 command_type:产生LCR的DML操作类型,可以是下列类型:INSERT, UPDATE, DELETE, LOB ERASE, LOB WRITE, LOB TRIM。 
 object_owner: schema名称。 
 object_name:产生LCR的Table名称。 
 tag:用以追踪LCR的RAW标签。 
 transaction_id:运行DML操作的事务标识符。 
 scn:变更记录写入重做日志时的SCN(system change number)。 
 old_values:数据更新之前的值。如果DML类型是UPDATE或DELETE,本属性值将是DML操作之前的值,如果DML类型是INSERT,本属性值为空。 
 new_values:数据更新之后的值。如果DML类型是UPDATE或INSERT,本属性值将是DML操作之后的值,如果DML类型是DELETE,本属性值为空。 

Row LCR也可包含事务控制语句,例如COMMIT,ROLLBACK。应用过程通过此功能使源数据库与目标数据库保持事务一致性。 

DDL LCRs  

DDL LCR是对DDL操作的描述信息,DDL通过CREATE,ALTER,DROP等操作改变数据库的结构。 
DDL LCR包含以下信息: 
 source_database_name:源数据库名称。 
 command_type:产生LCR的DDL操作类型,如ALTER TABLE 或CREATE INDEX。 
 object_owner:schema名称。 
 object_name:产生LCR的数据库对象名称。 
 object_type:产生LCR的数据库对象类型,如TABLE 或 PACKAGE。 
 ddl_text:DDL语句内容。 
 logon_user:执行DDL操作的数据库用户。 
 current_schema:当前使用的schema。 
 base_table_owner:基础表用户。 
 base_table_name:基础表名称。 
 tag:用以追踪LCR的标签。 
 transaction_id:运行DDL操作的事务标识符。 
 scn:变更记录写入重做日志时的SCN。 

捕获规则  

捕获进程根据用户定义的规则对数据库变更进行捕获。我们可以为捕获进程创建正规则集(positive rule set)和负规则集(negative rule set)。 
当数据库产生变更时,假如正规则集中的某条规则计算结果为TRUE,捕获进程将截获该条信息;若负规则集中的某条规则计算结果为TRUE,捕获进程将忽略该条信息。若捕获进程同时具有正规则集和负规则集,那么负规则集将优先进行计算。 

捕获类型  

捕获进程能捕获到以下类型字段的变更: 
_ VARCHAR2 
_ NVARCHAR2 
_ NUMBER 
_ LONG 
_ DATE 
_ BINARY_FLOAT 
_ BINARY_DOUBLE 
_ TIMESTAMP 
_ TIMESTAMP WITH TIME ZONE 
_ TIMESTAMP WITH LOCAL TIME ZONE 
_ INTERVAL YEAR TO MONTH 
_ INTERVAL DAY TO SECOND 
_ RAW 
_ LONG RAW 
_ CHAR 
_ NCHAR 
_ CLOB 
_ NCLOB 
_ BLOB 
_ UROWID 

捕获进程不能捕获到以下类型字段的变更:BFILE, ROWID, 用户自定义类型(包括object types,REFs, varrays, nested tables, 以及 Oracle-supplied types),以及经过加密的字段。当捕获进程尝试创建LCR时,若包含加密字段或是不支持的类型,将向用户抛出异常。 

实例化Streams环境  

在单个数据库或是集群环境中,源数据库是指产生消息的数据库,而接收消息的数据库被称为目标数据库。无论是捕获进程已经开始或即将开始捕获数据库变更,还是这些变更即将被本地程序接收或是传递到远程数据库,我们都应该保证这些操作对应的数据库对象已经被实例化。 
在Streams中,实例化对象有下列步骤: 
1. 在源数据库中准备好要实例化的对象。 
2. 如果在目标数据库中没有这些对象的拷贝,则根据源数据库中的对象在目标数据库中创建。我们可以利用export/import, transportable tablespaces, 或者 RMAN来拷贝对象。如果目标数据库中已经有了拷贝,则本步骤省略。 
3. 在目标数据库中设置实例化SCN(instantiation SCN)。 

有时,第一步和第三步会由系统自动完成。例如,当我们使用DBMS_STREAMS_ADM包为捕获进程在正规则集中添加规则时,第一步会自动完成。同样,当我们使用export/import 或者 transportable tablespaces将对象从源数据库拷贝到目标数据库时,第三步会自动完成。在apply process从队列中取出消息之前,即使只是将LCR发送给另外的apply handler而非自己进行操作,对象也必须实例化。 

本地捕获和远程捕获 

本地捕获
 

运行在本地源数据库的捕获进程称为本地捕获。配置本地捕获进程时,源数据库将执行以下操作: 
 运行DBMS_CAPTURE_ADM.BUILD过程以提取或创建重做日志数据字典。 
 源数据库中的Supplemental logging将附加信息写入重做日志,当apply process对消息进行处理的时候,可能会需要这些信息。 
 在捕获进程首次运行时,Oracle根据从重做日志中提取出来的数据字典,创建LogMiner数据字典,LogMiner是从主数据字典里分离出来的子集。其他的捕获进程可以共用该LogMiner数据字典,也可以自行创建。 
 捕获进程通过LogMiner来扫描重做日志。 
 规则引擎根据规则集中的规则来确定捕获何种数据库变更事件。 
 捕获进程将满足规则定义的变更截获并放入本地ANYDATA队列中。 
 若有多个数据库共享该条消息,那么将有多个Propagation将这条消息从源数据库传递到各个目标数据库。 

本地捕获的优点  

本地捕获的优点如下: 
 配置和管理较为容易。使用本地捕获,不需要将重做日志拷贝到远程数据库,直接在本地进行管理。 
 本地捕获进程能在数据库变更写入重做日志存档文件(archived redo log file)之前扫描联机日志。如果使用远程捕获,需要在变更写入重做日志存档文件之后将其拷贝到远程数据库,有时甚至需要拷贝重做日志文件(redo log files)。 
 由于不用将整个重做日志文件拷贝到远程数据库,所以减少了通过网络传递的数据量。即使是在传递已截获的消息时,我们也可以根据传递规则选取必要的消息进行传递。 
 由于只有本地源数据库能访问重做日志,所以提高了系统安全性。举例来说:假设我们只想捕获schema hr中的变更,只有源数据库有权限扫描重做日志,截获hr中的变更并将其放入队列;但如果使用远程捕获,由于需要拷贝重做日志文件到目标数据库,所以实际上捕获的不仅仅是hr中的变更,而是整个数据库的变更。 
 如果消息捕获和消息处理都在同一个数据库中,那么配置将会相对简单,查询和计算所需的资源也相对较少。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值