建立Oracle 10gR2的local stream和downstream real-time apply 流複製

silriver發表於2009-07-08

建立Oracle 10gR2的local stream和downstream real-time apply 流複製

簡單的流複製實驗,bug還不是一般的多,10.2.0.1到10.2.0.4都試過了。一共碰上7個bug,看來只能在小應用上玩玩了,patch需要儘量打全,有的人可能找不到opatch在哪裡,其實現在opatch不需要下載,都是自帶的,就在$ORACLE_HOME下的OPatch


使用local捕捉的話,雖然可以減少網路流量,但是增加了解析的消耗,加大了主庫負擔,同時在配置失敗或者出問題時,維護比較麻煩,所以綜合來說(不考慮bug因素)還是使用downstream要好。
首先2個庫必須配置tnsnames,保證互相可以連線,主庫必須啟用歸檔,輔庫如果使用arch傳輸的非real-time apply的downstream,可以不用歸檔,但如果要啟用實時的apply,必須使用歸檔模式。local stream模式的情況下,副庫不需要設定歸檔,主庫甚至連log_archive_dest_2也不需要配置。複製的表最好都有主鍵,不然stream光依靠SUPPLEMENTAL LOG DATA似乎很容易崩潰。。。
其次要設定:
alter system set global_names=TRUE scope=both;
alter system set "_job_queue_interval"=1 scope=spfile;
alter system set aq_tm_processes=1;
alter system set streams_pool_size=200m scope=both;
至於open_links,job_queue_processes等要看實際站點數決定是否修改
注意streams_pool_size一定要夠大,因為如果啟用了SGA_TARGET,ORACLE可能分配很少記憶體給stream導致大量資訊被spill到磁碟導致查詢DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部狀態ENABLED但就是沒有資料被同步。
同時設定_job_queue_interval也是為了提高佇列檢查時間,防止apply出問題。
主庫:
用sys釋出下面的命令:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
grant dba to stadm identified by stadm;
exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('STADM');
alter database rename global_name to JIAOYOU.COM;
create public database link test.com using 'test';
alter system set log_archive_dest_2='service=test arch noregister' scope=both;
這裡注意每個詞之間都是一個空格,多了可能發生不能識別的問題,如果是real-time apply的話:
alter system set log_archive_dest_2='service=test lgwr async noregister' scope=both;
副庫:
用sys釋出下面的命令:
grant dba to stadm identified by stadm;
exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('STADM');
alter database rename global_name to TEST.COM;
create public database link jiaoyou.com using 'jiaoyou';
接下來使用stadm到主庫:
create directory dir_source as '/u01/source';
create database link test.com connect to stadm identified by stadm using 'test';
接下來使用stadm到副庫:
create directory dir_dest as '/u01/dest'
create database link jiaoyou.com connect to stadm identified by stadm using 'jiaoyou';
然後用stadm在2邊的資料庫執行select * from global_name@對方的global_name;
如果能顯示錶示沒有問題。
接下來使用stadm到副庫:
BEGIN
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names => 'SKY',
source_directory_object => 'DIR_SOURCE',
destination_directory_object => 'DIR_DEST',
source_database => 'JIAOYOU.COM',
destination_database => 'TEST.COM',
perform_actions => true,
dump_file_name => 'SKY.dmp',
capture_queue_table => 'rep_capture_queue_table',
capture_queue_name => 'rep_capture_queue',
capture_queue_user => NULL,
apply_queue_table => 'rep_dest_queue_table',
apply_queue_name => 'rep_dest_queue',
apply_queue_user => NULL,
capture_name => 'capture_sky',
propagation_name => 'prop_sky',
apply_name => 'apply_sky',
log_file => 'export_sky.clg',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA);
END;
/

上面的DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS如果在主庫上執行,就成為了local stream複製。downstream環境中,capture,propagation,apply都在複製節點上執行,而local stream時,apply在複製節點,capture和propagation則在主節點上,查詢情況時不要搞錯.如果配置成一個local stream,以後還要新增一個local stream的複製站點的話,只需要配置好複製站點,然後把queue和capture,propagation,apply的名字改掉:

BEGIN
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names => 'SKY',
source_directory_object => 'DIR_SOURCE',
destination_directory_object => 'DIR_DEST',
source_database => 'primary.COM',
destination_database => 'membj.COM',
perform_actions => true,
dump_file_name => 'SKY.dmp',
capture_queue_table => 'n_rep_cap_queue_table',
capture_queue_name => 'n_rep_cap_queue',
capture_queue_user => NULL,
apply_queue_table => 'n_rep_dest_queue_table',
apply_queue_name => 'n_rep_dest_queue',
apply_queue_user => NULL,
capture_name => 'capturenew_sky',
propagation_name => 'propnew_sky',
apply_name => 'applynew_sky',
log_file => 'export_sky.clg',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA);
END;
/

就可以看到在os的目錄dest和source上有檔案生成,開始初始化流複製環境。

