ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 10g 流复制实验-源端捕获

oracle 10g 流复制实验-源端捕获

原创 Linux操作系统 作者:mafeicnnui 时间:2011-08-17 19:59:38 0 删除 编辑

ORACLE 10g STREAM 高级流复制技术

 

一、    实验环境

操作系统:Microsoft Windows XP [版本 5.1.2600]

数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

 

二、     实验步骤

 

2.1主库配置:

   DB_NAME=SOURCE

     ORACLE_SID=SOURCE   

 

2.2从库配置: 

    DB_NAME=DEST

     ORACLE_SID=DEST

 

2.3主库监听配置:

# LISTENER.ORA NETWORK CONFIGURATION FILE:

D:\ORACLE\PRODUCT\10.2.0\DB_1\NETWORK\ADMIN\LISTENER.ORA

# GENERATED BY ORACLE CONFIGURATION TOOLS.

 

SID_LIST_LISTENER =

  (SID_LIST =

  (SID_DESC =

    (GLOBAL_DBNAME =OK3)

    (ORACLE_HOME = D:\ORACLE\PRODUCT\10.2.0\DB_1)

    (SID_NAME=SOURCE)

  )  

) 

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

      (ADDRESS = (PROTOCOL = TCP)(HOST = PC-201006151039)(PORT = 1521))

    )

  )

 

2.4从库监听配置:

 

# LISTENER.ORA NETWORK CONFIGURATION FILE:

D:\ORACLE\PRODUCT\10.2.0\DB_1\NETWORK\ADMIN\LISTENER.ORA

# GENERATED BY ORACLE CONFIGURATION TOOLS.

 

SID_LIST_LISTENER =

  (SID_LIST = 

  (SID_DESC =

    (GLOBAL_DBNAME =OK4)

    (ORACLE_HOME = D:\ORACLE\PRODUCT\10.2.0\DB_1)

    (SID_NAME=DEST)

  )    

) 

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

      (ADDRESS = (PROTOCOL = TCP)(HOST = PC-201006151039)(PORT = 1521))

    )

  )

 

2.5主库网络连接串

 

# TNSNAMES.ORA NETWORK CONFIGURATION FILE:

D:\ORACLE\PRODUCT\10.2.0\DB_1\NETWORK\ADMIN\TNSNAMES.ORA

# GENERATED BY ORACLE CONFIGURATION TOOLS.

 

SOURCE=

(DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = PC-201006151039)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME =OK3)

    )

)

 

2.6从库网络连接串

 

# TNSNAMES.ORA NETWORK CONFIGURATION FILE:

D:\ORACLE\PRODUCT\10.2.0\DB_1\NETWORK\ADMIN\TNSNAMES.ORA

# GENERATED BY ORACLE CONFIGURATION TOOLS.

 

DEST=

(DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = PC-201006151039)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME =OK4)

    )

)

 

2.7启用追加日志 

可以基于DATABASE级别或TABLE级别,启用追加日志(SUPPLEMENTAL LOG)。在建立根据SCHEMA粒度进行复制的ORACLE STREAM环境中,如果确认SCHEMA下所有TABLE都有合理的主键(PRIMARY KEY),则不再需要启用追加日志。 

#启用DATABASE 追加日志 

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; 

#启用TABLE追加日志 

ALTER TABLE ADD SUPPLEMENT LOG GROUP LOG_GROUP_NAME(TABLE_COLUMN_NAME) ALWAYS;

 

2.8创建DBLINK 

根据ORACLE 10GR2 STREAM官方文档,针对主数据库建立的数据库链的名字必须和从数据库的GLOBAL_NAME相同。 如果需要修改GLOBAL_NAME,执行

ALTER DATABASE RENAME GLOBAL_NAME TO XXX ;

 

2.9创建主库数据库链路

C:\>SET ORACLE_SID=SOURCE;

C:\>SQLPLUS / AS SYSDBA

SQL> CREATE USER STRMADMIN IDENTIFIED BY STRMADMIN ;

用户已创建。 

SQL> GRANT DBA,CONNECT,RESOURCE, ALL PRIVILEGES TO STRMADMIN;

授权成功。

SQL> CONN STRMADMIN/STRMADMIN

已连接。

#STRMADMIN身份,登录主数据库。

CONNECT STRMADMIN/STRMADMIN 

#建立数据库链 

CREATE DATABASE LINK BOOK CONNECT TO STRMADMIN IDENTIFIED BY STRMADMIN USING 'BOOK'; 

3.0创建从库数据库链 

C:\>SET ORACLE_SID=DEST;

