(本教程展示了Windows環境的oracle數據庫主從同步,Linux環境一樣也可以)
(把主數據庫obpm 和從數據庫orcl 用實際的數據庫名給替換掉)
(配置主從同步后,再配置雙向同步,可能會有表數據重疊,建議在配置雙向同完成后,再導入表數據!)
備注:主、從數據庫都用淡藍色標記了,方便查找替換。
1.環境介紹
主數據庫SID : obpm
操作系統 : win 2003
IP地址 : 192.168.0.1
Global_name :
oracle version: 10.2.0.1
從數據庫SID: orcl
操作系統 : win 2003
IP地址 : 192.168.0.2
Global_name :
oracle version: 10.2.0.1
2.在主/從數據庫設置初始化參數(在主從數據庫都執行以下操作)
(以as sysdba身份,可在sqlplus中執行)
1) 以dba身份登錄
sqlplus / as sysdba
2) 設置參數
alter system set aq_tm_processes=2 scope=both; ---啟用對隊列消息的時間監視 alter system set global_names=true scope=both; ---設置全局名稱為true alter system set undo_retention=3600 scope=both; --設置回滾段時間,默認是900 alter system set streams_pool_size=25M scope=spfile; --sga設置為自動調整情況下不需設置該參數
3)重啟動兩個數據庫,重啟方式:
1.shutdown immediate
2.startup
3.$lsnrctl start(一般都會提示監聽已經啟動)
(windows服務中也可手動啟動監聽)
3.設置主數據庫(obpm )為歸檔mode (以as sysdba身份,可在sqlplus中執行)
1) --查是否歸檔,如是歸檔,請忽略第3點
archive log list;
2) 歸檔設置
shutdown immediate; startup mount; alter database archivelog; alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\Ora\arc\'; ---設置歸檔目錄 (執行此句后,在Windows系統文件夾中看看arc文件夾有沒有創建成功,如果沒有,則手動創建,在執行此語句) alter database open; alter system switch logfile; --相應目錄檢查是否生成arc文件 (如果提示數據庫沒開啟,則先執行alter database open;)
4.主/從數據新建stream管理用戶(在主從數據庫都執行以下操作)
sqlplus / as sysdba; create tablespace tbs_stream datafile 'C:\Ora\tbs_stream01.dbf' size 2000m autoextend on maxsize unlimited segment space management auto; ---創建主環境的Stream專用表空間 execute dbms_logmnr_d.set_tablespace('tbs_stream'); --將logminer的數據字典從system表空間轉移到新建的表空間,防止撐滿system表空間 create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp; --創建用戶 grant dba to strmadmin; --直接給dba權限.
(Drop舊的表空間方法:drop tablespace tbs_stream including contents;)
5.主數據庫網絡環境設置 (就是在主數據庫中增加一個從數據庫的連接服務)
1)主數據庫中添加從數據庫的配置。(通過oracle圖形工具net configuration manager配置,服務名為從數據庫名orcl,並測試與從數據庫是否連通)
2)新建連接orcl的dblink
create public database link orcl connect to strmadmin IDENTIFIED BY strmadmin using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SID= orcl) ) )';
測試dblink:select sysdate from dual@orcl; --測試dblink是否有效
6.從數據庫網絡環境設置 (就是在從數據庫中增加一個主數據庫的連接服務)
1)從數據庫中添加主數據庫的配置。(通過oracle圖形工具net configuration manager配置,服務名為主數據庫名obpm,並測試與從數據庫是否連通)
2)新建連接obpm的dblink
create public database link obpm connect to strmadmin IDENTIFIED BY strmadmin using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SID = obpm) ) )';
測試dblink:select sysdate from dual@obpm; --測試dblink是否有效
7.主數據庫流隊列創建 (可在plsql中的SQL中執行,登錄名應為strmadmin)
connect strmadmin/strmadmin --以strmadmin身份,登錄主數據庫。 begin dbms_streams_adm.set_up_queue(queue_table => 'obpm_queue_table',queue_name => 'obpm_queue'); end; /
8.從數據庫流隊列創建
connect strmadmin/strmadmin --以strmadmin身份,登錄從數據庫。 begin dbms_streams_adm.set_up_queue(queue_table => 'orcl_queue_table',queue_name => 'orcl_queue'); end; /
9.主數據庫創建捕獲進程
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin', streams_type => 'capture', streams_name => 'capture_obpm', queue_name => 'strmadmin.obpm_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => null, inclusion_rule => true); end; /
10.從數據庫實例化strmadmin用戶 (win在CMD命令界面中執行)(這兩個路徑須一致)
exp strmadmin/strmadmin@obpm file='C:\Ora\crm.dmp' object_consistent=y rows=y
在從數據庫新建strmadmin
imp strmadmin/strmadmin@orcl file='C:\Ora\crm.dmp' ignore=y commit=y streams_instantiation=y full=y
11.主數據庫創建傳播進程
connect strmadmin/strmadmin --以strmadmin身份,登錄主數據庫。 begin dbms_streams_adm.add_schema_propagation_rules( schema_name => 'strmadmin', streams_name => 'obpm_to_orcl', source_queue_name => 'strmadmin.obpm_queue', destination_queue_name => 'strmadmin.orcl_queue@orcl', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'obpm', inclusion_rule => true); end;
/
注意:此段語句執行可能會報錯,如果報錯,不用管,繼續執行后面的。
修改propagation休眠時間為0,表示實時傳播LCR,latency以秒為單位
begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'obpm_queue',
destination => 'orcl',
latency => 0);
end;
/
12.從數據創建應用進程
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin', streams_type => 'apply', streams_name => 'apply_orcl', queue_name => 'strmadmin.orcl_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'obpm', inclusion_rule => true); end;
/
13.啟動Stream
1)從數據庫啟動應用進程
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_orcl'); end;
/
2)主數據庫啟動捕獲進程
connect strmadmin/strmadmin begin dbms_capture_adm.start_capture( capture_name => 'capture_obpm'); end;
/
14.現在就可以進行測試了,在crm用戶中作何一個測試表新增數據,刪除數據,增加表,修改表結構,進行同步測試
備注:以上就是主從同步的所有配置,接下來配置雙向同步。
(雙向同步前請測試,主從單向同步是否成功!若成功,則下面進行雙向同步,若不成功,則拉到下面的“問題檢查解決方法處排查問題,主從同步成功后在進行雙向同步!!!”)
雙向同步配置:
1.設置從數據庫(orcl )為歸檔mode (以as sysdba身份,可在sqlplus中執行)
1) 查是否歸檔,如是歸檔,請忽略第3點
archive log list;
2) 歸檔設置
shutdown immediate; startup mount; alter database archivelog; alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\Ora\arc\'; ---設置歸檔目錄 (執行此句后,在Windows系統文件夾中看看arc文件夾有沒有創建成功,如果沒有,則手動創建,在執行此語句) alter database open; alter system switch logfile; --相應目錄檢查是否生成arc文件 (如果提示數據庫沒開啟,則先執行alter database open;)
2.從數據庫(orcl )創建捕獲進程
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin', streams_type => 'capture', streams_name => 'capture_orcl', queue_name => 'strmadmin.orcl_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => null, inclusion_rule => true); end;
/
3.主數據庫(obpm)實例化strmadmin用戶 (win在CMD命令界面中執行)(這兩個路徑須一致)
exp strmadmin/strmadmin@orcl file='C:\Ora\crm.dmp' object_consistent=y rows=y
在主數據庫(obpm)新建strmadmin
imp strmadmin/strmadmin@obpm file='C:\Ora\crm.dmp' ignore=y commit=y streams_instantiation=y full=y
4.從數據庫(orcl)創建傳播進程
connect strmadmin/strmadmin --以strmadmin身份,登錄從數據庫。 begin dbms_streams_adm.add_schema_propagation_rules( schema_name => 'strmadmin', streams_name => 'orcl_to_obpm', source_queue_name => 'strmadmin.orcl_queue', destination_queue_name => 'strmadmin.obpm_queue@obpm', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'orcl', inclusion_rule => true); end;
/
修改propagation休眠時間為0,表示實時傳播LCR,latency以秒為單位
begin dbms_aqadm.alter_propagation_schedule( queue_name => 'orcl_queue', destination => 'obpm', destination_queue => 'obpm_queue', latency => 5); end;
/
5.主數據(obpm)創建應用進程
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin', streams_type => 'apply', streams_name => 'apply_obpm', queue_name => 'strmadmin.obpm_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'orcl', inclusion_rule => true); end; /
6.啟動Stream
1)主數據庫(obpm)啟動應用進程
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_obpm'); end; /
2)從數據庫(orcl)啟動捕獲進程
connect strmadmin/strmadmin begin dbms_capture_adm.start_capture( capture_name => 'capture_orcl'); end; /
以上就是雙向同步的配置,雙向同步完成后,測試是否成功,若不成功,則用下面的“‘主從同步’問題檢查解決方法把主從數據庫名稱調換檢查”
‘主從同步’問題檢查解決方法:
15.停止stream
1)主數據庫停止Capture進程
connect strmadmin/strmadmin begin dbms_capture_adm.stop_capture( capture_name => 'capture_obpm'); end; /
2)從數據庫停止Apply進程
connect strmadmin/strmadmin begin dbms_apply_adm.stop_apply( apply_name => 'apply_orcl'); end; /
16.清除所有配置信息
1)按上述方法停止capture,applya進程
2)分別在主從數據庫執行以下語句
connect strmadmin/strmadmin exec DBMS_STREAMS_ADM.remove_streams_configuration();
17.如何知道捕捉(Capture)進程是否運行正常?
以strmadmin身份,登錄主數據庫,執行如下語句:
SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE;
如果STATUS狀態是ENABLED,表示Capture進程運行正常;
如果STATUS狀態是DISABLED,表示Capture進程處於停止狀態,只需重新啟動即可;
如果STATUS狀態是ABORTED,表示Capture進程非正常停止,查詢相應的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細的信息;同時,Oracle會在跟蹤文件中記錄該信息。
18. 如何知道Captured LCR是否有傳播?
以strmadmin身份,登錄主數據庫,執行如下語句:
SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN FROM DBA_CAPTURE;
如果APPLIED_SCN小於CAPTURED_SCN,則表示在主數據庫一端,要么LCR沒有被dequeue,要么Propagation進程尚未傳播到從數據庫一端。
如果出現此情況,主庫進程重啟下,看看 APPLIED_SCN和CAPTURED_SCN是否相等,若相等,再重啟下從庫進程即可。
19.如何知道Appy進程是否運行正常?
以strmadmin身份,登錄從數據庫,執行如下語句:
SELECT apply_name, apply_captured, status FROM dba_apply;
如果STATUS狀態是ENABLED,表示Apply進程運行正常;
如果STATUS狀態是DISABLED,表示Apply進程處於停止狀態,只需重新啟動即可;
如果STATUS狀態是ABORTED,表示Apply進程非正常停止,查詢相應的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細的信息;
同時,可以查詢DBA_APPLY_ERROR視圖,了解詳細的Apply錯誤信息。
其它錯誤請跟蹤alter.log
注意:
第一步:如果在重啟操作系統,或者數據庫后,出現主從數據庫無法同步的情況時,請用17,18,,19步的方法查看;
第二步:在19步查詢出現“ABORTED”時,請用SELECT apply_name, apply_captured, ERROR_NUMBER, ERROR_MESSAGE, status FROM dba_apply進行查詢;
錯誤原因:
select error_message,error_creation_time from dba_apply_error order by error_creation_time desc;
select * from dba_apply_error order by error_creation_time desc;
會出現:
(用戶沒有實例化)
這時候需要重新在從數據庫這邊系統的cmd中執行實例化用戶即可:
exp strmadmin/strmadmin@obpm file='C:\Ora\crm.dmp' object_consistent=y rows=y
第三步:
從數據庫停止Apply進程
connect strmadmin/strmadmin begin dbms_apply_adm.stop_apply( apply_name => 'apply_orcl'); end; /
從數據庫啟動應用進程
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_orcl'); end; /
這樣就解決了出現的問題。出現問題的原因是在第10步的實例化用戶沒成功(查看windows文件夾下有沒有創建“crm.dmp”文件,如果沒有創建,則說明實例化用戶不成功,重啟后則會出現此錯誤)
以上就是Oracle主從同步和雙向同步的配置,和常見問題的解決方法,一般來說只要按照上面步驟一步一步走,應該沒有問題。
注意的是sql語句后面粘貼復制經常會出現空格,有空格會報錯,這點經常會不小心遇到。遇到問題不用擔心,按照上面的方法進行排查即可,如果真的配錯了,執行清除命令重新配置即可。