首页 > 数据库 > Oracle > Oracle10g新特性之stream流配置
Oracle10g新特性之stream流配置
主数据库:
操作系统:Linux AS 45
IP地址:192.168.3.46
数据库:Oracle 10.2.0.2
ORACLE_SID:prod
Global_name:prod
从数据库:
操作系统:Linux AS 45
IP地址:192.168.3.47
数据库:Oracle 10.2.0.2
ORACLE_SID:testdb
Global_name:testdb
一、在主库创建BAOPAY用户表空间、用户及授权
create tablespace BAOPAY DATAFILE '/data/oracle/oradata/prod/BAOPAY.dbf' SIZE
2048M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
create tablespace BAOPAY_INDEX DATAFILE '/data/oracle/oradata/prod/BAOPAY_INDEX.dbf' SIZE
2048M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
ALTER DATABASE
DATAFILE '/data/oracle/oradata/prod/BAOPAY.dbf' AUTOEXTEND
ON NEXT 100M MAXSIZE 32767M;
ALTER DATABASE
DATAFILE '/data/oracle/oradata/prod/BAOPAY_INDEX.dbf' AUTOEXTEND
ON NEXT 100M MAXSIZE 32767M;
CREATE USER BAOPAY IDENTIFIED BY BAOPAY DEFAULT TABLESPACE BAOPAY TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK;
GRANT CONNECT TO BAOPAY;
GRANT RESOURCE TO BAOPAY;
GRANT DBA TO BAOPAY;
二、在主库导入用户数据
imp baopay/baopay file=/backup/expdp/baopay_new.dmp log=/backup/expdp/imp_baopay_new.log fromuser=baopay touser=baopay
sqlplus / as sysdba
GRANT CREATE JOB TO BAOPAY;
GRANT CREATE VIEW TO BAOPAY;
GRANT DEBUG CONNECT SESSION TO BAOPAY;
revoke dba from baopay;
alter user baopay quota unlimited on baopay;
alter user baopay quota unlimited on baopay_index;
三、分别在主、从数据库中执行以下语句,并重启数据库
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=200M scope=spfile;
alter system set utl_file_dir='*' scope=spfile;
alter system set open_links=4 scope=spfile;
四、将主数据库修改为归档模式(alter system reset log_archive_start scope=spfile sid='*';)
sqlplus '/ as sysdba'
alter system set log_archive_dest_1='location=/data/arch' scope=spfile;
//alter system set log_archive_start=TRUE scope=spfile;(此参数在oracle 10g已经废弃)
alter system set log_archive_format='arch%t_%s_%r.arc' scope=spfile;
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
SQL> show parameter archive_start
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_start boolean FALSE
五、分别在主从库中创建stream管理用户、表空间及授权
create tablespace tbs_stream datafile '/data/oracle/oradata/prod/tbs_stream01.dbf' size 1024m autoextend on maxsize unlimited segment space management auto;
execute dbms_logmnr_d.set_tablespace('tbs_stream');
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin;
begin
dbms_streams_auth.grant_admin_privilege(
grantee => 'strmadmin',
grant_privileges => true);
end;
/
六、配置网络连接
配置主环境tnsnames.ora
主数据库(tnsnames.ora)中添加从数据库的配置。
TESTDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)
配置从环境tnsnames.ora
从数据库(tnsnames.ora)中添加从数据库的配置。
PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.46)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = prod)
)
)
七、在主库中启用追加日志
alter database add supplemental log data;
八、创建DBlink
show parameter global_names
select * from global_name;
创建主数据库数据库链
sqlplus / as sysdba
alter database rename global_name to PROD;
#以strmadmin身份,登录主数据库。
sqlplus strmadmin/strmadmin
#建立数据库链
create database link TESTDB connect to strmadmin identified by strmadmin using 'TESTDB';
创建从数据库数据库链
sqlplus / as sysdba
alter database rename global_name to TESTDB;
#以strmadmin身份,登录从数据库。
sqlplus strmadmin/strmadmin
#建立数据库链
create database link PROD connect to strmadmin identified by strmadmin using 'PROD';
九、创建流队列
创建主库流队列
以下是引用片段:
#以strmadmin身份,登录主数据库。
sqlplus strmadmin/strmadmin
begin
dbms_streams_adm.set_up_queue(
queue_table => 'PROD_queue_table',
queue_name => 'PROD_queue');
end;
/
创建从库流队列
以下是引用片段:
#以strmadmin身份,登录从数据库。
sqlplus strmadmin/strmadmin
begin
dbms_streams_adm.set_up_queue(
queue_table => 'TESTDB_queue_table',
queue_name => 'TESTDB_queue');
end;
/
十、在主数据库中创建捕获进程
sqlplus strmadmin/strmadmin
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'baopay',
streams_type => 'capture',
streams_name => 'capture_PROD',
queue_name => 'strmadmin.PROD_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/
十一、进行逻辑复制数据库:(此操作必须在创建捕获进程之后,传播进程之前,切忌)
主数据库执行:
exp userid=baopay/baopay file=/backup/expdp/baopay.dmp log=/backup/expdp/baopay.log object_consistent=y rows=y
scp baopay.dmp oracle@192.168.3.47:/backup/expdp
从数据库执行:
create tablespace BAOPAY DATAFILE '/data/oracle/oradata/testdb/BAOPAY.dbf' SIZE
2048M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
create tablespace BAOPAY_INDEX DATAFILE '/data/oracle/oradata/testdb/BAOPAY_INDEX.dbf' SIZE
2048M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
ALTER DATABASE
DATAFILE '/data/oracle/oradata/testdb/BAOPAY.dbf' AUTOEXTEND
ON NEXT 100M MAXSIZE 32767M;
ALTER DATABASE
DATAFILE '/data/oracle/oradata/testdb/BAOPAY_INDEX.dbf' AUTOEXTEND
ON NEXT 100M MAXSIZE 32767M;
CREATE USER BAOPAY IDENTIFIED BY BAOPAY DEFAULT TABLESPACE BAOPAY TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK;
GRANT CONNECT TO BAOPAY;
GRANT RESOURCE TO BAOPAY;
GRANT DBA TO BAOPAY;
imp userid=baopay/baopay file=/backup/expdp/baopay.dmp log=/backup/expdp/imp_baopay.log fromuser=baopay touser=baopay ignore=y commit=y streams_instantiation=y
sqlplus / as sysdba
GRANT CREATE JOB TO BAOPAY;
GRANT CREATE VIEW TO BAOPAY;
GRANT DEBUG CONNECT SESSION TO BAOPAY;
revoke dba from baopay;
alter user baopay quota unlimited on baopay;
alter user baopay quota unlimited on baopay_index;
十二、创建传播进程
#以strmadmin身份,登录主数据库。
sqlplus strmadmin/strmadmin
begin
dbms_streams_adm.add_schema_propagation_rules(
schema_name => 'baopay',
streams_name => 'PROD_to_TESTDB',
source_queue_name => 'strmadmin.PROD_queue',
destination_queue_name => 'strmadmin.TESTDB_queue@TESTDB',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'prod',
inclusion_rule => true);
end;
/
#修改propagation休眠时间为0,表示实时传播LCR。
begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'PROD_queue',
destination => 'TESTDB',
latency => 0);
end;
/
十三、创建应用进程
#以strmadmin身份,登录从数据库。
sqlplus strmadmin/strmadmin
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'baopay',
streams_type => 'apply',
streams_name => 'apply_TESTDB',
queue_name => 'strmadmin.TESTDB_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'prod',
inclusion_rule => true);
end;
/
十四、启动STREAM
#以strmadmin身份,登录从数据库。
sqlplus strmadmin/strmadmin
#启动Apply进程
begin
dbms_apply_adm.start_apply(
apply_name => 'apply_TESTDB');
end;
/
#以strmadmin身份,登录主数据库。
sqlplus strmadmin/strmadmin
#启动Capture进程
begin
dbms_capture_adm.start_capture(
capture_name => 'capture_PROD');
end;
/
十五、停止STREAM
#以strmadmin身份,登录主数据库。
sqlplus strmadmin/strmadmin
#停止Capture进程
begin
dbms_capture_adm.stop_capture(
capture_name => 'capture_PROD');
end;
/
#以strmadmin身份,登录从数据库。
sqlplus strmadmin/strmadmin
#停止Apply进程
begin
dbms_apply_adm.stop_apply(
apply_name => 'apply_TESTDB');
end;
/
十六、清除所有配置信息
要清楚Stream配置信息,需要先执行第十五步,停止Stream进程。
接着执行:
#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin
exec DBMS_STREAMS_ADM.remove_streams_configuration();
#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin
exec DBMS_STREAMS_ADM.remove_streams_configuration();
问题诊断
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
------------------------------ ------------------------------ --------
CAPTURED_SCN APPLIED_SCN
------------ -----------
CAPTURE_PROD PROD_QUEUE ENABLED
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可以更大的提升数据库的可用性和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。
SELECT * FROM SYS.DBA_APPLY_ERROR;
SELECT * FROM SYS.STREAMS$_PROCESS_PARAMS;
SELECT * FROM SYS.STREAMS$_RULES;
SELECT * FROM SYS.STREAMS$_APPLY_PROCESS;
SELECT * FROM SYS.STREAMS$_APPLY_MILESTONE;
SELECT * FROM SYS.STREAMS$_APPLY_PROGRESS;
SELECT * FROM SYS.DBA_APPLY_DML_HANDLERS;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14663377/viewspace-1034861/ ,如需转载,请注明出处,否则将追究法律责任。