C:\>SQLPLUS / AS SYSDBA

SQL> CREATE USER STRMADMIN IDENTIFIED BY STRMADMIN ;

用户已创建。 

SQL> GRANT DBA,CONNECT,RESOURCE, ALL PRIVILEGES TO STRMADMIN;

授权成功。

SQL> CONN STRMADMIN/STRMADMIN

已连接。

STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

建立数据库链 

CREATE DATABASE LINK CISCOSYS CONNECT TO STRMADMIN IDENTIFIED BY STRMADMIN USING 'CISCOSYS'; 

3.1创建MASTER流队列 

#STRMADMIN身份,登录主数据库。 

CONNECT STRMADMIN/STRMADMIN ;

BEGIN 

DBMS_STREAMS_ADM.SET_UP_QUEUE( 

QUEUE_TABLE => 'SOURCE_QUEUE_TABLE', 

QUEUE_NAME => 'SOURCE_QUEUE'); 

END;  

3.2创建BACKUP流队列 

#STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

 

 

 

 

BEGIN 

DBMS_STREAMS_ADM.SET_UP_QUEUE( 

QUEUE_TABLE => 'DEST_QUEUE_TABLE', 

QUEUE_NAME => 'DEST_QUEUE'); 

END; 

/

3.3 创建捕获进程 

STRMADMIN身份,登录主数据库。提醒一下,本文档以HR用户做示例。 

CONNECT STRMADMIN/STRMADMIN 

BEGIN 

DBMS_STREAMS_ADM.ADD_SCHEMA_RULES( 

SCHEMA_NAME => 'HR', 

STREAMS_TYPE => 'CAPTURE', 

STREAMS_NAME => 'CAPTURE_SOURCE', 

QUEUE_NAME => 'STRMADMIN.SOURCE_QUEUE', 

INCLUDE_DML => TRUE, 

INCLUDE_DDL => TRUE, 

INCLUDE_TAGGED_LCR => FALSE, 

SOURCE_DATABASE => NULL, 

INCLUSION_RULE => TRUE); 

END; 

3.4 实例化复制数据库 

在主数据库环境中,执行如下SHELL语句。如果从库的HR用户不存在,建立一个HR的空用户。 

EXP USERID=HR/HR@SOURCE FILE='C:\HR.DMP' OBJECT_CONSISTENT=Y ROWS=Y 

IMP USERID=HR/HR@DEST FILE='C:\HR.DMP' IGNORE=Y COMMIT=Y LOG='F:\HR.LOG' STREAMS_INSTANTIATION=Y FROMUSER=HR TOUSER=HR 

 

3.5 创建传播进程 

STRMADMIN身份,登录主数据库。 

CONNECT STRMADMIN/STRMADMIN 

/

BEGIN 

DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES ( 

SCHEMA_NAME => 'HR', 

STREAMS_NAME => 'SOURCE_TO_DEST', 

SOURCE_QUEUE_NAME => 'STRMADMIN.SOURCE_QUEUE', 

DESTINATION_QUEUE_NAME => 'STRMADMIN.DEST_QUEUE@DEST', 

INCLUDE_DML => TRUE, 

INCLUDE_DDL => TRUE, 

INCLUDE_TAGGED_LCR => FALSE, 

SOURCE_DATABASE => 'SOURCE', 

INCLUSION_RULE => TRUE); 

END; 

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

BEGIN 

DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE ( 

QUEUE_NAME => 'SOURCE_QUEUE', 

DESTINATION => 'DEST', 

LATENCY => 0); 

END; 

3.6 创建应用进程 

#STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

/

BEGIN 

DBMS_STREAMS_ADM.ADD_SCHEMA_RULES ( 

SCHEMA_NAME => 'HR', 

STREAMS_TYPE => 'APPLY', 

STREAMS_NAME => 'APPLY_DEST', 

QUEUE_NAME => 'STRMADMIN.DEST_QUEUE', 

INCLUDE_DML => TRUE, 

INCLUDE_DDL => TRUE, 

INCLUDE_TAGGED_LCR => FALSE, 

SOURCE_DATABASE => 'SOURCE', 

INCLUSION_RULE => TRUE); 

END; 

3.7 启动STREAM 

#STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

#启动APPLY进程 

BEGIN 

DBMS_APPLY_ADM.START_APPLY ( 

APPLY_NAME => 'APPLY_DEST'); 

END; 

#STRMADMIN身份,登录主数据库。 

CONNECT STRMADMIN/STRMADMIN 

#启动CAPTURE进程 

BEGIN 

