Oracle10g新特性之stream流配置

xingfei80發表於2010-07-02

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

[@more@]

一、在主庫建立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 => ,
  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部落格 ” ,連結:http://blog.itpub.net/14663377/viewspace-1034861/,如需轉載,請註明出處,否則將追究法律責任。

相關文章