oracle 单表流复制 stream

来源:互联网 发布:识别图片的软件 编辑:程序博客网 时间:2024/06/09 19:13

今天运气够好,oracle单表流复制搞定,由于oracle stream 操作步骤多,之前遇到许多问题,

没有理清思路或者说自己对此的理解不够,所以失败。对于重要表,流复制类似dataguard应用日志,主服务器

捕获,然后传递,从服务器接受,如此而以。简单记录一下主要步骤。

1 主服务器 os: windows  sid:rman  数据库版本10.2.0.1

  从服务器 os:   windows   sid  format  数据库版本10.2.0.1

2 主、从数据库分别执行如下的语句:
Sqlplus ‘/ as sysdba’
alter system set aq_tm_processes=2 scope=both;
alter system set global_names=true scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=20 scope=both;
alter system set undo_retention=3600 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile;
alter system set streams_pool_size=25M scope=spfile;--这个我没执行,理由是oracle自动分配了
alter system set utl_file_dir='*' scope=spfile;
alter system set open_links=4 scope=spfile;

3 主从机设置归档 mout状态下alter database archivelog 另开启alter system set  log_archive_start=true;

  查看归档是否成功select recid, name, first_time from v$archived_log;

4 主从机表空间和用户

  create tablespace stream_tbs datafile 'g:\oracle\oradata\rman\stream01.dbf' size 200m

  autoextend on extent management local uniform size 1m segment space management auto;

表空间已创建。

-- 创建streams管理用户,并授予dba权限

JSSWEB> create user test identified by test default tablespace stream_tbs;

用户已创建。

--将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
execute dbms_logmnr_d.set_tablespace('tbs_stream');

-- 由于streams用户操作需要较多权限,此处仅用于演示,简便期间直接授予dba权限

 授权test管理用户

JSSWEB> grant dba to test;

begin
dbms_streams_auth.grant_admin_privilege(
grantee => 'test',
grant_privileges => true);
end;

5 主从机表空间和用户

  create tablespace stream_tbs datafile 'd:\oracle\oradata\rman\stream01.dbf' size 200m

  autoextend on extent management local uniform size 1m segment space management auto;

表空间已创建。

-- 创建streams管理用户,并授予dba权限

JSSWEB> create user strmadmin identified by strmadmin default tablespace stream_tbs;

用户已创建。

--将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
execute dbms_logmnr_d.set_tablespace('tbs_stream');

-- 由于streams用户操作需要较多权限,此处仅用于演示,简便期间直接授予dba权限

 授权test管理用户

JSSWEB> grant dba to strmadmin ;

begin
dbms_streams_auth.grant_admin_privilege(
grantee => 'strmadmin',
grant_privileges => true);
end;

6 配置网络连接

 主数据库(tnsnames.ora)中添加从数据库的配置。
 RMAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
)
(CONNECT_DATA =
(SID = rman)
(SERVER = DEDICATED)
)
)
配置从环境tnsnames.ora
从数据库(tnsnames.ora)中添加主数据库的配置。
FORMAT =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.104)(PORT = 1521))
)
(CONNECT_DATA =
(SID = format)
(SERVER = DEDICATED)
)
)

7 创建database link

  主:create database link format connect to strmadmin identified by strmadmin using 'format';

  从:create database link rman  connect to strmadmin identified by strmadmin using 'rman '; 

 然后相互tnsping 或 select sysdate from dual@format/rman;

8  主库 exec dbms_streams_adm.set_up_queue();

    从库  exec dbms_streams_adm.set_up_queue();

 

9 创建捕获规则  

  begin

   dbms_streams_adm.add_table_rules(

   table_name => 'scott.emp',

   streams_type => 'capture',

   streams_name =>'capture_stream',

   queue_name => 'test.streams_queue',

   include_dml => true,

   include_ddl => true,

   inclusion_rule => true);

   end;
--创建传播规则

begin

   dbms_streams_adm.add_table_propagation_rules(

   table_name =>'scott.emp',

   streams_name => 'sour_to_targ',

   source_queue_name =>'test.streams_queue',

   destination_queue_name => 'strmadmin.streams_queue@format',

   include_dml => true,

   include_ddl => true,

   source_database =>'rman',

   inclusion_rule => true,

   queue_to_queue => true);

 end;

select capture_name,status from dba_capture;

CAPTURE_NAME                   STATUS

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

CAPTURE_STREAM                 DISABLED

 

次库 把scott用户下的表emp drop一下。

target数据库 创建应用规则

  begin

   dbms_streams_adm.add_table_rules(

   table_name => 'scott.emp',

   streams_type => 'apply',

   streams_name => 'apply_stream',

   queue_name => 'strmadmin.streams_queue',

   include_dml => true,

   include_ddl => true,

   source_database =>'rman',

  inclusion_rule => true);

  end;

 

初始化数据,首先从源库导出,再执行导入,复制的方式很多,逻辑导入导出、rman、duplication之类的,基本上你想怎么操作都可以,

因为只操作一个表,所以直接通过数据库链复制。

 create table scott.EMP

    (

     EMPNO    NUMBER(4) not null primary key ,

     ENAME    VARCHAR2(10),

     JOB      VARCHAR2(9),

     MGR      NUMBER(4),

    HIREDATE DATE,
    SAL      NUMBER(7,2),
    COMM     NUMBER(7,2),

   DEPTNO   NUMBER(2)

   );

insert into scott.emp select *from scott.emp@rman;

设置起始应用的scn值

 DECLARE

    iscn  NUMBER;

    BEGIN

   iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();

   DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@format(

   source_object_name    => 'scott.emp',

   source_database_name  => 'rman',

   instantiation_scn     => iscn);

    END;

从库

exec dbms_apply_adm.start_apply('apply_stream');

PL/SQL  过程已成功完成。

JSSSTR> select apply_name,status from dba_apply;

APPLY_NAME                     STATUS

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

APPLY_STREAM                   ENABLED

 

切换到主数据库,启动捕获进程

    JSSWEB> exec dbms_capture_adm.start_capture(¨capture_stream¨);

    PL/SQL  过程已成功完成。

    JSSWEB> select capture_name,status from dba_capture;

    CAPTURE_NAME                   STATUS

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

    CAPTURE_STREAM                 ENABLED
    测试

    如果一切顺利,我们的streams就配置好了,下面验证一下。

      JSSWEB> select *from scott.emp where empno=7499;

           EMPNO ENAME      JOB              MGR HIREDATE             COMM     DEPTNO

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

            7499 ALLEN      SALESMAN        7698 20-2 月 -81            300         30

      JSSWEB> update scott.emp set deptno=40 where empno=7499;

      已更新 1 行。

      JSSWEB> commit;

      提交完成。

      JSSSTR> select * from scott.emp where empno=7499;

           EMPNO ENAME      JOB              MGR HIREDATE             COMM     DEPTNO

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

            7499 ALLEN      SALESMAN        7698 20-2 月 -81            300         40

      成功!!!!!