加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Oracle Stream用法详解

(2013-03-27 10:33:36)
标签:

oraclestream

王显伟

分类: Oracle笔记

一:Stream基本概念

    Stream是Oracle Advanced Queue技术的一种扩展应用,这种技术最基本的原理就是收集事件,把时间保存队列中,然后把这些事件发布给不同的订阅者。从DBA的角度来说,就是把捕获的Oracle数据库产生的Redo日志,然后把这些日志通过网络传播到多个数据库,其它数据库通过应用这种日志,达到复制变化的作用。

    在Stream环境下,复制的起点数据库叫做Source Database,复制的终点数据库叫做Target Database上会有一个捕获进程(Capture Process),该进程利用LogMiner技术从日志中提取DDL,DML语句,这些语句用一种特殊的格式表达,叫做逻辑变更记录(Logical Change Record,LCR),一个LCR对应一个原子行的变更,因些这些源数据库上的一个DML语句,可能对应若干LCR记录。这些LCR会保存到Source Database的本地发送队列中,然后传播进程把这些记录通过网络发送到目标数据为的接收队列,在目标数据库上会有应用进程,这个进程从本地的接收队列中取出LCR记录,然后在本地应用,实现数据同步

二:Stream前期规划

    (1).确定复制级别(表级、数据库级)

    (2).决定复制点

    (3).决定LCR是上游捕获还是下游捕获

          上游捕获:在源数据库进行,从联机日志和归档日志获取LCR,

          下游捕获:在目标数据库进行,从归档日志获得LCR

          本地捕获可以保护更多的数据,但是会占用源数据库的资源。

    (4). 决定复制拓扑结构:这时要决定复制数据库的用途,是只用于预防灾难,还是平时保持空闲,或允许用户使用

三、Stream Replication配置

3.1准备工作

   DBA1是源数据库,DBA2是目标数据库

3.1.1源数据库和目标数据库必须是归档的

     SQL>具体配置略

3.1.2源数据库和目标数据库均需要设置参数

    SQL>alter system set global_names=true scope=both

    默认是FALSE,Database Link使用的是数据库的global_name

3.1.3设置监控队列进程

   SQL>alter system set aq_tm_processes=2 scope=both;

   关于aq_tm_processes的说明:

    aq_tm_processes:
    说明: 如果大于零,就会启用对队列消息的时间监视。该时间值可用于指定消息的延迟和失效属性(用于应用程序的开发)。
    值范围: 0 - 10
    默认值: 0

   以下参数都是10G的默认值, 检查下就可以了无需设置

   如:Show parameter job_queue_processes 

       SQL> alter system set job_queue_processes 10 scope=both;

       SQL> alter system set sga_target 300m scope=spfile;

       SQL> alter system set open_links=4 scope=spfile;

       SQL> alter system set statistics_level='TYPICAL' scope=both;

       10g 默认为Typical, 性能统计模式