DBMS_CAPTURE_ADM.START_CAPTURE ( 

CAPTURE_NAME => 'CAPTURE_SOURCE'); 

END; 

 

 

 

3.8 停止STREAM 

STRMADMIN身份,登录主数据库。 

CONNECT STRMADMIN/STRMADMIN 

停止CAPTURE进程 

BEGIN 

DBMS_CAPTURE_ADM.STOP_CAPTURE ( 

CAPTURE_NAME => 'CAPTURE_SOURCE'); 

END; 

STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

#停止APPLY进程 

BEGIN 

DBMS_APPLY_ADM.STOP_APPLY ( 

APPLY_NAME => 'APPLY_DEST'); 

END; 

4.0 测试场景 

     本文档建立了针对HR用户的STREAM 复制环境,如果没有特别声明,以下测试场景均以HR用户身份执行。 

4.1 建一张表测试 

主数据库 

SQL> CREATE TABLE T1(id NUMBER PRIMARY KEY, name VARCHAR2(50)) ;

Table created. 

从数据库 

SQL> DEST T1 

NAME  NULL  TYPE 

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

ID NOT NULL NUMBER 

NAME  VARCHAR2 (50) 

4.2 表中插入一行数据 

主数据库 

SQL> INSERT   INTO   T1 VALUES (1,’A’); 

1 ROW CREATED. 

SQL> COMMIT; 

COMMIT COMPLETE. 

SQL> 

从数据库 

SQL> SELECT * FROM T1; 

ID NAME 

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

1 A 

5 问题诊断 

5.1 如何知道捕捉(Capture)进程是否运行正常? 

STRMADMIN身份,登录主数据库,执行如下语句: 

SQL> SELECT CAPTURE_NAME,  QUEUE_NAME,  RULE_SET_NAME, NEGATIVE_RULE_SET_NAME,  STATUS  FROM DBA_CAPTURE;  

结果显示如下: 

CAPTURE_NAME QUEUE_NAME 

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

RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS 

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

CAPTURE_PROD PROD_QUEUE 

RULESET$_14 ENABLED 

ENABLED 

 

如果STATUS状态是ENABLED,表示CAPTURE进程运行正常; 

如果STATUS状态是DISABLED,表示CAPTURE进程处于停止状态,只需重新启动即可; 

如果STATUS状态是ABORTED,表示CAPTURE进程非正常停止,查询相应的ERROR_NUMBERERROR_MESSAGE列可以得到详细的信息;同时,ORACLE会在跟踪文件中记录该信息。 

5.2 如何知道CAPTURED LCR是否有传播GAP 

STRMADMIN身份,登录主数据库,执行如下语句: 

SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN  FROM DBA_CAPTURE; 

结果显示如下: 

CAPTURE_NAME QUEUE_NAME STATUS  CAPTURE_PROD PROD_QUEUE ENABLED 

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

CAPTURED_SCN APPLIED_SCN  17023672  17023672 

如果APPLIED_SCN小于CAPTURED_SCN,则表示在主数据库一端,要么LCR没有被DEQUEUE,要么PROPAGATION进程尚未传播到从数据库一端。 

5.3 如何知道APPY进程是否运行正常? 

STRMADMIN身份,登录从数据库,执行如下语句: 

SQL> SELECT APPLY_NAME, APPLY_CAPTURED, STATUS FROM DBA_APPLY; 

 

结果显示如下: 

APPLY_NAME APPLY_ STATUS 

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

APPLY_H10G YES ENABLED 

如果STATUS状态是ENABLED,表示APPLY进程运行正常; 

如果STATUS状态是DISABLED,表示APPLY进程处于停止状态,只需重新启动即可; 

如果STATUS状态是ABORTED,表示APPLY进程非正常停止,查询相应的ERROR_NUMBERERROR_MESSAGE列可以得到详细的信息;同时,可以查询DBA_APPLY_ERROR视图,了解详细的APPLY错误信息。 

 

6 结篇 

通过如上的测试可以看出STREAM的功能还是十分强大的,通过配置ORACLE STREAM可以更大的提升数据库的

   和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。

清除所有配置信息 ,要清楚STREAM配置信息,需要先执行3.13,停止STREAM进程。 

STRMADMIN身份,登录主数据库。 

CONNECT STRMADMIN/STRMADMIN 

EXEC DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION(); 

STRMADMIN身份,登录从数据库。 

CONNECT STRMADMIN/STRMADMIN 

EXEC DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION();

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8319781/viewspace-705190/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-08-12

  • 博文量
    7
  • 访问量
    4970