Oracle 高階複製的概念及配置

tolywang發表於2009-03-06

1. Replication 使用分散式資料庫技術在多個站點之間共享資料。

2. Replicated Database 和Distributed Database 並不一樣,在分散式資料庫系統中資料在多個站點同時有效,但是一個表只會存在於一個站點中,而對於Replication 來說相同
的資料將同時存在於多個站點中。

3. 使用replication 的原因:
1) Availability:也就是提供了優秀的failover 保護
2) Performance:由於有多個server,所以可以將使用者業務分佈在不同的server 上
3) Disconnected computing:實體化檢視允許使用者在和master 斷開後使用資料庫的子集,在重新連線上master 之後再進行兩者的同步。
4) Network load reduction:由於有多個server,所以可以減少master 的網路請求
5) Mass deployment:透過變數產生自定義的實體化檢視以滿足多種需求


4. 在不同的Oracle 發行版本之間以及不同作業系統的Oracle 之間都可以使用Advanced
Replication。


5. Replication 中的幾個概念:

1) replication object:複製物件,指需要作複製的物件(object),包括表,索引,
儲存過程等等。複製物件的更新遵循事務一致性規則(transactionally consistent
manner)。
2) replication groups:複製組,是複製物件(replication object)的集合稱為group,
oracle 以replication group 的形式來管理複製。一個組可以包含多個模式的object,
一個模式也可以有多個組中的object,但是每個replication object 都只能屬於一個
replication group。
3) replication sites:複製站點,包含兩種型別,主體站點(master sites)和實
體化檢視站點(materialized view sites)。一個site 可以擔任一個replication
group 中的mater site 同時又擔任另外一個replication group 中的materialized
view site,注意必須是另外一個組,而不能是同一個replication group。
4) scheduled links:一個資料庫連結(database link),包含一個由使用者定義的計劃,
來將需要更新的事務推到其它的master sites,當建立scheduled link 的時候,oracle
將在本地任務佇列中建立一個任務。
5) master definition site:主體定義站點,大部分的高階複製配置都需要在一個站
點上作,這個站點就是maserdef site。
6. Replication 環境的幾種型別
1) Multimaster Replication
2) Materialized View Replication(也可以稱為是Single Master Replication)
3) Multimaster and Materialized View Hybrid Configurations
Multimaster Replication 和Materialized View Replication 的區別在於:
    前者必須是全表複製而後者可以是master 表的一部分
    前者允許在每一個transaction 之後都進行復制,而後者是屬於批處理複製
    兩者都使用scheduled links 進行資料同步操作。
    Materialized View Replication 中的materialized view 可能有以下幾種型別:
1) Read-Only Materialized Views:只讀的實體化檢視
2) Updatable Materialized Views:允許更新,同時允許將更新複製到master site
3) Writeable Materialized Views:允許更新,但是每次refresh 的時候,更新都會丟失
7. 介紹Multimaster Replication 中的複製方式
1) Asynchronous replication
在一個master 上發生的變化將在推後的時間內更新到其他的master 上
2) Synchronous replication
在一個master 上發生的變化將立刻更新到其他的master 上
3) Procedural replication
必須給每個site 上的包都生成一個wrapper,所有的資料變化應該透過包中的儲存過程完成,當某個master 上的procedure 被呼叫,wapper 將保證其他site 中的儲存過程也被呼叫(同步或者不同步)。將大量的資料操作放到一個procedure 中,然後對於procedure 的呼叫將被同步,用處在於在於有大資料量操作的時候可以減少網路負載。



多主體複製站點的配置步驟
以下操作如果不是明確指出,均在master 資料庫中執行。
1。檢查安裝好的資料庫是否支援高階複製:
SQL> select value from v$option where parameter='Advanced replication';
VALUE
----------------------------------------------------------------
TRUE
確保返回的結果是TRUE,如果是FALSE 則表示需要重新安裝oracle 的高階複製部件。


2。確保資料庫的初始化引數中global_name=true,同時因為高階複製依靠於JOB 來實現,
所以必須保證job_queue_processes 引數大於0,我們可以設定為10。
使用下面的命令更改:
alter system set golbal_name = true
alter system set job_queue_processes = 10

確保init.ora 中包含一下初始化引數定義:
global_names = true
open_links = 4 (備註:一個process 需要4 個link,如果我們建立了多個dblink,並且同時執行,那麼可以把此引數設大,比如以下環境中我們應該設定為open_links = 8)
job_queue_processes = 10

