前言
日益增長的分布式應用需求要求實現更好分布式的軟件環境不斷推動著分布式技術的進步Oracle數據復制是實現分布式數據環境的一種技術通過在不同的物理站點拷貝數據來建立分布式數據環境它與分布式數據庫不同在分布式數據庫中雖然每個數據對象也對所有的站點可用但是特定的數據對象只存在於一個特定的站點中而數據復制實現所有的站點都有相同數據對象的可用拷貝
在一個典型的分布式商業應用中經常需要把個地區的數據備份到總部的數據庫中一方面可以作為一種備份方式另一方面也方便總部應用中的綜合統計這是Oracle數據復制中的簡單應用本文將以這樣一個例子講述如何實現Oracle數據復制
實際情況是A公司總部在北京有三個營業部分別位於上海(ORACLESHANGHAICOM)杭州(ORACLEHANGZHOUCOM)和武漢(ORACLEWUHANCOM)三個營業部的軟件系統相同數據庫結構也相同現在需要把三個營業部的數據全部備份到總部的數據庫中
准備工作
在進行復制之前需要准備的東西很多當然最基礎就是網絡必須暢通之後需要收集一些復制環境的基本信息
. 需要復制的數據庫站點的數量
. 每個站點的Oracle版本號
. 每個需要復制的數據庫的大小
. 每個數據庫所使用的字符集
. 每個需要復制的數據所用的方案名
收集完環境信息可以開始建立總部的集中數據庫集中數據庫要求版本高於所有主戰點的版本最好所有的數據庫都是用相同的字符集建好庫後為每個主站點的備份數據分別建一個表空間表空間大於需要復制的數據量至於預留以後的發展空間視實際情況而定
為每個主站點的對應復制數據建立方案如果各個主站點所使用的方案名不同在集中數據庫站點分別建立名稱相同的對應方案否則為各主站點的復制數據分別建立相應的方案名實際情況是後者各營業部的數據庫都是用Oracle的方案名這裡我們建立三個對應方案SHORACLHZORACL 和WHORACL所有數據庫的版本都是i
基本概念
復制之前先解釋一下復制中的幾個概念
.主站點(Mater Site)在復制過程中提供數據源的站點如上圖中的上海數據庫站點
.實體化視圖站點(Materialized View Site)實體化視圖復制中的目標站點如上圖中的北京數據庫站點
.多主體站點復制(Multimaster Replication)復制環境中的站點都是主站點對復制的數據庫對象有相同的管理權限
.實體化視圖復制(Materialized View Replication) 一個主體站點提供源復制對象一個實體化視圖站點拷貝主站點數據
.實體化視圖(Materialized View)在實體化視圖站點為每個復制表或者視圖建立一個對應的表保存相應的數據該表只能通過Oracle的復制機制進行增刪改數據的操作
. 快速刷新完全刷新和強制刷新復制過程中的三種刷新方式快速刷新只復制源數據對象的改變部分完全刷新每次都拷貝一遍源數據對象強制刷新是數據庫的一個折衷方案如果快速刷新失敗則使用完全刷新
. 主體組(Master Group)主體站點中被復制的源數據對象的集合
. 實體化視圖組(Materialized View Site)實體化視圖站點中復制對象的集合
. 實體化視圖日志(Materialized View Log)實體化視圖復制中使用快速刷新時記錄主體源數據對象操作日志的表
同步復制和異步復制就不解釋了本例采用每天一次的異步復制
進行復制
配置好本地服務名分別為上海站點SH杭州站點HZ武漢站點WH北京站點BJ進入沒有登錄的sqlplus讓我們開始復制!
一.設置主站點
這裡以上海主站點設置為例
.連接主站點創建復制管理員並授予相應的權限復制管理員是管理整個復制環境並創建復制對象的用戶只有數據管理員可以建立主體組和實體化視圖組
connect system/passwd@SH create user repadmin identified by repadmin;
begin dbms_repcat_admingrant_admin_any_schema( username=>repadmin);
end;
/grant comment any table to REPADMIN; grant lock any table to REPADMIN;
後面的兩個grant語句使復制管理員可以為任何表建立實體化視圖日志如果想改用戶可以使用視圖管理器還需要下面的命令
grant select any dictionary to REPADMIN;
.注冊傳播方傳播方會將主體站點的延遲事務隊列推入其他主體站點或者實體化視圖站點
begin dbms_defer_sysregister_purpagator(username=>repadmin);
end;
.調度清除作業該作業會定時清除延遲事務隊列並用傳播方將延遲事務推入其他主體站點或者實體化視圖站點先更換用戶
disconnect; connect repadmin/repadmin@SH;
begin dbms_defer_sysschedule_purge( next_date=>sysdateinterval=>sysdate + delay_seconds=>);
end;
next_date下一次執行日期sysdate表示立即
interval間隔時段sysdate + 表示間隔一天sysdate+ /表示間隔一小時
delay_seconds當延遲隊列沒有延遲事件時停止被次清除操作的延遲時間
.為實體化視圖站點建立復制代理創建復制代理用戶並授予視圖接受方權限復制代理是復制接收方連接主體站點的用戶
disconnect;
connect system/passwd@SH;
create user proxy_bjoracle identified by proxy_bjoracle;
begin dbms_repcat_adminregister_user_repgroup( user_name=>proxy_bjoracle privilege_type => proxy_snapadminlist_of_gnames => NULL);
end;
/grant select_catalog_role to proxy_bjoracle;
. 創建主體組
disconnect; connect repadmin/repadmin@SH;
begin dbms_repcatcreate_master_repgroup(gname=>sh_rep);
end; /
. 向主體組中添加復制對象
a) 添加表
begin dbms_repcatcreate_master_repobject( gname=>sh_rep type=>TABLE oname=> CREDIT_CARD sname=>SHORACL use_existing_object=>TRUE copy_rows=>TRUE); end;
b) 添加索引
begin dbms_repcatcreate_master_repobject( gname=>sh_rep type=>INDEX oname=> INDEX_CREDIT_CARD sname=>SHORACL use_existing_object=>TRUE copy_rows=>FALSE); end; /
. 如果添加的表沒有主鍵需要設置可以代替主鍵的列或者列的集合
begin dbms_repcatset_columns( sname => SHORACL oname => CREDIT_CARD column_list => CREDIT_CARD_ID); end; /
. 在主體組中的數據對象可以被復制之前必須為他們生成復制支持該方法為復制創建必要的觸發器包或者存儲過程
begin dbms_repcatgenerate_replication_support( sname=>SHORACL oname=> CREDIT_CARD type=>TABLE min_communication=>TRUE); end; /
. 為快速刷新創建實體化視圖日志
create materialized view log on SHORACL CREDIT_CARD;
如果是沒有主鍵的表示用一下語句
create materialized view log on SHORACL CREDIT_CARD with rowid excluding new values;
.啟動復制
begin dbms_repcatresume_master_activity( name=>sh_rep); end; /
二.設置實體化視圖站點
.創建復制管理員並授予相應的權限
disconnect; connect system/passwd@BJ; create user mvadmin identified by mvadmin; begin dbms_repcat_admin grant_admin_any_schema(username=> mvadmin); end; /grant comment any table to mvadmin; grant lock any table to mvadmin; grant select any dictionary to mvadmin;
.注冊傳播方
begin dbms_defer_sysregister_propagator( username => mvadmin); end; /
.公共數據庫連接需要每個復制需要創建三個數據庫連接公共數據庫連接指定數據庫的全局名稱
create public database link ORACLSH using oracleshanghai com;
Using子句後跟的是全局數據庫名或者是連接字符串
create public database link ORACLSH using (description= (address=(protocol=tcp)(host=)(port=)) (connect_data=(service_name=oracl)))
.建立清除延遲事務隊列調度作業
disconnect; connect mvadmin/mvadmin@BJ; begin dbms_defer_sysschedule_purge( next_date => sysdate interval => /*:hr*/ sysdate + delay_seconds => rollback_segment => ); end;
.建立復制管理員mvadmin的數據庫連接
create database link ORACLSH connect to proxy_bjoracle identified by proxy_bjoralce Connect to Identified by 子句指明用什麼用戶連接遠程數據庫
.建立復制調度數據庫連接作業
begin dbms_defer_sysschedule_push( destination => orazjkinterval => /*:hr*/ sysdate + next_date => sysdatestop_on_error => false delay_seconds => parallelism => ); end; /
.授予SHORACL用戶(對應SHORACL方案)
相應的權限建立實體化視圖
disconnect;
connect system/passwd@BJ;
grant alter session to crm;
grant create cluster to crm;
grant create database link to crm;
grant create sequence to crm;
grant create session to crm;
grant create synonym to crm;
grant create table to crm;
grant create view to crm;
grant create procedure to crm;
grant create trigger to crm;
grant unlimited tablespace to crm;
grant create type to crm;
grant create any snapshot to crm;
grant alter any snapshot to crm;
.建立復制方案的數據庫連接
disconnect;
connect SHORACL/SHORACL@BJ;
create database link ORACLSH connect to ORACL identified by ORACL;
復制方案的數據庫連接和復制管理員的數據庫連接要和system用戶間裡的對應公共數據庫連接使用相同的名字在調度連接時將使用公共數據庫連接中指定的數據庫全局名或者連接字符串
.建立實體化視圖
disconnect;
connect mvadmin/mvadmin@BJ;
create materialized view SHORACLCREDIT_CARD refresh fast wit h pr imar y key as sele ct * from ORA CL CREDIT_CARD@ORACLSH;
@後面是數據庫連接名如果該表沒有主鍵則使用rowid來刷新
create materialized view SHORACL CREDIT_CARD refresh fast with rowid as select * from ORACL CREDIT_CARD@ORACLSH;
.為多個視圖建立刷新組
begin dbms_refreshmake ( name => mvadminsh_refreshlist => next_date => sysdateinterval => sysdate + implicit_destroy => falserollback_seg => push_deferred_rpc => truerefresh_after_errors => false); end;
.向刷新組中添加復制對象
begin dbms_refreshadd (name => mvadminsh_refreshlist => SHORACLCREDIT_CARD lax => true); end; /
三.檢查復制進程
.查看sysdba_jobs視圖是否生成了足夠的作業
經過以上的步驟應該有三個作業分別是清除作業調度作業和刷新作業查看視圖的what字段是否有下面的內容
a) declare rc binary_integer; begin rc := sysdbms_defer_sys purge( delay_seconds=>);
end;
b) declare rc binary_integer; begin rc := sysdbms_defer_sys push(destination=>ORACLSH stop_on_error=>FALSE delay_seconds=> parallelism=>);
end;
c) dbms_refreshrefresh(MVADMINSH_REFRESH);
如果排除其它系統作業本例中杭州和武漢的數據庫復制建立之後將會有個作業(如果為每個復制分別建立刷新組的話)清除作業始終只有一個每個復制對應一個調度作業每個刷新組對應一個刷新作業
.查看job_queue_processes參數確保該參數不為零(數據庫的默認值是零)如果該參數為零除非每次手工執行刷新否則系統不會自動刷新復制數據
.確保復制執行之後觀察sysdba_jobs視圖的failures字段如果復制在刷新過程中除錯Oracle會自動在分鐘之後再次嘗試刷新失敗之後再在分鐘分鐘分鐘之後嘗試刷新直到失敗次數達到次或者間隔時間超過作業設置的間隔時間該作業將被標記為中斷Oracle不再執行該作業要重新執行改作業使用dbms_job包的run過程
begin dbms_jobrun(job_no); end; /
job_no 是sysdba_jobs 的Job字段的值作業號在重新執行因出錯而中斷的作業前需要手工找到出錯點並更正
總結
本文只是使用了Oracle高級復制中最簡單的功能Oracle的高級復制還提供可更新視圖和復雜的只讀實體化視圖復制當然並不是我們都要去用高級復雜強大的功能在具體應用的時候還要根據系統功能和性能需求選擇適當的復制技術
From:http://tw.wingwit.com/Article/program/Oracle/201311/18124.html