天天看點

Oracle

2008-11-03 23:57:19

 标簽:oracle    [推送到技術圈]

  我們經常希望把各地的資料入庫後進行統一的應用。現在可以用複制技術來解決這個問題。但實作資料庫複制也是要有一些條件的。

首先,資料庫要具備進階複制功能(用system身份登入資料庫,檢視v$option視圖,如果其中advanced replication為true,則支援進階複制功能;否則不支援)。

如果具備進階複制功能,資料庫要進行一些參數初始化。

db_domain = test.com.cn 指明資料庫的域名(預設的是world),這裡可以用您公司的域名;global_names = true 它要求資料庫連結(database link)和被連接配接的資料庫名稱一緻,現在全局資料庫名:db_name+.+db_domain ;

跟資料庫job執行有關的參數:

job_queue_processes = 1;

job_queue_interval = 60;

distributed_transactions = 10;

open_links = 4

第一行定義snp程序的啟動個數為n。系統預設值為0,正常定義範圍為0~36,根據任務的多少,可以配置不同的數值。第二行定義系統每隔n秒喚醒該程序一次。系統預設值為60秒,正常範圍為1~3600秒。事實上,該程序執行完目前任務後,就進入睡眠狀态,睡眠一段時間後,由系統的總控負責将其喚醒。如果修改了以上這幾個參數,需要重新啟動資料庫以使參數生效。

做完了初步的準備,我們來實作資料庫同步複制。

假設在internet上有兩個資料庫:一個叫中國(china),一個叫日本(japan)。

具體配置如下:

資料庫名:china、japan

資料庫域名 test.com.cn

資料庫sid号 china、japan

listener端口号 1521

伺服器ip位址 10.1.0.100 10.1.0.200

确認兩個資料庫之間可以互相通路,在tnsnames.ora裡設定資料庫連接配接字元串。

中國這邊的資料庫連接配接字元串是以下的格式:

japan =

(description =

(address_list =

(address = (protocol = tcp)(host = 10.1.1.200)(port = 1521))

)

(connect_data =

(service_name = japan)

運作$tnsping japan,出現以下提示符:

attempting to contact (address=(protocol=tcp)(host=10.1.1.200)(port=1521))

ok(n毫秒)

表明中國資料庫可以通路日本資料庫。在日本那邊也同樣配置,确認$tnsping china 是通的。

改資料庫全局名稱,建公共的資料庫連結。

用system身份登入china資料庫

sql>alter database rename global_name to china.test.com.cn;

用system身份登入japan資料庫:

sql>alter database rename global_name to japan.test.com.cn;

用system身份登入china資料庫。

sql>create public database link japan.test.com.cn using japan;

測試資料庫全局名稱和公共的資料庫連結。

sql>select * from [email][email protected][/email];

傳回結果為japan.test.com.cn就對了。

sql>create public database link china.test.com.cn using china;

sql>select * from [email][email protected][/email];

傳回結果為china.test.com.cn就對了。

建立管理資料庫複制的使用者repadmin,并賦權。

用system身份登入china資料庫:

sql>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;

sql>execute dbms_defer_sys.register_propagator(repadmin);

sql>grant execute any procedure to repadmin;

sql>execute dbms_repcat_admin.grant_admin_any_repgroup(repadmin);

sql>grant comment any table to repadmin;

sql>grant lock any table to repadmin;

同樣用system身份登入japan資料庫,運作以上的指令,管理資料庫複制的使用者repadmin,并賦權。

在資料庫複制的使用者repadmin下建立私有的資料庫連結。

用repadmin身份登入china資料庫。

sql>create database link japan.test.com.cn connect to repadmin identified 試這個私有的資料庫連結:

用repadmin身份登入japan資料庫。

sql>create database link china.test.com.cn connect to repadmin identified by repadmin;

測試這個私有的資料庫連結:

建立或選擇實作資料庫複制的使用者和對象,給使用者賦權,資料庫對象必須有主關鍵字。

用internal身份登入china資料庫,建立scott使用者并賦權:

sql>create user scott identified by tiger default tablespace users temporary tablespace temp;

sql>grant connect, resource to scott;

sql>grant execute on sys.dbms_defer to scott;

用scott身份登入china資料庫,建立表dept :

sql>create table dept

(deptno number(2) primary key,

dname varchar2(14),

loc varchar2(13) );

如果資料庫對象沒有主關鍵字,可以運作以下sql指令添加:

sql>alter table dept add (constraint dept_deptno_pk primary key (deptno));

在china資料庫scott使用者下建立主關鍵字的序列号,範圍避免和japan的沖突。

sql> create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache;

在china資料庫scott使用者下插入初始化資料

sql>insert into dept values (dept_no.nextval,accounting,new york);

sql>insert into dept values (dept_no.nextval,research,dallas);

sql>commit;

在japan資料庫那邊同樣運作以上①,②,③。

在japan資料庫scott使用者下建立主關鍵字的序列号,範圍避免和china的沖突。

sql> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;

在japan資料庫scott使用者下插入初始化資料。

sql>insert into dept values (dept_no.nextval,sales,chicago);

sql>insert into dept values (dept_no.nextval,operations,boston);

sql>commit;本文出自 51cto.com技術部落格