3。用sysdba 許可權分別登入master 和snap 資料庫,檢查雙方的global_name,必須保證
兩邊的域名相同才可以建立正確的dblink。
select * from global_name;
假設顯示結果是master.com,那麼表示該資料庫的域名是com。那麼我們可以設定snap
庫的global_name 是snap.com。
使用以下SQL 設定global_name:
alter database rename global_name to master.com;


4。建立一個PUBLIC DBLINK 連線到snap(此步驟可以省略)

CREATE PUBLIC DATABASE LINK "snap.com" USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.100)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=snap)))';
執行以下SQL 檢查dblink 建立是否成功,如果結果返回snap 的global_name 則表示成功
SQL> select * from global_name@snap.com;
GLOBAL_NAME
---------------------------------------------------------------------------
SNAP.COM
5。建立repadmin 使用者,用於管理高階複製
create user repadmin identified by repadmin default tablespace users temporary
tablespace temp;
execute dbms_defer_sys.register_propagator('repadmin');
grant execute any procedure to repadmin;
execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
execute dbms_repcat_admin.grant_admin_any_schema(username => '"REPADMIN"');
grant comment any table to repadmin;
grant lock any table to repadmin;
grant select any dictionary to repadmin;
6。登入snap 資料庫,重複上面的操作,建立public dblink 以及repadmin 使用者
7。用repadmin 使用者登入master,建立私有資料庫連線
create database link "snap.com" connect to repadmin identified by repadmin;
如果第4 步省略了,沒有建立公有資料庫連線,則需要如下建立,在建立含有qualifier 的
多個資料庫連線時也只能使用下面的方法:
create database link "snap.com@perday" connect to repadmin identified by repadmin
USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.100)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=snap)))';
create database link "snap.com@perhour" connect to repadmin identified by repadmin
USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.100)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=snap)))';
檢查是否建立成功
SQL> select * from global_name@snap.com@perday;
GLOBAL_NAME
------------------------------------------------------------------------------
SNAP.COM
8。建立主體複製組,新增複製物件,操作的資料庫將稱為主體定義站點
建立每天覆制一次的組
execute dbms_repcat.create_master_repgroup(gname => 'rep_gp_day',group_comment=> 'replcation perday',qualifier => '@PERDAY');
建立每小時複製一次的組
execute dbms_repcat.create_master_repgroup(gname => 'rep_gp_hour',group_comment=> 'replcation perhour',qualifier => '@PERHOUR');
備註:以下操作只以rep_gp_day 複製組為例,對於rep_gp_hour 複製組則應該作相應更改
再執行下面的操作。
檢查執行結果
select * from dba_repsites;
--用spool 生成批次執行的SQL
set feedback off;
set pagesize 0;
set heading off;
set verify off;
set linesize 1000;
set trimspool on;
spool filename.sql;
select 'execute dbms_repcat.create_master_repobject(sname=>''test_user'',oname=>'''
|| table_name || ''',type=>''table'',use_existing_object=>true,gname=>''rep_gp_day'');'
CREATE_SQL from tabs;
select 'dbms_repcat.generate_replication_support(''test_user'',''' || table_name ||
''',''table'');' GEN_SQL from tabs;
spool off;
set feedback on;
set pagesize 9999;
set heading on;
set verify on;


   根據不同的情況進行修改
檢查複製組狀態
select gname, master, status from dba_repgroup;
如果該複製組已經處於normal 狀態,那麼在新增複製物件之前必須先停頓複製組,既將同
步組的狀態由正常(normal)改為停頓(quiesced )
execute dbms_repcat.suspend_master_activity (gname => 'rep_gp_day');
執行上面生成的spool 檔案,批次執行建立複製物件和生成複製支援
如果是單獨建立複製物件,則是手工執行下面的SQL
execute dbms_repcat.create_master_repobject(sname=>'test_user',oname=>'account',
type=>'table',use_existing_object=>true,gname=>'rep_gp_day',copy_rows => false);
execute dbms_repcat.generate_replication_support('test_user','account','table');
備註: 如果所有的主體站點都是在Oracle815 以上的版本, 那麼設定
generate_replication_support 中的generate_80_compatible 引數為false,預設是true。
檢查執行結果
select * from dba_repobject;
9。新增主體庫,這一步操作必須要求dblink 工作正常
execute dbms_repcat.add_master_database(gname=>'rep_gp_day',master=>'snap.com@perday', use_existing_objects=>true, copy_rows=>false,propagation_mode => 'asynchronous');
select * from user_jobs;
execute dbms_repcat.resume_master_activity('rep_gp_day',false);
select gname, master, status from dba_repgroup;
如果上述的檢查結果顯示status 不是normal 的,那麼執行:
execute dbms_repcat.resume_master_activity('rep_gp_day',true);
10。新增PUSH 的任務(執行間隔為1 天1 次),如果是一小時一次,則是1/24,如果是一
分鐘一次則是1/1440
begin
dbms_defer_sys.schedule_push (
destination => 'snap.com@perday',
interval => 'sysdate + 1',
next_date => sysdate,
parallelism => 1,
delay_seconds => 50);
end;
/
新增PURGE 的任務(執行間隔為1 分鐘1 次)
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/1440',
delay_seconds => 0,
rollback_segment => '');
end;
/
11。用repadmin 使用者登入snap,建立私有資料庫連線
create database link "master.com" connect to repadmin identified by repadmin;
create database link "master.com@perday" connect to repadmin identified by repadmin
USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS= (PROTOCOL = TCP)(Host =
10.1.6.120)(Port = 1521)))(CONNECT_DATA = (SID = test1)(SERVER = DEDICATED)))';
create database link "master.com@perhour" connect to repadmin identified by repadmin
USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS= (PROTOCOL = TCP)(Host =
10.1.6.120)(Port = 1521)))(CONNECT_DATA = (SID = test1)(SERVER = DEDICATED)))';
檢查是否建立成功
SQL> select * from global_name@master.com@perday;
GLOBAL_NAME
--------------------------------------------------------------------------------
MASTER.COM
12。新增PUSH 和PURGE 的任務(執行間隔為1 天1 次),如果是一小時一次,則是1/24,
如果是一分鐘一次則是1/1440
begin
dbms_defer_sys.schedule_push (
destination => 'master.com@perday',
interval => 'sysdate + 1',
next_date => sysdate,
parallelism => 1,
delay_seconds => 50);
end;
/
新增PURGE 的任務(執行間隔為1 分鐘1 次)
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/1440',
delay_seconds => 0,
rollback_segment => '');
end;
/
至此,高階複製環境設定完畢。



物化檢視複製站點的配置步驟
主站點:rep.yangtingkun
物化檢視站點:yangtk.yangtingkun
主機名:yangtingkun
複製使用者:yangtk
1. 檢查初始化引數
複製對資料庫的初始化引數限制不多,主要注意兩點。
global_names 為TRUE 以及job_queue_process 大等0。
分別在主站點和物化檢視站點執行下面兩條sqlplus 命令,檢查資料庫初始化引數是否符合
要求。
show parameter global_names
show parameter job
如果初始化引數設定的不滿足要求,可以透過下列語句動態修改。
alter system set global_names = true;
alter system set job_queue_processes = 20;
2. 檢查全域性資料庫名稱
兩個資料庫的db_domain 名稱應該相同,只有db_name 不同。
透過下列語句檢查主站點和物化檢視站點的全域性資料庫名
select * from global_name;
如果全域性資料庫名設定不符合規範,可以透過如下語句動態修改。
alter database rename global_name to rep.yangtingkun;
alter database rename global_name to yangtk.yangtingkun;
3. 修改tnsnames.ora 檔案,主站點和物化檢視站點的引數檔案中都新增下列內容
REP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rep)
)
)
YANGTK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yangtk)
)
)
4. 建立主體站點
--以system 使用者連線到主站點
CONN system@rep
--建立複製管理使用者repadmin 並授權
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 SELECT ANY DICTIONARY TO repadmin;
--註冊傳播使用者並授權,這裡使用了管理使用者repadmin,也可以分別建立使用者
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/
--註冊接收使用者,這裡使用了管理使用者repadmin
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立物化檢視站點複製管理員的代理使用者,出於簡單考慮,這裡也使用repadmin 使用者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
--設定代理重新整理使用者,並授權,這裡仍然使用repadmin 使用者
--對於repadmin 而言,不需要create session 許可權
--但是這裡如果新建使用者的話,create session 許可權則是必須的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;
--設定清除延遲序列的job
--以複製管理員身份登陸到主站點
CONNECT repadmin/repadmin@rep
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
commit;
--多主站點的設定還需要多個站點間建立資料庫鏈並建立排程機制
--但是對於物化檢視複製的主體站點,則這些設定是不需要的
5. 設定物化檢視站點
--以system 使用者連線到物化檢視站點
CONN system@yangtk
--建立物化檢視管理員,並授權
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;
--建立傳播者,並授權,這裡使用mvadmin 使用者,也可以建立單獨的使用者
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');
END;
/
--建立重新整理者,並授權,這裡使用mvadmin 使用者重新整理物化檢視
--對於mvadmin 而言,不需要create session 許可權
--但是這裡如果新建使用者的話,create session 許可權則是必須的
GRANT CREATE SESSION TO mvadmin;
GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;
--註冊接受者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'mvadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立PUBLIC 資料庫鏈
CREATE PUBLIC DATABASE LINK rep.yangtingkun USING 'rep';
--建立到主站點上代理物化檢視管理員的資料庫鏈
--以物化檢視管理員身份連線到物化檢視站點
CONNECT mvadmin/mvadmin@yangtk
CREATE DATABASE LINK rep.yangtingkun CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立到主站點上覆制管理員的資料庫鏈
--以傳播者身份登陸物化檢視站點
--在本例中,這個資料庫鏈與上面的資料庫鏈相同,故省略。
--設定清除延遲序列的job
--如果物化檢視站點只包括只讀物化檢視,這一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0,
rollback_segment => '');
END;
/
--設定將修改推入到主站點的job
--如果物化檢視站點只包括只讀物化檢視,這一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'rep.yangtingkun',
interval => 'SYSDATE + 1/24',
next_date => SYSDATE,
stop_on_error => FALSE,
delay_seconds => 0,
parallelism => 0);
END;
/
--如果需要此物化檢視站點作為主物化檢視站點
--則還需要建立物化檢視站點的代理物化檢視管理使用者以及代理重新整理使用者
--本例中從略
commit;
6. 建立主體組
--以複製管理員身份登陸複製站點
CONNECT repadmin/repadmin@rep
--建立名為rep_test 的複製組
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'rep_test');
END;
/
--將複製物件增加到複製組中
--主鍵所用的索引自動複製,其他索引需要明確新增到複製組中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'TABLE',
oname => 'test_rep',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'INDEX',
oname => 'ind_test_rep_name',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
--生成複製支援
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'yangtk',
oname => 'test_rep',
type => 'TABLE',
min_communication => TRUE);
END;
/
--開始複製
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'rep_test');
END;
/
commit;
7. 建立物化檢視
--以複製使用者連線到主站點
CONNECT yangtk@rep
--建立物化檢視日誌表,FAST 重新整理方式必須要求建立物化檢視日誌,COMPLETE 則不需要
CREATE MATERIALIZED VIEW LOG ON yangtk.test_rep;
--如果被複制使用者不存在則建立,並授予相應許可權
--本例中,使用者已存在,此步驟省略
/*
CONNECT system@yangtk
CREATE USER yangtk IDENTIFIED BY yangtk;
ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER yangtk TEMPORARY TABLESPACE temp;
GRANT
CREATE SESSION,
CREATE TABLE,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TRIGGER,
CREATE VIEW,
CREATE SYNONYM,
ALTER SESSION,
CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,
CREATE DATABASE LINK
TO yangtk;
*/
--建立複製使用者到主站點代理重新整理者的資料庫鏈
CONNECT yangtk@yangtk
CREATE DATABASE LINK rep.yangtingkun CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立物化檢視組
--以物化檢視管理員身份登陸物化檢視站點
CONNECT mvadmin/mvadmin@yangtk
--物化檢視組必須和複製站點上的複製組名稱相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'rep_test',
master => 'rep.yangtingkun',
propagation_mode => 'ASYNCHRONOUS');
END;
/
--建立重新整理組
--對於只包含只讀物化檢視的站點,不需要此步驟
BEGIN
DBMS_REFRESH.MAKE (
name => 'mvadmin.rep_refresh',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
--建立物化檢視
--對於只讀物化檢視,省略FOR UPDATE 語句
CREATE MATERIALIZED VIEW yangtk.test_rep
REFRESH FAST WITH PRIMARY KEY FOR UPDATE
AS SELECT * FROM yangtk.test_rep@rep.yangtingkun;
--將物化檢視新增到物化檢視組
--對於只讀物化檢視,此步驟可以省略
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'test_rep',
type => 'SNAPSHOT',
min_communication => TRUE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'ind_test_rep_name',
type => 'INDEX',
min_communication => TRUE);
END;
/
--將物化檢視新增到重新整理組
BEGIN
DBMS_REFRESH.ADD (
name => 'mvadmin.rep_refresh',
list => 'yangtk.test_rep',
lax => TRUE);
END;
/
commit;
8. 主物件上建立測試物件指令碼
create table test_rep (id number not null, name varchar2(100));
alter table test_rep add constraint pk_test_rep primary key (id);
create index ind_test_rep_name on test_rep (name);
insert into test_rep values (1, 'ytk');
insert into test_rep values (2, 'zhly');
commit;

出處:  http://blog.chinaunix.net/u/9295/showart_176143.html     

 

 

 

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

相關文章