3.1.4设置持久的日志挖掘会话数

       SQL> alter system set logmnr_max_persistent_sessions=1 scope=spfile;

       SQL> alter system set "_job_queue_interval"=1 scope=spfile;
       SQL> alter system set aq_tm_processes=1;
       SQL> alter system set streams_pool_size=200m scope=both;
            注意streams_pool_size一定要够大,因为如果启用了SGA_TARGETORACLE可能分配很少内存给stream导致大量信息被spill到磁盘导致查询DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部状态ENABLED但就是没有数据被同步。同时设置_job_queue_interval也是为了提高队列检查时间,防止apply出问题。

           注意:与复制有关的2个参数:如果等了足够长的时间发现数据没有复制过来,仔细检查了pture/propagation/apply各进程的状态都是正常的, 并检查参数.

          SQL> alter system set "_job_queue_interval"=1 scope=spfile;

                   并且将aq_tm_processes参数改为1(我原来这是为10

          SQL> alter system set aq_tm_processes=1;

改完后重启,发现数据就可以去了。这个隐含参数只是控制对job队列的检查频率,默认5

4.1.5 在源数据库上启用追加日志 

      可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。 

      #启用Database 追加日志 

      SQL> alter database add supplemental log data; 

      #启用Table追加日志 

      SQL> alter table add supplement log group log_group_name(table_column_name) always; 

4.1.4 数据库和目的数据库创建相同表空间和用户并赋权

 

创建表空间:

CREATE TABLESPACE streams_tbs DATAFILE 'D:/ORACLE/ORADATA/DBA/streams_tbs.dbf' SIZE 100REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

CREATE TABLESPACE streams_tbs DATAFILE 'D:/ORACLE/ORADATA/DBA2/streams_tbs.dbf' SIZE 100REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

创建用户:

CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs

QUOTA UNLIMITED ON streams_tbs;

赋权:

GRANT DBA to strmadmin;   

exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin'); 

 

4.1.5 配置listener.ora和tnsnames.Ora

DBA2 =

  (DESCRIPTION =

    (ADDRESS (PROTOCOL TCP)(HOST 10.85.10.80)(PORT 1521))

    (CONNECT_DATA =

      (SERVER DEDICATED)

      (SERVICE_NAME DBA2.anqingren.org)

    )

  )

 

4.1.6 创建DBLink

 

先用strmadmin登陆,在创建dblink

 

4.1.6.1在源端建到目库的db link 

SQL> conn strmadmin/strmadmin;

已连接。

SQL> create database link DBAconnect to strmadmin identified by strmadmin using 'dba2';

数据库链接已创建。

 

测试:

SQL> select from global_name@dba2;

GLOBAL_NAME

-------------------

DBA2.ANQINGREN.ORG

 

4.1.6.2 在目端建到源库的db link

SQL> conn strmadmin/strmadmin;

已连接。

SQL> create database link dba connect to strmadmin identified by strmadmin using 'dba';

数据库链接已创建。

 

 

4.2  用户级的复制(不支持sys和system用户)

 

4.2.1 最初的用户复制

 

分别在源库和目标数据库上创建测试用户

SQL>create user dave identified by dave;

SQL>grant dba to dave;

 

4.2.1 在源数据库上创建Source 队列

connect  strmadmin/strmadmin@dba;

BEGIN                                                                                

 DBMS_STREAMS_ADM.SET_UP_QUEUE(                                                                                            

         queue_table => 'SOURCE_QUEUE_TABLE',                                                    

         queue_name  => 'SOURCE_QUEUE',                                                           

         queue_user  => 'strmadmin'

 );                                                                 

END;                                   

    

或者:

SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

PL/SQL procedure successfully completed.

 

命令会创建一个队列缺省名:streams_queue,队列表缺省是:STREAMS_QUEUE_TABLE

队列存储的object类型是anaydata

 

移除队列:

exec dbms_streams_adm.remove_queue(

queue_name => 'streams_queue',

cascade => true,

drop_unused_queue_table => true);. 

 

 

可以用查询dba_queues,dba_queue_tables来检查:

SQL>  select owner,queue_table,name from dba_queues where owner='STRMADMIN';

OWNER               QUEUE_TABLE              NAME

----------------- ------------------------- ------------------

STRMADMIN          SOURCES_QUEUE_TABLE        SOURCES_QUEUE

STRMADMIN          SOURCES_QUEUE_TABLE        AQ$_SOURCES_QUEUE_TABLE_E

 

SQL>select owner,queue_table,object_type from dba_queue_tables where owner='STRMADMIN';

OWNER            QUEUE_TABLE           OBJECT_TYPE

-------------- --------------------- ------------------

STRMADMIN       SOURCES_QUEUE_TABLE     SYS.ANYDATA

 

4.2.2 在目标数据库DBA2上创建接收队列   

                                     

connect  strmadmin/strmadmin@dba2;

BEGIN                                                                                                                          

 DBMS_STREAMS_ADM.SET_UP_QUEUE(                                                                                            

         queue_table => 'TARGET_QUEUE_TABLE',             --队列表                                                                  

         queue_name  => 'TARGET_QUEUE',                --队列                                                                     

         queue_user  => 'strmadmin');                  --队列用户                                                                   

END;                                   

   

可以用查询dba_queues,dba_queue_tables来检查:

SQL>  select owner,queue_table,name from dba_queues where owner='STRMADMIN';

OWNER               QUEUE_TABLE             NAME

------------------ ---------------------  ----------------

STRMADMIN           TARGET_QUEUE_TABLE    TARGET_QUEUE

STRMADMIN           TARGET_QUEUE_TABLE    AQ$_TARGET_QUEUE_TABLE_E

 

4.2.3 在源数据库上创建capture 进程

SQL>conn strmadmin/strmadmin@DBA;

SQL> BEGIN

    DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(

      schema_name     => 'dave',    -- 用户名,dave, sys或者system

      streams_type      => 'capture',

      streams_name     => 'capture_stream',

      queue_name       => 'strmadmin.SOURCE_QUEUE',

      include_dml       => true,

      include_ddl        => true,

     source_database => 'DBA',

 include_tagged_lcr => false,

     inclusion_rule     => true);

 END;

 /

PL/SQL procedure successfully completed.

 

 

可以通过dba_capture查看:

SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_TYPE from dba_capture;

CAPTURE_NAME     QUEUE_NAME       START_SCN  STATUS   CAPTURE_TY

-------------------------    ----------------------------  ----------      --------------  ----------------

CAPTURE_STREAM1  SOURCES_QUEUE    1294052     DISABLED  LOCAL

 

SQL> select from  ALL_CAPTURE_PREPARED_SCHEMAS;  

SCHEMA_NAME  TIMESTAMP   SUPPLEME  SUPPLEME SUPPLEME SUPPLEME

--------------------    --------------    -------- --------  --------       --------

SYSTEM         20-10-09     IMPLICIT  IMPLICIT    IMPLICIT   NO

 

4.2.4 在源数据库上创建传播进程            

SQL>conn strmadmin/strmadmin@DBA;

SQL> BEGIN

 DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(

 schema_name                => 'dave', 

 streams_name               => 'source_to_target', 

 source_queue_name          => 'strmadmin.SOURCE_QUEUE',

 destination_queue_name    => 'strmadmin.TARGET_QUEUE@DBA2', --此队列待创建

 include_dml               => true,

 include_ddl               => true,

 source_database           => 'DBA',

 inclusion_rule            => true,

 queue_to_queue            => true);

 END;

 /

PL/SQL procedure successfully completed.

 

重新启动propagation process
 --dbms_propagation_adm.start_propagation (propagation_name)
 --其中propagation_name可以从表all_propagation中取得
 select from all_propagation; 
 SQL>  exec dbms_propagation_adm.start_propagation('source_to_target');

  exec dbms_propagation_adm.stop_propagation('source_to_target');
    PL/SQL procedure successfully completed.

select from all_propagation; 

 

可以通过dba_propagations查看结果:

SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUEUE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;

 

PROPAGATION_NAME   SOURCE_QUEUE_NA DESTINATION_QUE DESTINATION_DBLINK STATUS

------------------ --------------- --------------- ------------------ --------

STREAM1_TO_STREAM2 SOURCES_QUEUE   TARGET_QUEUE    DBA2.ANQINGREN.ORG ENABLED     

 

 

#修改propagation休眠时间为0,表示实时传播LCR。 

begin 

dbms_aqadm.alter_propagation_schedule( 

queue_name => 'SOURCE_QUEUE', 

destination => 'DBA2', 

latency => 0); 

end; 

 

 

4.2.5 在目标数据库DBA2上创建Apply进程

 

SQL> BEGIN

   DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(

      schema_name      => 'SYSTEM',

      streams_type    => 'apply', 

      streams_name    => 'target_apply_stream',

      queue_name      => 'strmadmin.TARGET_QUEUE',

      include_dml     => true,

      include_ddl     => true,

  include_tagged_lcr => false,

      source_database => 'DBA',

      inclusion_rule => true);

 END;

/

 

可以通过:

dba_apply

v$streams_apply_reader

v$streams_apply_coordinator

v$streams_apply_server

查看状态

 

SQL> select apply_name,queue_name,status from dba_apply;

 

APPLY_NAME                     QUEUE_NAME                     STATUS

------------------------------ ------------------------------ --------

TARGET_APPLY_STREAM            TARGET_QUEUE                   DISABLED

 

4.2.6  实例化复制数据库

 

4.2.6.1 用exp/imp 完成实例化

 

带数据完成源端exp和目端的import:

Exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:/STRM.dmp LOG=STRM.log OBJECT_CONSISTENT=Y STATISTICS NONE    

 

imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:/STRM.dmp IGNORE=Y COMMIT=Y LOG=D:/import.log STREAMS_INSTANTIATION=Y  

 

或仅作实例化(不带数据):

exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:/STRM.dmp LOG=D:/export.log OBJECT_CONSISTENT=Y STATISTICS NONE ROWS=NO  

 

imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:/STRM.dmp COMMIT=Y LOG=D:/import.log STREAMS_INSTANTIATION=Y IGNORE=Y

 

4.2.6.2 直接设置SCN的方式进行实例化:

---获取源库互置用户的SCN

connect strmadmin/strmadmin@DBA     

set serveroutput on                                                                                                            

DECLARE

        iscn NUMBER; -- Variable to hold instantiation SCN value

BEGIN                                                                                                                   

        iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();                                                                     

        DBMS_OUTPUT.PUT_LINE ('Instantiation SCN is: || iscn); 

END;                                                      

    

---设置为目标库互置用户的SCN

connect strmadmin/strmadmin@DBA2                                                                                              

BEGIN                                                                                                                        

 DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(

        source_schema_name => 'SYSTEM',                                                                                    

        source_database_name => 'DBA',

        instantiation_scn => &iscn);

END;                                                                                              4.2.7.  在目标数据库上启动Apply进程

connect strmadmin/strmadmin@DBA2 

SQL> BEGIN

    DBMS_APPLY_ADM.SET_PARAMETER(apply_name => 'target_apply_stream', parameter

 => 'disable_on_error', VALUE => 'n');

    END;

    /

 

SQL> BEGIN

    DBMS_APPLY_ADM.START_APPLY(

      apply_name => 'target_apply_stream');

 END;

 /

#停止Apply进程 

begin 

dbms_apply_adm.stop_apply( 

apply_name => 'target_apply_stream'); 

end; 

 

查看状态

SQL> select apply_name,queue_name,status from dba_apply;

 

APPLY_NAME                     QUEUE_NAME                     STATUS

------------------------------ ------------------------------ --------

TARGET_APPLY_STREAM            TARGET_QUEUE                   ENABLED

 

 

4.2.8 在源数据库上启动capture

connect strmadmin/strmadmin@DBA

SQL> BEGIN

    DBMS_CAPTURE_ADM.START_CAPTURE(

      capture_name => 'capture_stream');

 END;

 /

#停止Capture进程 

begin 

dbms_capture_adm.stop_capture( 

capture_name => 'capture_stream'); 

end; 

 

查看状态:

SQL> select capture_name,status from dba_capture;

CAPTURE_NAME    STATUS

--------------- --------

CAPTURE_STREAM ENABLED

 

4.3  表级的复制

maintain_tts  表空间复制

maintain_schemas 用户复制

maintain_tables 表复制的

dbms_streams_admmaintain_globalmaintain_ttsmaintain_schemas等过程相比,maintain_tables过程使用则更灵活,可以为某些特殊的表拿出来单独配置,maintain_tables也象其它的过程一样,提供了一蓝子解决方案,如果要添加新的表到复制中,只需要再次执行maintain_tables过程即可。

4.3.stream进行配置前,需要做些准备工作
A 源库与目标库初始化参数的设置
alter system set aq_tm_processes=1 scope=spfile;
alter system set job_queue_processes=2 scope=spfile;
alter system set global_names=true scope=spfile;
alter system set streams_pool_size=20m scope=spfile;
说明streams_pool_size在生产环境中最好>200m
B 源库与目标库tnsnames.ora配置
4.1
C 源库与目标库复制管理员的创建
    4.1
D 源库与目标库创建DBLINK

4.1
E 源库与目标库必须处于归档模式
4.1
F 源库与目标库必须创建directory
connect strmadmin/strmadmin@DBA;
create directory DIR_DBA as 'D:/Stream/DBA';
connect strmadmin/strmadmin@DBA2;
create directory DIR_DBA2 as 'D:/Stream/DBA2';
说明:在复制表空间时,创建directory需要指定该表空间所在的目录
G 创建测试用的表空间及表

CREATE TABLESPACE DAVE DATAFILE 'D:/ORACLE/ORADATA/DBA/DAVE.dbf' SIZE 100M;

create user tianle identified by tianle default tablespace DAVE;

grant dba to tianle;

conn TIANLE/TIANLE

create table test(id int,name varchar2(20));

create table test2(id int,name varchar2(20));

insert into test values(1,'dave');

insert into test values(2,'bl');

不能使用默认的表空间.


4.3.2  在源库执行MAINTAIN_TTS过程
SQL>connect strmadmin/strmadminpw@DBA;
declare
v_tables dbms_utility.uncl_array;
begin
v_tables(1) := 'tianle.test;
v_tables(2) := 'tianle.test2';
dbms_streams_adm.maintain_tables(
table_names => v_tables,
source_directory_object => null,
destination_directory_object => null,
source_database => 'DBA',
destination_database => 'DBA2',
perform_actions => true,
bi_directional => false,
include_ddl => true,
instantiation => dbms_streams_adm.instantiation_table_network);
end;
/
说明:在源库执行maintain_tables,目标库几乎什么都不用做,stream环境已经配置好啦,
如果想复制其它的表,只用再执行maintain_tables过程即可


4.3.3 如果在执行2的过程时失败,需要清除脚本
--select script_id from dba_recoverable_script;
--exec dbms_streams_adm.RECOVER_OPERATION('&1','PURGE');
declare
v_script_id varchar2(32);
begin
select script_id into v_script_id from dba_recoverable_script;
dbms_streams_adm.RECOVER_OPERATION(v_script_id,'PURGE');
exception
when no_data_found then
DBMS_OUTPUT.PUT_LINe('no data found') ;
when others then

 

 

  4.5 全库复制

以上主要为大家介绍了pre_instantiation_setup/post_instantiation_setup过程在配置全库复制的方法,以下介绍dbms_streams_admmaintain_global过程如何配置stream全库复制方法,适用于10gR2及以后版本。 

不支持syssystem 用户的变更。

1.stream进行配置前,需要做些准备工作

 

  源库与目标库初始化参数的设置 

alter system set aq_tm_processes=4 scope=spfile;
alter system set job_queue_processes=5 scope=spfile;
alter system set global_names=true scope=spfile;
alter system set streams_pool_size=51m scope=spfile;

说明streams_pool_size在生产环境中最好>200m

 

  源库与目标库tnsnames.ora配置

4.1

  源库与目标库复制管理员的创建 

4.1

  源库与目标库创建互连的DBLINK

4.1

  源库与目标库必须处于归档模式

4.1

  源库与目标库必须创建directory

create directory dir_DBA as 'D:/Stream/DBA';
create directory dir_DBA2 as 'D:/Stream/DBA2';

  

2.在源库执行MAINTAIN_GLOBAL过程

begin

dbms_streams_adm.maintain_global(

source_directory_object =>'dir_DBA',

destination_directory_object =>'dir_DBA2',

source_database=>'DBA',

destination_database =>'DBA2',

perform_actions=>true,

include_ddl=>true,

instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK

 );

end;

  说明:在执行maintain_global,源库与目标库必须创建directory,然后在源库执行目标库几乎什么都不用做,stream环境已经配置完毕。

 

   内容引自网络:http://blog.csdn.net/tianlesoftware/article/details/4759356

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有