streams之用dbms_streams_admin.maintain_tables..

streams之用dbms_streams_admin.maintain_tables快速创建表级复制流
源库:source
目标库:target
数据库版本:10.2.0.4
调整参数(源库/目标库)
alter system set aq_tm_processes=10 scope=both;
alter system set global_names=true scope=both; #建议但并不是必须
alter system set undo_retention=3600 scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=10 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile;  #建议但并不是必须
alter system set streams_pool_size=50M scope=spfile;
alter system set utl_file_dir='*' scope=spfile;   #建议但并不是必须
alter system set open_links=4 scope=spfile;
参数说明:
流初始化参数
 streams_pool_size
  指定流池的大小 (字节)。流池包含缓冲的队列事件。另外, 流池也可用于在流捕获和应用期间进行内部通信。此参数是可修改的。如果在某个实例运行时此参数减为零, 流进程和作业将不会运行。
 job_queue_processes
  传播由作业队列进程处理。实例中启动的作业队列进程数由此参数控制。此参数的默认值为 0。要传播消息, 必须至少将此参数设置为 2。如果有多个要从中传播消息的队列, 有多个要将消息传播到的目标, 或作业队列中存在其他作业, 则可以将此参数设置为更高的值。
 parallel_max_servers
  指定实例的最大并行执行进程数和最大并行恢复进程数。随着需求的增长, Oracle 的进程数将从实例启动时创建的值增加到此值。在流环境中, 每个捕获进程和应用进程都可以使用多个并行执行服务器。将此初始化参数设置为一个适当的值, 可以确保有足够的并行执行服务器。
 sga_target
  指定所有系统全局区 (SGA) 组件的总大小。如果此参数设置为非零值, 则流池的大小将由自动共享内存管理来管理。
 undo_retention
  指定要保留在数据库中的已提交的还原信息量 (以秒为单位)。对于运行一个或多个捕获进程的数据库, 必须设置此参数以指定适当的还原保留期。如果您正在运行一个或多个捕获进程且不确定设置是否正确, 请尝试将此参数设置为不小于 3600 的值。另外, 还需要确保还原表空间有足够的空间来容纳 UNDO_RETENTION 设置。
  建议值:undo_retention=3600
 aq_tm_processes
  在 Oracle Database 10g 之前的版本中, Oracle 流高级队列时间管理器进程由此参数控制, 必须将此参数设置为非零值才能执行队列消息时间监视, 并处理指定了延迟和失效属性的消息。尽管使用 Oracle 流高级队列或流时不再需要设置此参数, 但如果您确实指定了一个值, 那么仍将考虑该值。该值可以在 0 到 10 之间。将该值设置为 0 将禁用队列监视后台进程。但是, 建议您不要指定此参数, 从而使系统自动进行优化。
  建议值:aq_tm_processes=10
创建用户(源库/目标库)
create user strmadmin identified by strmadmin default tablespace users temporary tablespace temp;
grant connect,resource,dba,select_catalog_role,select any dictionary to strmadmin;
begin
  dbms_streams_auth.grant_admin_privilege(grantee=>'strmadmin',grant_privileges=>true);
end;
/
双方配置tns(源库/目标库)
target =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT =2521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = target)
    )
  )
 
source =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = source)
    )
  )
