Oracle的同步復(fù)制研究
2024-08-29 13:40:59
供稿:網(wǎng)友
1、數(shù)據(jù)庫支持高級(jí)復(fù)制功能
您可以用system身份登錄數(shù)據(jù)庫,查看v$option視圖,假如其中Advanced replication為TRUE,則支持高級(jí)復(fù)制功能;否則不支持。
2、數(shù)據(jù)庫初始化參數(shù)要求
①、db_domain = test.com.cn
指明數(shù)據(jù)庫的域名(默認(rèn)的是WORLD),這里可以用您公司的域名。
②、global_names = true
它要求數(shù)據(jù)庫鏈接(database link)和被連接的數(shù)據(jù)庫名稱一致。
現(xiàn)在全局?jǐn)?shù)據(jù)庫名:db_name+”.”+db_domain
③、有跟數(shù)據(jù)庫job執(zhí)行有關(guān)的參數(shù)
job_queue_PRocesses = 1 定義SNP進(jìn)程的啟動(dòng)個(gè)數(shù)為n。系統(tǒng)缺省值為0,正常定義范圍為0~36,根據(jù)任務(wù)的多少,可以配置不同的數(shù)值。
job_queue_interval = 60 定義系統(tǒng)每隔N秒喚醒該進(jìn)程一次。系統(tǒng)缺省值為60秒,正常范圍為1~3600秒。事實(shí)上,該進(jìn)程執(zhí)行完當(dāng)前任務(wù)后,就進(jìn)入睡眠狀態(tài),睡眠一段時(shí)間后,由系統(tǒng)的總控負(fù)責(zé)將其喚醒。
distributed_transactions = 10
open_links = 4
假如修改了以上這幾個(gè)參數(shù),需要重新啟動(dòng)數(shù)據(jù)庫以使參數(shù)生效。
數(shù)據(jù)庫名 ying orcl
數(shù)據(jù)庫域名 test.com.cn test.com.cn
數(shù)據(jù)庫sid號(hào) ying orcl
Listener端口號(hào) 1521 1521
服務(wù)器ip地址 10.10.3.76 10.10.3.74
2、改數(shù)據(jù)庫全局名稱,建公共的數(shù)據(jù)庫鏈接。
①、用system身份登錄ying數(shù)據(jù)庫
alter database rename global_name to ying.test.com.cn
用system身份登錄orcl數(shù)據(jù)庫:
alter database rename global_name to orcl.test.com.cn
②、用system身份登錄ying數(shù)據(jù)庫
create public database link ying.test.com.cn using 'ying';
select * from global_name@ying.test.com.cn
用system身份登錄orcl數(shù)據(jù)庫:
create public database link orcl.test.com.cn using 'orcl'
select * from global_name@orcl.test.com.cn
3、建立治理數(shù)據(jù)庫復(fù)制的用戶repadmin,并賦權(quán)。
①、用system身份登錄ying數(shù)據(jù)庫
create user repadmin identified by repadmin default tablespace users temporary tablespace temp
begin
dbms_defer_sys.register_propagator('repadmin');
end;
grant execute any procedure to repadmin;
begin
dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
end;
grant comment any table to repadmin;
grant lock any table to repadmin;
②、同樣用system身份登錄orcl數(shù)據(jù)庫,運(yùn)行以上的命令,治理數(shù)據(jù)庫復(fù)制的用戶repadmin,并賦權(quán)。
create user repadmin identified by repadmin default tablespace users temporary tablespace temp
begin
dbms_defer_sys.register_propagator('repadmin');
end;
grant execute any procedure to repadmin;
begin
dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
end;
grant comment any table to repadmin;
grant lock any table to repadmin;
*********************************************************************
說明:repadmin用戶名和密碼可以根據(jù)用戶的需求自由命名。
*********************************************************************
4、在數(shù)據(jù)庫復(fù)制的用戶repadmin下創(chuàng)建私有的數(shù)據(jù)庫鏈接。
①、用repadmin身份登錄ying數(shù)據(jù)庫
create database link orcl.test.com.cn connect to repadmin identified by repadmin;
select * from global_name@orcl.test.com.cn; --測試
②、用repadmin身份登錄orcl數(shù)據(jù)庫
create database link ying.test.com.cn connect to repadmin identified by repadmin;
select * from global_name@ying.test.com.cn; --測試
5、創(chuàng)建或選擇實(shí)現(xiàn)數(shù)據(jù)庫復(fù)制的用戶和對(duì)象,給用戶賦權(quán),數(shù)據(jù)庫對(duì)象必須有主要害字。
假設(shè)我們用Oracle里舉例用的water用戶,t_file_all表。
①、用internal身份登錄ying數(shù)據(jù)庫,創(chuàng)建water用戶并賦權(quán)
SQL>create user water identified by water default tablespace water temporary tablespace water;
SQL>grant connect, resource to water;
SQL>grant execute on sys.dbms_defer to water;
②、用water身份登錄ying數(shù)據(jù)庫,創(chuàng)建表t_file_all
③、假如數(shù)據(jù)庫對(duì)象沒有主要害字,可以運(yùn)行以下SQL命令添加:
alter table t_file_all add (constraint t_file_all_key primary key (t_file_all_id));
④、在ying數(shù)據(jù)庫water用戶下創(chuàng)建主要害字的序列號(hào),范圍避免和orcl的沖突。
⑤、在ying數(shù)據(jù)庫water用戶下插入初始化數(shù)據(jù)
⑥、在orcl數(shù)據(jù)庫那邊同樣運(yùn)行以上①,②,③
⑦、在orcl數(shù)據(jù)庫water用戶下創(chuàng)建主要害字的序列號(hào),范圍避免和water的沖突。
⑧、在beijing數(shù)據(jù)庫scott用戶下插入初始化數(shù)據(jù)
6、創(chuàng)建要復(fù)制的組water_t_file_all,加入數(shù)據(jù)庫對(duì)象,產(chǎn)生對(duì)象的復(fù)制支持
①、用repadmin身份登錄ying數(shù)據(jù)庫,創(chuàng)建主復(fù)制組water_t_file_all
begin
dbms_repcat.create_master_repgroup('water_t_file_all');
end;
②、在復(fù)制組scott_mg里加入數(shù)據(jù)庫對(duì)象
begin
dbms_repcat.create_master_repobject
(sname=>'water',oname=>'t_file_all',
type=>'table',use_existing_object=>true,
gname=>'water_t_file_all'
);
end;
*******************************
參數(shù)說明:
sname 實(shí)現(xiàn)數(shù)據(jù)庫復(fù)制的用戶名稱
oname 實(shí)現(xiàn)數(shù)據(jù)庫復(fù)制的數(shù)據(jù)庫對(duì)象名稱
(表名長度在27個(gè)字節(jié)內(nèi),程序包名長度在24個(gè)字節(jié)內(nèi))
type 實(shí)現(xiàn)數(shù)據(jù)庫復(fù)制的數(shù)據(jù)庫對(duì)象類別
(支持的類別:表,索引,同義詞,觸發(fā)器,視圖,過程,函數(shù),程序包,程序包體)
use_existing_object true表示用主復(fù)制節(jié)點(diǎn)已經(jīng)存在的數(shù)據(jù)庫對(duì)象
gname 主復(fù)制組名
*******************************
③、對(duì)數(shù)據(jù)庫對(duì)象產(chǎn)生復(fù)制支持
begin
dbms_repcat.generate_replication_support('water','t_file_all','table');
end;
(說明:產(chǎn)生支持water用戶下t_file_all表復(fù)制的數(shù)據(jù)庫觸發(fā)器和程序包)
④、確認(rèn)復(fù)制的組和對(duì)象已經(jīng)加入數(shù)據(jù)庫的數(shù)據(jù)字典
select gname, master, status from dba_repgroup --測試
select * from dba_repobject --測試
7、創(chuàng)建主復(fù)制節(jié)點(diǎn)
①、用repadmin身份登錄ying數(shù)據(jù)庫,創(chuàng)建主復(fù)制節(jié)點(diǎn)
begin
dbms_repcat.add_master_database
(gname=>'water_t_file_all',
master=>'orcl.test.com.cn',
use_existing_objects=>true,
copy_rows=>false,
propagation_mode => 'asynchronous');
end;
**********************************************
參數(shù)說明:
gname 主復(fù)制組名
master 加入主復(fù)制節(jié)點(diǎn)的另一個(gè)數(shù)據(jù)庫
use_existing_object true表示用主復(fù)制節(jié)點(diǎn)已經(jīng)存在的數(shù)據(jù)庫對(duì)象
copy_rows false表示第一次開始復(fù)制時(shí)不用和主復(fù)制節(jié)點(diǎn)保持一致
propagation_mode 異步地執(zhí)行
***********************************************
select * from user_jobs; --測試是否在復(fù)制任務(wù)中
8、使同步組的狀態(tài)由停頓(quiesced )改為正常(normal)
①、用repadmin身份登錄ying數(shù)據(jù)庫,運(yùn)行以下命令
begin
dbms_repcat.resume_master_activity('water_t_file_all',false);
end;
--不行用該命令
begin
dbms_repcat.resume_master_activity('water_t_file_all',true);
end;
--測試同步是否正常(status為normal)
select gname, master, status from dba_repgroup
9、創(chuàng)建復(fù)制數(shù)據(jù)庫的時(shí)間表,我們假設(shè)用固定的時(shí)間表:1分鐘復(fù)制一次。
①、用repadmin身份登錄ying數(shù)據(jù)庫,運(yùn)行以下命令
begin
dbms_defer_sys.schedule_push (
destination => 'orcl.test.com.cn',
interval => 'sysdate + 1/(60*24)', --每隔1分鐘
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/(60*24)',
delay_seconds => 0,
rollback_segment => '');
end;
②、用repadmin身份登錄orcl數(shù)據(jù)庫,運(yùn)行以下命令
begin
dbms_defer_sys.schedule_push (
destination => 'ying.test.com.cn',
interval => 'sysdate + 1/(60*24)', --每隔1分鐘
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/(60*24)', --每隔1分鐘
delay_seconds => 0,
rollback_segment => '');
end;
10、添加或修改兩邊數(shù)據(jù)庫的記錄,跟