oracle 高階複製

gaoyj1973發表於2008-06-17

(轉載自 http://viewtoo.sharera.com/blog/BlogTopic/31079.htm)

日益增長的分散式應用需求要求實現更好分散式的軟體環境,不斷推動著分散式技術的進步。Oracle資料複製是實現分散式資料環境的一種技術,透過在不同的物理站點複製資料來建立分散式資料環境。它與分散式資料庫不同,在分散式資料庫中,雖然每個資料物件也對所有的站點可用,但是特定的資料物件只存在於一個特定的站點中。而資料複製實現所有的站點都有相同資料物件的可用複製。

在一個典型的分散式商業應用中經常需要把個地區的資料備份到總部的資料庫中,一方面可以作為一種備份方式,另一方面也方便總部應用中的綜合統計。這是Oracle資料複製中的簡單應用,本文將以這樣一個例子,講述如何實現Oracle資料複製。

實際情況是,A公司總部在北京,有三個營業部分別位於上海(ORACLE.SHANGHAI.COM)、杭州(ORACLE.HANGZHOU.COM)和武漢(ORACLE.WUHAN.COM)。三個營業部的軟體系統相同,資料庫結構也相同。現在需要把三個營業部的資料全部備份到總部的資料庫中。

準備工作

在進行復制之前需要準備的東西很多,當然最基礎就是網路必須暢通,之後需要收集一些複製環境的基本資訊:

1. 需要複製的資料庫站點的數量。

2. 每個站點的Oracle版本號。

3. 每個需要複製的資料庫的大小。

4. 每個資料庫所使用的字符集。

5. 每個需要複製的資料所用的方案名。

收集完環境資訊,可以開始建立總部的集中資料庫,集中資料庫要求版本高於所有主戰點的版本,最好所有的資料庫都是用相同的字符集。建好庫後為每個主站點的備份資料分別建一個表空間,表空間大於需要複製的資料量,至於預留以後的發展空間視實際情況而定。

為每個主站點的對應複製資料建立方案,如果各個主站點所使用的方案名不同,在集中資料庫站點分別建立名稱相同的對應方案。否則為各主站點的複製資料分別建立相應的方案名。實際情況是後者,各營業部的資料庫都是用Oracle的方案名,這裡我們建立三個對應方案:SHORACL、HZORACL 和WHORACL。所有資料庫的版本都是9i。

基本概念

複製之前先解釋一下複製中的幾個概念:

1.主站點(Mater Site):在複製過程中提供資料來源的站點。如上圖中的上海資料庫站點。

2.實體化檢視站點(Materialized View Site):實體化檢視複製中的目標站點。如上圖中的北京資料庫站點。

3.多主體站點複製(Multimaster Replication):複製環境中的站點都是主站點,對複製的資料庫物件有相同的管理許可權。

4.實體化檢視複製(Materialized View Replication): 一個主體站點提供源複製物件,一個實體化檢視站點複製主站點資料。

5.實體化檢視(Materialized View):在實體化檢視站點為每個複製表或者檢視建立一個對應的表儲存相應的資料,該表只能透過Oracle的複製機制進行增刪改資料的操作。

6. 快速重新整理、完全重新整理和強制重新整理:複製過程中的三種重新整理方式。快速重新整理只複製源資料物件的改變部分;完全重新整理每次都複製一遍源資料物件;強制重新整理是資料庫的一個折衷方案,如果快速重新整理失敗則使用完全重新整理。

7. 主體組(Master Group):主體站點中被複制的源資料物件的集合。

8. 實體化檢視組(Materialized View Site):實體化檢視站點中複製物件的集合。

9. 實體化檢視日誌(Materialized View Log):實體化檢視複製中使用快速重新整理時記錄主體源資料物件操作日誌的表。

同步複製和非同步複製就不解釋了,本例採用每天一次的非同步複製。

進行復制

配置好本地服務名分別為:上海站點:SH,杭州站點:HZ,武漢站點:WH,北京站點:BJ,進入沒有登入的sqlplus,讓我們開始複製!

一.設定主站點。

這裡以上海主站點設定為例。

1.連線主站點,建立複製管理員並授予相應的許可權,複製管理員是管理整個複製環境並建立複製物件的使用者。只有資料管理員可以建立主體組和實體化檢視組。

connect system/passwd@SH 
create user repadmin identified by repadmin; 
begin 
dbms_repcat_admin.grant_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;

2.註冊傳播方,傳播方會將主體站點的延遲事務佇列推入其他主體站點或者實體化檢視站點。

begin 
dbms_defer_sys.register_purpagator(username=>’repadmin’); 
end;

3.排程清除作業,該作業會定時清除延遲事務佇列並用傳播方將延遲事務推入其他主體站點或者實體化檢視站點。先更換使用者:

disconnect; 
connect repadmin/repadmin@SH; 
begin 
dbms_defer_sys.schedule_purge( 
next_date=>sysdate,interval=>’sysdate + 1’,delay_seconds=>0); 
end;

next_date:下一次執行日期,sysdate表示立即。

interval:間隔時段,sysdate + 1表示間隔一天,sysdate+ 1/24表示間隔一小時。

delay_seconds:當延遲佇列沒有延遲事件時停止被次清除操作的延遲時間。

4.為實體化檢視站點建立複製代理。建立複製代理使用者並授予檢視接受方許可權。複製代理是複製接收方連線主體站點的使用者:

disconnect; 
connect system/passwd@SH; 
create user proxy_bjoracle identified by proxy_bjoracle; 
begin 
dbms_repcat_admin.register_user_repgroup( 
user_name=>’proxy_bjoracle, 
privilege_type => ’proxy_snapadmin’,list_of_gnames => NULL); 
end; 
/
grant select_catalog_role to proxy_bjoracle;

5. 建立主體組。

disconnect; 
connect repadmin/repadmin@SH; 
begin 
dbms_repcat.create_master_repgroup(gname=>’sh_rep’); 
end; 
/

6. 向主體組中新增複製物件

a) 新增表:

