資料初始化(initial data load)
在進行同步以前,要先對目標端的資料進行初始化
線上遷移有幾種方法,這裡採取比較靠譜的兩種:通過資料庫工具(expdp/impdp)和通過檔案匯入到replicat。我們將這兩種方法分別應用在兩組抽取/複製對應的4個資料庫使用者上。w1ext對應的dycommondatabase20使用者和dyulcentermanage使用前者,w2ext對應的dyacdb34和dyulcenterm_bak使用後者。
通過expdp/impdp來遷移初始資料
流程圖如下:
準備工作
1. 禁用DDL的抽取和複製
在extract和replicat參數中將ddl去掉。實際上,若能保證在expdp匯出資料期間不會有ddl操作,可以忽略此項
2. 在replicat中使用HANDLECOLLISIONS參數。每一個目標表都必須由一個主鍵或唯一鍵。如果沒有,使用KEYCOLS選項來代替,如果不能指定,祈禱不會出現兩條完全一樣的記錄吧...
在源端和目標端開啟MANAGER
在源端和目標端執行ggsci命令start mgr,啟動manager進程
在源端,開啟extract進程
GGSCI (rac1) 35> start ext w1ext
Sending START request to MANAGER ...
EXTRACT W1EXT starting
GGSCI (rac1) 36> start ext w1extdp
Sending START request to MANAGER ...
EXTRACT W1EXTDP starting
GGSCI (rac1) 37> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:05
EXTRACT RUNNING W1EXTDP 00:00:00 02:00:51
EXTRACT STOPPED W2EXT 00:00:00 01:54:09
EXTRACT STOPPED W2EXTDP 00:00:00 01:50:00
在源端,執行expdp匯出資料
首先需要在來源資料中建立一個directory:
SQL> create directory expdpdir as '/bak/expdpdata';
Directory created.
執行匯出:
[oracle@rac1 ~]$ expdp system/aaa directory=expdpdir dumpfile=w1data_%U.dmp logfile=w1data.log schemas=dycommondatabase20, dyulcentermanage parallel=4
將初始資料匯入到目標資料庫
先通過ftp將expdp匯出的檔案拷貝到目標主機上:
目標端:
[oracle@ggdb ~]$ ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp> cd /bak/expdpdata
250 Directory successfully changed.
ftp> lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp> bin
200 Switching to Binary mode.
ftp> mget w1*
建立directory:
SQL> create directory impdpdir as '/bak/impdpdata';
Directory created.
需要的資料表空間也要先建立好
資料匯入:
impdp system/aaa directory=impdpdir dumpfile=w1data_%U.dmp logfile=w1data_impdp.log schemas=dycommondatabase20, dyulcentermanage parallel=4
由於資料庫版本是10.2.0.4,需要在目標庫中禁用我們要同步的使用者中的觸發器
SQL>
begin
for x in (select owner,trigger_name from dba_triggers
where owner in ('DYCOMMONDATABASE20', 'DYULCENTERMANAGE'))
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;
/
在目標端,啟動複製進程
impdp匯入結束之後,啟動複製進程
GGSCI (ggdb) 51> start rep dyrep
Sending START request to MANAGER ...
REPLICAT DYREP starting
通過info replicat dyrep 命令來查看複製的狀態
在目標端的資料變化追上initial-load結束的時間點後,關閉handlecollisions參數: 先使用SEND REPLICAT命令使之對運行中的replicat生效,然後修改參數檔案,使其在下一次啟動時生效。
GGSCI (ggdb) 57> SEND REPLICAT w1rep, NOHANDLECOLLISIONS
Sending NOHANDLECOLLISIONS request to REPLICAT W1REP ...
W1REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.
然後修改dyrep參數檔案,去掉handlecollisions參數
通過檔案到replicat方式來遷移初始資料
流程圖如下所示
expdp/impdp的優勢之一就是匯入很快,而通過檔案到replicat的方式,需要一條一條地應用到目標庫中,因此匯入是最慢的
準備工作
1. 禁用DDL的抽取和複製
2. 確認目標端表是空的
3. 禁用外鍵及check約束
4. 在replicat中使用HANDLECOLLISIONS參數
5. 可以刪除大表中的索引以加快匯入速度,匯入結束後再重建索引
在源端和目標端開啟MANAGER
在源端和目標端執行ggsci,開啟manager
start mgr
這一步在上面已經做過了,就不再重複
配置初始化extract
在源端,添加一個extract,並配置參數
GGSCI (rac1) 1> add extract einit,sourceistable
EXTRACT added.
參數說明:
1.SOURCEISTABLE:將來源資料庫中指定的表中的所有記錄匯出到指定的檔案中,一般用於initial-data load
2. RMTFILE:目標檔案的路徑。設定最大檔案數和最大檔案大小,否則當檔案超過2GB時會出錯
GGSCI (rac1) 2> edit params einit
EXTRACT einit
SOURCEISTABLE
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 192.168.47.211, MGRPORT 5898
RMTFILE /opt/gg/trails/initdata,purge,maxfiles 100,megabytes 1024
TABLE dyacdb34.*;
TABLE dyulcenterm_bak.*;
在目標庫中建立資料表空間、使用者及表結構
在匯入資料以前,需要準備好這個容器
我們使用expdp來匯出,不匯出表中的資料:
源端:
[oracle@rac1 ~]$ expdp system/aaa directory=expdpdir dumpfile=w2data.dmp logfile=w2data.log schemas= DYACDB34,DYULCENTERM_BAK exclude=table_data,table_statistics
目標端:
[oracle@ggdb ~]$ ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp> cd /bak/expdpdata
250 Directory successfully changed.
ftp> lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp> bin
200 Switching to Binary mode.
ftp> mget w2*
匯入使用者及其表結構:
[oracle@ggdb ~]$ impdp system/aaa directory=impdpdir dumpfile=w2data.dmp logfile=w2data_imp.log schemas=DYACDB34,DYULCENTERM_BAK
禁用約束:
SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
execute immediate 'alter table '||x.owner||'.'||x.table_name||
' disable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/
禁用觸發器:
SQL>
begin
for x in (select owner,trigger_name from dba_triggers
where owner in ('DYACDB34', 'DYULCENTERM_BAK'))
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;
/
在源端,開啟抽取進程
GGSCI (rac1) 3> start ext w2ext
Sending START request to MANAGER ...
EXTRACT W2EXT starting
GGSCI (rac1) 4> start ext w2extdp
Sending START request to MANAGER ...
EXTRACT W2EXTDP starting
GGSCI (rac1) 5> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:08
EXTRACT RUNNING W1EXTDP 00:00:00 00:00:05
EXTRACT RUNNING W2EXT 02:58:57 00:00:04
EXTRACT RUNNING W2EXTDP 00:00:00 03:03:40
在源端,啟動initial-load extract
[goldengate@rac1 ~]$ cd $GG_HOME
[goldengate@rac1 goldengate]$ ./extract paramfile dirprm/einit.prm reportfile /opt/gg/einit.log
通過查看報告檔案監控抽取的過程和結果,直到抽取結束
配置初始化replicat
在目標端,添加一個replicat,並配置參數
GGSCI (rac2) 1> add replicat rinit,specialrun
REPLICAT added.
參數說明:
1. SPECIALRUN:一次性的匯入,不會產生checkpoint。一般用於通過檔案到replicat的初始資料的載入,或者批量進行更新同步
2. EXTFILE:指定資料所在檔案的路徑,檔案名稱需要輸入全稱
3. ASSUMETARGETDEFS:由於源和目標資料需要同步的表的結構一致,指定該參數以提高效率
GGSCI (rac2) 2> edit params rinit
REPLICAT rinit
SPECIALRUN
USERID GOLDENGATE,PASSWORD GOLDENGATE
EXTFILE /opt/gg/trails/initdata000000
ASSUMETARGETDEFS
MAP DYACDB34.* , TARGET DYACDB34.* ;
MAP DYULCENTERM_BAK.* , TARGET DYULCENTERM_BAK.* ;
在目標端,啟動initial-load replicat
[goldengate@ggdb goldengate]$ cd $GG_HOME
[goldengate@ggdb goldengate]$ ./replicat paramfile dirprm/rinit.prm reportfile /opt/gg/rinit.log
我的測試環境中由於產生了3個extfile,需要修改rinit參數檔案,將extfile檔案名稱修改,再執行2次。也可以增加兩個specialrun的replicat來同時執行。匯入結束後注意查看產生的日誌,確保沒有出現錯誤
在目標端,啟動複製進程
在initial-load replication結束之後,啟動複製進程
GGSCI (ggdb) 51> start rep w2rep
Sending START request to MANAGER ...
REPLICAT W2REP starting
通過info replicat w2rep 命令來查看複製的狀態
在目標端的資料變化追上initial-load結束的時間點後,關閉handlecollisions參數: 先使用SEND REPLICAT命令使之對運行中的replicat生效,然後修改參數檔案,使其在下一次啟動時生效。
GGSCI (ggdb) 57> SEND REPLICAT w2rep, NOHANDLECOLLISIONS
Sending NOHANDLECOLLISIONS request to REPLICAT W2REP ...
W2REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.
然後修改w2rep參數檔案,去掉handlecollisions參數
重新啟用目標資料庫中匯入資料前禁用的約束:
SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
execute immediate 'alter table '||x.owner||'.'||x.table_name||
' enable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/
可以試著在來源資料庫中進行一些ddl或dml操作,在目標端使用ggsci命令stats或在資料庫中查看更改是否被應用了。
這裡GoldenGate就配置完成了
GoldenGate配置執行個體:RHEL 4.7下的Oracle 10g RAC到單一實例的單向同步(一)
http://blog.csdn.net/wildwave/article/details/7053768
GoldenGate配置執行個體:RHEL 4.7下的Oracle 10g RAC到單一實例的單向同步(二)
http://blog.csdn.net/wildwave/article/details/7056362
GoldenGate配置執行個體:RHEL 4.7下的Oracle 10g RAC到單一實例的單向同步(三)
http://blog.csdn.net/wildwave/article/details/7056451
GoldenGate配置執行個體:RHEL 4.7下的Oracle 10g RAC到單一實例的單向同步(四)
http://blog.csdn.net/wildwave/article/details/7056500