建立Oracle 10gR2的local stream和downstream real-time apply 流複製
建立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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【PG流複製】Postgresql流複製主備切換SQL
- 檔案的複製通過字元流和緩衝流(Buffered)字元
- Stream推薦安裝---10gR2之一
- Oracle Linux 6.5 安裝Oracle 10gR2LinuxOracle 10g
- PostGreSql 12.6 的流複製(CentOS)SQLCentOS
- Postgres 流複製配置
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- 如何配置 pglogical | PostgreSQL 的流複製SQL
- 複製和引用複製
- 丐版stream流理解和使用
- pg流複製備份
- 2. PostgreSQL 流複製SQL
- Stream流
- Stream流對List集合篩選重複欄位
- JS物件複製:深複製和淺複製JS物件
- node中的流(stream)
- 10GR2下建立物理standby STEP BY STEP
- python深複製和淺複製的區別Python
- 10gR1下Stream複製的column levle privilege(zt)
- redis建立主從複製的過程Redis
- Stream流求和
- MySQL 複製全解析 Part 11 使用xtrabackup建立MySQL複製MySql
- python 深複製和淺複製Python
- JavaScript 淺複製和深複製JavaScript
- js 淺複製和深複製的區別和應用JS
- 論文閱讀 Real-Time Streaming Graph Embedding Through Local Actions 11
- 簡單認識和使用node 中的流(stream)
- [java]利用IO流中的位元組流和緩衝流寫一個複製資料夾的小程式Java
- C#中的物件深複製和淺複製C#物件
- 詳談Javascript中的深複製和淺複製JavaScript
- 流(stream):可讀流篇
- java的Stream流學習Java
- go slice深複製和淺複製Go
- Docker 搭建KingbaseES主備流複製Docker
- [java IO流]之檔案複製Java
- PostgreSQL 13 同步流複製(#2.4)-202104SQL
- restart oracle streamRESTOracle
- ORACLE STREAM ERROROracleError