begin 
dbms_repcat.create_master_repobject( 
gname=>’sh_rep’, 
type=>’TABLE’, 
oname=>’ CREDIT_CARD’ 
sname=>’SHORACL’ 
use_existing_object=>TRUE, 
copy_rows=>TRUE); 
end;

b) 新增索引

begin 
dbms_repcat.create_master_repobject( 
gname=>’sh_rep’, 
type=>’INDEX’, 
oname=>’ INDEX_CREDIT_CARD’ 
sname=>’SHORACL’ 
use_existing_object=>TRUE, 
copy_rows=>FALSE); 
end; 
/

7. 如果新增的表沒有主鍵需要設定可以代替主鍵的列或者列的集合

begin 
dbms_repcat.set_columns( 
sname => ’SHORACL’, 
oname => ’ CREDIT_CARD ’, 
column_list => ’ CREDIT_CARD_ID’); 
end; 
/

8. 在主體組中的資料物件可以被複制之前,必須為他們生成複製支援。該方法為複製建立必要的觸發器、包或者儲存過程:

begin 
dbms_repcat.generate_replication_support( 
sname=>’SHORACL’, 
oname=>’ CREDIT_CARD’, 
type=>’TABLE’, 
min_communication=>TRUE); 
end; 
/

9. 為快速重新整理建立實體化檢視日誌:

create materialized view log on SHORACL. CREDIT_CARD;

如果是沒有主鍵的表示用一下語句:

create materialized view log on SHORACL. CREDIT_CARD with 
rowid excluding new values;

10.啟動複製:

begin 
dbms_repcat.resume_master_activity( 
name=>’sh_rep’); 
end; 
/

二 .設定實體化檢視站點。

1.建立複製管理員並授予相應的許可權:

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;

2.註冊傳播方:

begin 
dbms_defer_sys.register_propagator( 
username => ’mvadmin’); 
end; 
/

3.公共資料庫連線。需要每個複製需要建立三個資料庫連線。公共資料庫連線指定資料庫的全域性名稱:

create public database link ORACLSH using ’oracle.shanghai. 
com’;

Using子句後跟的是全域性資料庫名或者是連線字串。

create public database link ORACLSH using ’(description= 
(address=(protocol=tcp)(host=127.0.0.1)(port=1521)) 
(connect_data=(service_name=oracl)))’

