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_NUMBER、ERROR_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_NUMBER、ERROR_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();