创建dblink,名字要和global_name一致
源库:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
source
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link target connect to strmadmin identified by strmadmin using 'target';
Database link created.
SQL> select * from dual@target;
D
-
X
目标库:
create database link source connect to strmadmin identified by strmadmin using 'source';
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link source connect to strmadmin identified by strmadmin using 'source';
Database link created.
SQL>select * from dual@source;
D
-
X
源库起用supplemental log
SQL> alter database add supplemental log data;
Database altered.
用dbms_streams_admin.maintain_tables快速创建target用户下t1,t2,t3三张表的复制关系,注意如果多次执行,请先在目标库上删除这些需要复制的对象
DECLARE
  tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
  tbls(1) := 'target.t1';
  tbls(2) := 'target.t2';
  tbls(3) := 'target.t3';
  DBMS_STREAMS_ADM.MAINTAIN_TABLES(
    table_names                  => tbls,
    source_directory_object      => 'DATA_PUMP_DIR',
    destination_directory_object => 'DATA_PUMP_DIR',
    source_database              => 'source',
    destination_database         => 'target',
    perform_actions              => true,
    dump_file_name               => 'export_tbls_20100925.dmp',
    log_file                     => 'export_tbls_expdp_20100925.log',
    script_name                  => 'configure_rep_20100925.sql',
    script_directory_object      => 'DATA_PUMP_DIR',
    bi_directional               => false,
    include_ddl                  => true,
    instantiation                => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/
以上过程在源库上执行,执行成功的话,三张表的streams复制已经配置完成,可以找张表插入条记录测试一下
注1:dbms_streams_adm.maintain_tables说明
PROCEDURE MAINTAIN_TABLES
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 TABLE_NAMES                    TABLE OF VARCHAR2(227)  IN
 SOURCE_DIRECTORY_OBJECT        VARCHAR2                IN
 DESTINATION_DIRECTORY_OBJECT   VARCHAR2                IN
 SOURCE_DATABASE                VARCHAR2                IN
 DESTINATION_DATABASE           VARCHAR2                IN
 PERFORM_ACTIONS                BOOLEAN                 IN     DEFAULT
 SCRIPT_NAME                    VARCHAR2                IN     DEFAULT
 SCRIPT_DIRECTORY_OBJECT        VARCHAR2                IN     DEFAULT
 DUMP_FILE_NAME                 VARCHAR2                IN     DEFAULT
 CAPTURE_NAME                   VARCHAR2                IN     DEFAULT
 CAPTURE_QUEUE_TABLE            VARCHAR2                IN     DEFAULT
 CAPTURE_QUEUE_NAME             VARCHAR2                IN     DEFAULT
 CAPTURE_QUEUE_USER             VARCHAR2                IN     DEFAULT
 PROPAGATION_NAME               VARCHAR2                IN     DEFAULT
 APPLY_NAME                     VARCHAR2                IN     DEFAULT
 APPLY_QUEUE_TABLE              VARCHAR2                IN     DEFAULT
 APPLY_QUEUE_NAME               VARCHAR2                IN     DEFAULT
 APPLY_QUEUE_USER               VARCHAR2                IN     DEFAULT
 LOG_FILE                       VARCHAR2                IN     DEFAULT
 BI_DIRECTIONAL                 BOOLEAN                 IN     DEFAULT
 INCLUDE_DDL                    BOOLEAN                 IN     DEFAULT
 INSTANTIATION                  BINARY_INTEGER          IN     DEFAULT
 
注2:maintain各个包初始化数据选项说明
MAINTAIN_GLOBAL, MAINTAIN_SCHEMAS, 和MAINTAIN_TABLES几个过程提供了初始化数据的选项。所谓数据初始化就是指在source端准备数据,复制数据到远端,以及设置初始scn的过程。
  如果运行上述三过程来实施复制,你可以选择下列的初始化步骤:
  a>.Data Pump Export Dump File Instantiation
  首先在source端expdp导出要共享的数据库对象,然后impdp到目标端。然后执行过程时设置instantiation参数值为:
运行MAINTAIN_GLOBAL过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_FULL
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE
  b>.Data Pump Network Import Instantiation
  实际与上类似,也是借助data pump执行导出和导入,只不过导出/导入不再依赖介绍文件,而是直接通过网络传输。因此,设置instantiation参数时,参数值也有所不同:
运行MAINTAIN_GLOBAL过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK
  c>.Generate a Configuration Script. with No Instantiation Specified
  本操作并不执行实例化。因为执行过程时设置perform_actions参数为false,因此过程并不真正配置streams复制环境,而是生成脚本。这种情况下,配置脚本并不执行实例化并且也不会设置初始scn,你必须手动执行并确保设置适当的初始scn值。
  这种情况下,执行过程时,设置instantiation参数值为DBMS_STREAMS_ADM.INSTANTIATION_NONE。
  由于PRE_INSTANTIATION_SETUP和POST_INSTANTIATION_SETUP两过程不会执行初始化操作,因此需要你手工在执行完PRE_INSTANTIATION_SETUP后执行初始化,然后再执行POST_INSTANTIATION_SETUP过程。手工初始化数据库的方式也很多,比如通过rman duplicate,transport tablespace等等。
增加一个需要复制的表
DECLARE
  tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
  tbls(1) := 'target.t4';
  DBMS_STREAMS_ADM.MAINTAIN_TABLES(
    table_names                  => tbls,
    source_directory_object      => 'DATA_PUMP_DIR',
    destination_directory_object => 'DATA_PUMP_DIR',
    source_database              => 'source',
    destination_database         => 'target',
    perform_actions              => true,
    dump_file_name               => 'export_tbls_20100925.dmp',
    log_file                     => 'export_tbls_expdp_20100925.log',
    script_name                  => 'configure_rep_20100925_t4.sql',
    script_directory_object      => 'DATA_PUMP_DIR',
    bi_directional               => false,
    include_ddl                  => true,
    instantiation                => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/

删除streams(源库/目标库)
SQL> exec DBMS_STREAMS_ADM.remove_streams_configuration();
PL/SQL procedure successfully completed.

作者: george.ma   发布时间: 2010-09-25