4.建立清除延遲事務佇列排程作業:

disconnect; 
connect mvadmin/mvadmin@BJ; 
begin 
dbms_defer_sys.schedule_purge( 
next_date => sysdate, 
interval => ’/*1:hr*/ sysdate + 1’, 
delay_seconds => 0, 
rollback_segment => ’’); 
end;

5.建立複製管理員mvadmin的資料庫連線:

create database link ORACLSH connect to proxy_bjoracle 
identified by proxy_bjoralce 
Connect to ... Identified by ...子句指明用什麼使用者連線遠端資料庫

6.建立複製排程資料庫連線作業:

begin 
dbms_defer_sys.schedule_push( 
destination => ’ora92zjk’,interval => ’/*1:hr*/ sysdate + 1’, 
next_date => sysdate,stop_on_error => false, 
delay_seconds => 0,parallelism => 0); 
end; 
/

7.授予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;

8.建立複製方案的資料庫連線:

disconnect; 
connect SHORACL/SHORACL@BJ; 
create database link ORACLSH connect to ORACL identified 
by ORACL;

複製方案的資料庫連線和複製管理員的資料庫連線要和system使用者間裡的對應公共資料庫連線使用相同的名字,在排程連線時將使用公共資料庫連線中指定的資料庫全域性名或者連線字串。

9.建立實體化檢視:

disconnect; 
connect mvadmin/mvadmin@BJ; 
create materialized view SHORACL.CREDIT_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;

10.為多個檢視建立重新整理組:

begin 
dbms_refresh.make ( 
name => ’mvadmin.sh_refresh’,list => ’’, 
next_date => sysdate,interval => ’sysdate + 1’, 
implicit_destroy => false,rollback_seg => ’’, 
push_deferred_rpc => true,refresh_after_errors => false); 
end;

11.向重新整理組中新增複製物件:

begin 
dbms_refresh.add (name => ’mvadmin.sh_refresh’,
list => ’SHORACL.CREDIT_CARD ’,lax => true); 
end; 
/

三.檢查複製程式。

1.檢視sys.dba_jobs檢視是否生成了足夠的作業。

經過以上的步驟應該有三個作業分別是清除作業、排程作業和重新整理作業,檢視檢視的what欄位是否有下面的內容:

a) declare rc binary_integer; begin rc := sys.dbms_defer_sys. 
purge( delay_seconds=>0); end; 
b) declare rc binary_integer; begin rc := sys.dbms_defer_sys. 
push(destination=>’ORACLSH’, stop_on_error=>FALSE, 
delay_seconds=>0, parallelism=>0); end; 
c) dbms_refresh.refresh(’"MVADMIN"."SH_REFRESH"’);

如果排除其它系統作業本例中杭州和武漢的資料庫複製建立之後將會有7個作業(如果為每個複製分別建立重新整理組的話),清除作業始終只有一個。每個複製對應一個排程作業,每個重新整理組對應一個重新整理作業。

2.檢視job_queue_processes引數,確保該引數不為零(資料庫的預設值是零),如果該引數為零,除非每次手工執行重新整理,否則系統不會自動重新整理複製資料。

3.確保複製執行之後,觀察sys.dba_jobs檢視的failures欄位。如果複製在重新整理過程中除錯,Oracle會自動在1分鐘之後再次嘗試重新整理,失敗之後再在2分鐘、4分鐘、8分鐘..之後嘗試重新整理,直到失敗次數達到16次或者間隔時間超過作業設定的間隔時間,該作業將被標記為中斷,Oracle不再執行該作業。要重新執行改作業使用dbms_job包的run過程:

begin 
dbms_job.run(job_no); 
end; 
/

job_no 是sys.dba_jobs 的Job欄位的值,作業號。在重新執行因出錯而中斷的作業前,需要手工找到出錯點,並更正。

總結

本文只是使用了Oracle高階複製中最簡單的功能,Oracle的高階複製還提供可更新檢視和複雜的只讀實體化檢視複製,當然並不是我們都要去用高階複雜強大的功能,在具體應用的時候,還要根據系統功能和效能需求,選擇適當的複製技術。

[@more@]

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

相關文章