結束後檢查副庫的DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION是否狀態正常。
如果要啟用實時複製還需要新增副庫的standby redo
alter database add standby logfile '/u01/app/oradata/test/stdbyredo01.log' size 50m;
alter database add standby logfile '/u01/app/oradata/test/stdbyredo02.log' size 50m;
alter database add standby logfile '/u01/app/oradata/test/stdbyredo03.log' size 50m;
alter database add standby logfile '/u01/app/oradata/test/stdbyredo04.log' size 50m;
並修改
BEGIN
DBMS_CAPTURE_ADM.SET_PARAMETER(
capture_name => 'CAPTURE_SKY',
parameter => 'downstream_real_time_mine',
value => 'y');
END;
/
然後在主庫端切換一下redo就可以看到副庫alert中顯示開始挖掘standby redo了。目前實施複製問題比較多,在10.0.2.3上經常出現無故apply abort的情況,需要stop 3個程式:
exec dbms_apply_adm.stop_apply('apply_sky');
exec dbms_propagation_adm.stop_propagation('prop_sky');
exec DBMS_CAPTURE_ADM.STOP_CAPTURE('capture_sky');
再重新start,然後在主庫alter system archive log current;才會繼續同步
如果發現資料遲遲不同步可以檢查v$buffer_queue中的spill,如果spill很大表示捕獲了但是沒有apply。
在解除安裝環境時,exec dbms_streams_adm.remove_streams_configuration最好先去dest上執行,不然可能會報錯ORA-24042,導致清理環境情況變複雜。
執行後drop複製的schema,重啟db,不然v$buffer_queue會殘留資訊。同樣的,如果做db級的流複製:

begin
DBMS_STREAMS_ADM.MAINTAIN_GLOBAL(
source_directory_object => 'DIR_SOURCE',
destination_directory_object => 'DIR_DEST',
source_database => 'primary.com',
destination_database => 'stream.com',
perform_actions => true,
dump_file_name => 'streams_rep.dmp',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK);
end;
/

如果發現問題重做,必須把複製的主要使用者連都刪除,否則會出現很多意外錯誤.

如果要作多使用者的複製,必須藉助DBMS_UTILITY.UNCL_ARRAY

DECLARE
us DBMS_UTILITY.UNCL_ARRAY;
BEGIN
US(1):='MSG';
US(2):='ol';
US(3):='music';
US(4):='FRIEND';
US(5):='collect';
US(6):='blog';
US(7):='ask';
US(8):='cms';
US(9):='ALBUM';
US(10):='MANAGE';
US(11):='shop';
US(12):='cm';
US(13):='GROUPTEAM';
US(14):='JYGH';
US(15):='NEWAP';
US(16):='PK';
US(17):='API';
US(18):='video';
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names => us,
source_directory_object => 'DIR_SOURCE',
destination_directory_object => 'DIR_DEST',
source_database => 'PRIMARY.COM',
destination_database => 'STREAM.COM',
perform_actions => true,
dump_file_name => 'menhu.dmp',
capture_queue_table => 'rep_capture_queue_table',
capture_queue_name => 'rep_capture_queue',
capture_queue_user => NULL,
apply_queue_table => 'rep_dest_queue_table',
apply_queue_name => 'rep_dest_queue',
apply_queue_user => NULL,
capture_name => 'capture_menhu',
propagation_name => 'prop_menhu',
apply_name => 'apply_menhu',
log_file => 'export_sky.clg',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK);
END;
/

另外如果發生APPLY異常aborted的情況,可以觀察DBA_APPLY中的ERROR_MESSAGE,比如發現下面的資訊:

ORA-26714: User error encountered while applying

這時候再去檢查dba_apply_error可以發現:

ORA-01422: exact fetch returns more than requested number of rows

這類錯誤最好的解決方法就是每張複製的表都生成主鍵。然後就是針對情況進行解決了,還是要多看alert和trc檔案才能找到原因

另外發現一個downstream real-time apply的最大的bug,restart 副庫後,副庫就不再同步,查詢V$STREAMS_CAPTURE,capture就停止在PAUSED FOR FLOW CONTROL上,其它的程式都是enable的,只能重新初始化複製環境。所以local stream捕捉相對來說還是比較穩定的,速度上也不錯,事務量不大的時候幾乎做到了實時複製。

另外還有個要命的bug,刪除環境後,queue不能刪除

使用stadm查詢:

SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
REP_CAPTURE_QUEUE_TABLE TABLE
AQ$_REP_CAPTURE_QUEUE_TABLE_S TABLE
AQ$_REP_CAPTURE_QUEUE_TABLE_T TABLE
AQ$REP_CAPTURE_QUEUE_TABLE_S VIEW
AQ$_REP_CAPTURE_QUEUE_TABLE_H TABLE
SYS_IOT_OVER_52389 TABLE
AQ$_REP_CAPTURE_QUEUE_TABLE_G TABLE
AQ$_REP_CAPTURE_QUEUE_TABLE_I TABLE

