下游Streams捕获
一般来说,捕获是在源数据库中具体数据库变更产生的地方被配置和抽取的。然而,出于性能和管理方面的原因,捕获过程也可以被配置在中间数据库运行,这种情况不同于源数据库具体变更发生的地点。中间数据库充当了捕获过程的主要场所。这种捕获配置被称为是下游Streams捕获。它的特点在发布的10g数据库文档中有详细的描述。
在下游Streams捕获方法中,来自源数据库的存档修改日志文档被复制到下游Streams数据库中。捕获过程捕获了在下游Streams数据库中文档的变更。存档修改日志文档可以通过各种方法被复制到下游Streams数据库中。包括日志传输服务,dbms_file_transfer
包,文档传输协议(FTP),或是其他的方法。
在本地捕获和下游Streams方法之间有一个很明显的区别。在本地捕获方法中,捕获阅读重做日志,有时也可能会阅读归档日志。在下游Streams捕获中,捕获过程经常阅读的是归档日志。这是因为重做日志被归档以后可以从源数据库复制到中间数据库。在这种情况下,复制过程就必然会有一定的延迟时间。
为什么采用下游Streams捕获
下游Streams捕获是一种很有用的方法因为捕获过程是在目的数据库发生的。在源数据库的过程活动和内存资源等多余资源没有任何应用。在源数据库中采用这种方式没有任何系统开销。整个捕获和列队活动都在下游Streams数据库中进行。
如果在捕获过程中参与了多源数据库,对于多源数据库资源的捕获过程将被集中到一个单独的数据库中,这是为了方便管理。而且由于捕获进程和应用进程都发生在一个机器上,所以传播进程看起来就有点多余了。对下游Streams数据库复制重做日志成为了必不可少的一步,为防止信息丢失它又提供了改进的保护措施,而且在下游Streams数据库的重做日志在某些情况下可能会被用于源数据库的恢复。
下游Streams捕获缺点
然而,使用下游Streams捕获也并不是没有任何缺点。因为下游Streams捕获过程需要等待重做日志和日志转换而随后的从源数据库到下游Streams数据归档日志的复制,这使得在捕获数据库更改的过程中有不可避免的延迟。另外,如果网络或其它原因归档日志不能及时传输到目的数据库则在源数据库端要提供足够的空间用于保留日志。
下游Streams捕获配置
操作需求
源数据库至少需要Oracle10G版本。同时,下游Streams捕获数据库应该与源数据库保持相同的版本。
在源数据库端和下游Streams数据库端的操作系统必须是一样的,但是操作系统的版本可以是不同的。例如,一个32-bit的操作系统用在源数据库的主机上,相同的32-bit操作系统必须也支持下游Streams数据库主机。其他的硬件元素,例如像CPU型号,内存类型,存储配置,可以在源数据库和下游Streams数据库中是不同的。
数据库链接
当配置下游Streams数据库时,可以给它配置一个与源数据库的链接。虽然建立在源数据库和下游Streams数据库之间的链接是可选的,仅建立一个链接还是有很多优势的。数据库链接的名字和源数据库的全局名字是相符的。
这样的一个数据库链接简化了下游Streams捕获过程的创建和管理。当creat_captuer或者alter_capture在下游Streams捕获过程中运行时,DBA可以通过数据库链接建立use_database_link参数详细描述下游Streams捕获过程。
当针对源数据库的链接存在时,具体的管理活动就会自动体现。如果没有数据库链接,有些活动就需要通过手动完成。
但在我看来:数据库链接绝对是多余的,一切工作都可以由EM来完成!
现在列一个例子给大家看看下游捕获是多么的简单!
修改参数传输日志到目的数据库:
这样一个下游复制的流就建立好了!
在源库上:
SQL> select dbms_flashback.get_system_change_number() from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
-----------------------------------------
8331188817820
$> expdp sgreports/sgreports tables=sgreports.test2 directory=expdir logfile=test2.log dumpfile=test2.dmp flashback_scn=8331188817820
在目的库上:
create directory impdir as '/oracle/ora_backup';
impdp system/sys directory=impdir dumpfile=test2.dmp logfile=test2.log
connect strmadmin/strmadmin@stream1 BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'sgreports.test2', streams_type => 'capture', streams_name => 'capture_stream1', queue_name => 'capture_stream1_queue', include_dml => true, source_database=>'henry.sun.net', include_ddl => true, inclusion_rule => true); END; /BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_RULES
(table_name => 'sgreports.test2',
streams_type => 'apply',
streams_name => 'apply_stream11',
queue_name => 'capture_stream1_queue',
include_dml => true,
include_ddl => true,
source_database => 'henry.sun.net',
inclusion_rule => true);
END;
/这样一个下游复制的流就建立好了!