。。。。。。。

需要使用:

exec DBMS_AQADM.DROP_QUEUE_TABLE('REP_CAPTURE_QUEUE_TABLE',true);

exec DBMS_AQADM.DROP_QUEUE_TABLE('REP_DEST_QUEUE_TABLE',true);

來drop對應的queue table。

總的來說,local stream相對穩定,downstream 的real-time apply看上去很美。。。。但是因為在10gR2中剛剛推出,bug多得足以讓任何DBA膽寒 - -

維護local stream需要注意,如果要新增新的複製站點,capture_queue_table和apply_queue_table以及queue的名字一定不能重複,否則出錯後使用dbms_streams_adm.recover_operation會造成之前的站點因為queue被禁用而停止複製,同時主庫會報:

ORA-25207: enqueue failed, queue STADM.REP_CAPTURE_QUEUE is disabled from enqueueing

如果在複製schema的環境中需要新增新的schema,只需要重複執行:

BEGIN
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names => 'SKY',
source_directory_object => 'DIR_SOURCE',
destination_directory_object => 'DIR_DEST',
source_database => 'JIAOYOU.COM',
destination_database => 'TEST.COM',
perform_actions => true,
dump_file_name => 'SKY.dmp',
capture_queue_table => 'rep_capture_queue_table',
capture_queue_name => 'rep_capture_queue',
capture_queue_user => NULL,
apply_queue_table => 'rep_dest_queue_table',
apply_queue_name => 'rep_dest_queue',
apply_queue_user => NULL,
capture_name => 'capture_sky',
propagation_name => 'prop_sky',
apply_name => 'apply_sky',
log_file => 'export_sky.clg',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK);
END;
/

就可以了,queue和table都是可以reuse的

Dynamic Streams views

Streams View Name Streams View Name from any RAC instance
V$STREAMS_CAPTURE GV$STREAMS_CAPTURE
V$STREAMS_APPLY_COORDINATOR GV$STREAMS_APPLY_COORDINATOR
V$STREAMS_APPLY_READER GV$STREAMS_APPLY_READER
V$STREAMS_APPLY_SERVER GV$STREAMS_APPLY_SERVER
V$STREAMS_POOL_ADVICE GV$STREAMS_POOL_ADVICE
V$STREAMS_TRANSACTION GV$STREAMS_TRANSACTION
V$BUFFERED_PUBLISHERS GV$BUFFERED_PUBLISHERS
V$BUFFERED_QUEUES GV$BUFFERED_QUEUES
V$BUFFERED_SUBSCRIBERS GV$BUFFERED_SUBSCRIBERS
V$PROPAGATION_RECEIVER GV$PROPAGATION_RECEIVER
V$PROPAGATION_SENDER GV$PROPAGATION_SENDER
V$RULE GV$RULE
V$RULE_SET GV$RULE_SET
V$RULE_SET_AGGREGATE_STATS GV$RULE_SET_AGGREGATE_STATS

Static Streams Views

Capture Views
---------------
DBA_CAPTURE
DBA_CAPTURE_EXTRA_ATTRIBUTES
DBA_CAPTURE_PARAMETERS
DBA_CAPTURE_PREPARED_DATABASE
DBA_CAPTURE_PREPARED_SCHEMAS
DBA_CAPTURE_PREPARED_TABLES

Apply Views
--------------
DBA_APPLY
DBA_APPLY_CONFLICT_COLUMNS
DBA_APPLY_DML_HANDLERS
DBA_APPLY_ENQUEUE
DBA_APPLY_ERROR
DBA_APPLY_EXECUTE
DBA_APPLY_INSTANTIATED_GLOBAL
DBA_APPLY_INSTANTIATED_OBJECTS
DBA_APPLY_INSTANTIATED_SCHEMAS
DBA_APPLY_KEY_COLUMNS
DBA_APPLY_OBJECT_DEPENDENCIES
DBA_APPLY_PARAMETERS
DBA_APPLY_PROGRESS
DBA_APPLY_SPILL_TXN
DBA_APPLY_TABLE_COLUMNS
DBA_APPLY_VALUE_DEPENDENCIES

Propagation & Queue Views Streams Views
-------------------------------------------
DBA_PROPAGATION
DBA_QUEUE_SCHEDULES
DBA_QUEUE_SUBSCRIBERS
DBA_QUEUE_TABLES
DBA_QUEUES

推薦幾個有幫助的metalink文件:

335516.1 Streams Performance Recommendations

437838.1 Recommended Patch for Streams

290605.1 Oracle Streams STRMMON Monitoring Utility

392809.1 11g Streams New Features

418755.1 10.2.0.x.x Streams Recommendations

273674.1 Streams Configuration Report and Health Check Script

230898.1 How To Troubleshoot the Streams Apply Process

421183.1 How To Enable Capture, Propagation, Apply Tracing

729860.1 Troubleshooting Queries in Streams

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/72973/viewspace-608629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章