OGG實現兩臺oracle資料庫的同步

pxbibm發表於2015-01-09
今天透過最簡單的一個例子,給大家講解下 goldengate 實現兩臺oracle資料庫的同步。
內容如下:
1.配置資料庫資訊。
2.安裝golden gate.
3.配置golden gate.
4.測試同步情況

首先我們看看實驗環境
 

環境

 

源端是一個單例項
Oracle Enterprise 5 + ORACLE 10.2.0.4
IP :10.4.128.100 

目標端是一個單例項
Oracle Enterprise 5 + ORACLE 10.2.0.4
IP :10.4.128.101

兩臺主機均已建立資料庫,sid分別為devdb  emrep

配置devdb  emrep的資料同步

goldengate版本11.2.1.0

1.配置資料庫資訊

 

在源端資料庫中開啟歸檔模式

 

SQL> archive log list

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/archive1
Oldest online log sequence     180
Next log sequence to archive   181
Current log sequence           181

若處於非歸檔模式,則改為歸檔模式:
SQL> 
shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
startup mount;
ORACLE instance started.
SQL> 
alter database archivelog;
Database altered.
SQL> 
alter database open;
Database altered.

 

在源端資料庫中開啟force logging

 

SQL> select force_logging from v$database;
FOR
---
NO
SQL>
 alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES

 

在源端資料庫中開啟supplemental log

 

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
NO

SQL> 
alter database add supplemental log data;

Database altered.

切換日誌,使更改生效
SQL>
 alter system switch logfile;
System altered.

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
YES 

 

在源端資料庫中關閉回收站


官方的說明是,由於一個已知的問題,回收站會對DDL觸發器產生影響,因此需要關閉。由此可見,我們只需要在源庫中關閉回收站即可。

SQL> show parameter recyclebin

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on


SQL> 
alter system set recyclebin=off;

System altered.

SQL> show parameter recyclebin

NAME TYPE                                VALUE
------------------------------------ -------------------------------
recyclebin string                           OFF

 

建立goldengate資料庫使用者(源和目標)

 

注意:源和目標端都需要

[oracle@rac1 ~]$ 
sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jan 9 11:56:28 2015
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 32bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> 
create tablespace goldengate;

Tablespace created.

SQL> 
create user goldengate identified by goldengate default tablespace goldengate;

User created.

SQL> 
grant connect,resource to goldengate;

Grant succeeded.

SQL>
 grant execute on utl_file to goldengate;

Grant succeeded.

SQL>


抽取程式使用的資料庫使用者需要額外的許可權,我們將這些許可權也授予資料庫使用者goldengate(在源端資料庫中執行)

SQL> 
exec dbms_streams_auth.grant_admin_privilege('GOLDENGATE');

PL/SQL procedure successfully completed.

SQL> 
grant insert on system.logmnr_restart_ckpt$ to goldengate;

Grant succeeded.

SQL> 
grant update on sys.streams$_capture_process to goldengate;

Grant succeeded.

SQL>
 grant become user to goldengate;

Grant succeeded.

SQL>

為了確保GoldenGate正常執行,特別是在目標端,賦予goldengate使用者DBA許可權:
SQL> 
grant dba to goldengate;

 

2.GoldenGate安裝環境

 

解壓goldengate安裝檔案到安裝目錄

 

安裝GoldenGate軟體很簡單,解壓即可
goldengate使用者登入
[goldengate@rac1 goldengateMedia]$ 
mkdir /opt/gg/goldengate
[goldengate@rac1 goldengateMedia]$ 
cp ggs_Linux_ora10g_.tar /opt/gg/goldengate
[goldengate@rac1 goldengateMedia]$ 
cd /opt/gg/goldengate
[goldengate@rac1 goldengate]$ 
tar -xvf ggs_Linux_ora10g.tar

 

配置環境變數

源端和目標端:
修改goldengate使用者的環境變數配置檔案(ORACLE_SID按實際情況修改)
cat>>/home/goldengate/.bashrc< ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1
export ORACLE_HOME
ORACLE_SID=devdb
export ORACLE_SID
GG_HOME=/opt/gg/goldengate
export GG_HOME
PATH=\$ORACLE_HOME/bin:$GG_HOME:\$PATH
export PATH
LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$GG_HOME:\$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
EOF

應用剛剛修改的環境變數,然後進入GoldenGate安裝目錄,執行ldd ggsci,確定需要的庫檔案都能夠找到。如果出現共享庫檔案無法找到,例如libnnz10.so => not found,檢查LD_LIBRARY_PATH環境變數的設定
[goldengate@ggdb goldengate]$ 
source ~/.bashrc
[goldengate@ggdb goldengate]$ 
cd $GG_HOME
[goldengate@ggdb goldengate]$
 ldd ggsci
我們可以認為ogg的安裝其實就是一個解壓。非常簡單。

 

3.配置goldengate

 

建立goldengate工作目錄

 

源端和目標端:

[goldengate@rac1 goldengate]$ 
cd $GG_HOME
[goldengate@rac1 goldengate]$ 
./ggsci

GGSCI (rac1) 1> 
create subdirs

Creating subdirectories under current directory /opt/gg/goldengate

Parameter files /opt/gg/goldengate/dirprm: created
Report files /opt/gg/goldengate/dirrpt: created
Checkpoint files /opt/gg/goldengate/dirchk: created
……

GGSCI (gg1) 2> exit


建立trail檔案存放目錄

 

源和目標端:

[goldengate@rac1 ~]$
 mkdir /opt/gg/trails
[goldengate@rac1 ~]$
 ls -l /opt/gg | grep trails

配置MANAGER

 

源端和目標端:

DYNAMICPORTLIST
中配置了GoldenGate(extractreplicat)程式使用的埠範圍
PORT
引數指定MANAGER使用的埠
AUTORESTART
引數使抽取/複製程式失敗後自動重啟
配置MANAGER的引數,PURGEOLDEXTRACTS引數指定:當根據checkpoint發現已經完成抽取和複製的trail檔案將被自動刪除,但保留最近10個。
PURGEDDLHISTORY
PURGEMARKERHISTORY分別刪除DDL歷史表和marker表中的過期資料,以控制它們不會變得過於龐大。

GGSCI (gg1) 1> 
edit params mgr

PORT 5898
PURGEOLDEXTRACTS /opt/gg/trails/w1*, USECHECKPOINTS, MINKEEPFILES 10
AUTORESTART ER *, RETRIES 3, WAITMINUTES 5
PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30



全域性引數設定


源端:

GGSCI (rac1) 2> 
edit params ./globals
GGSCHEMA goldengate

目標端:

建立一個checkpoint
replicat
透過這個表來維護trail檔案中的read position。這不是個必須的操作,如果沒有這個表,則透過一個磁碟檔案來維護

GGSCI (ggdb) 2> 
dblogin userid goldengate,password goldengate
Successfully logged into database.

GGSCI (ggdb) 3> 
add checkpointtable goldengate.chkpoint

Successfully created checkpoint table GOLDENGATE.CHKPOINT.

GGSCI (ggdb) 4>
 edit params ./globals

GGSCHEMA goldengate
CHECKPOINTTABLE goldengate.chkpoint




配置源端extract

 

為了避免primary extract受到網路的影響,我們在源端和目標端之間增加一個data pump,這樣的話,primary extract負責將資料從源資料中抽取出來,存在本地的trail檔案中,然後data pump程式負責將本地trail檔案中的資料傳輸到目標端的trail檔案裡。這樣能提高更高的靈活性和可用性(當源和目標端之間的網路出現故障時,primary extract會繼續抽取資料存到本地的trail).
我們這裡要同步goldengate使用者下的所有表.
GGSCI (rac1) 4> 
add extract w1ext,tranlog,begin now

EXTRACT added.

GGSCI (rac1) 5> 
info all

Program Status Group Lag Time Since Chkpt
MANAGER STOPPED 
EXTRACT STOPPED DYEXT 00:00:00 00:00:07 

編輯w1ext的引數檔案:

1. EXTTRAIL
引數指定該抽取程式對應的exttrail
2. DISCARDFILE
引數指定一個檔案,用來記錄不能正常處理的記錄,這裡使用追加方式,最大為5MB
3. TRANLOGOPTIONS ALTARCHIVELOGDEST
指定源資料庫歸檔所在的路徑。如果不確定,使用該SQL*Plus命令:show parameter log_archive_dest_1
4. TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT
指定了歸檔檔案的命名格式,可以透過SQL*Plus命令show parameter log_archive_format 來確定該格式
5. 
由於源資料使用了ASM,這裡透過tranlogoptions asmuser來提供登入ASM例項的使用者名稱和密碼(使用者名稱必須是SYS)
6. DDL INCLUDE MAPPED
表示只捕獲MAPPED範圍內的DDL操作
7. DDLOPTIONS ADDTRANDATA 
:當建立新的表時,自動為其啟用追加日誌
8. FETCHOPTIONS
MISSINGROW REPORT表示當extract需要獲取的行在源庫中無法定位時,extract程式繼續執行,相關的錯誤資訊會儲存在discardfile引數指定的檔案中;USESNAPSHOT表示extract使用flashback查詢來從undo從獲取一些資料,比如無法從redo中直接獲取的UDT、巢狀表、XMLtype以及9i中的LOBNOUSELATESTVERSION使得extract當無法從undo中獲取資料時,忽略該條件而不是從源表中獲取當前值。
9. STATOPTIONS REPORTFETCH
:使用ggsci命令stats時,顯示獲取的行的統計資訊
10. WARNLONGTRANS 1H, CHECKINTERVAL 5M
:當發現超過1個小時的長事務時,會在錯誤日誌中產生一條warning5分鐘檢測一次

GGSCI (rac1) 6> 
edit params w1ext

EXTRACT w1ext
USERID goldengate, PASSWORD goldengate
EXTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS ADDTRANDATA
FETCHOPTIONS, USESNAPSHOT, NOUSELATESTVERSION, MISSINGROW REPORT
STATOPTIONS REPORTFETCH
WARNLONGTRANS 1H, CHECKINTERVAL 5M
TABLE goldengate.*;


新增該extract對應的trail檔案,用來儲存抽取的資料。單個檔案大小設定為100MB
GGSCI (rac1) 7> 
add exttrail /opt/gg/trails/w1,extract w1ext, MEGABYTES 100
EXTTRAIL added.

新增secondary extract group,即data pump

GGSCI (rac1) 8> 
ADD EXTRACT w1extdp, EXTTRAILSOURCE /opt/gg/trails/w1, BEGIN now
EXTRACT added.

編輯引數檔案
RMTHOST
後面跟目標端的ip或主機名(需在hosts檔案中有對應ip解析)manager程式的埠號;RMTTRAIL指定目標端的trail檔案所在位置

GGSCI (rac1) 9> 
edit params w1extdp

EXTRACT w1extdp
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 10.4.128.101, MGRPORT 5898
RMTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdpdsc,APPEND,MEGABYTES 5
TABLE goldengate.*;

新增該rmttrail

GGSCI (rac1) 10> 
add rmttrail /opt/gg/trails/w1,extract w1extdp, megabytes 100
RMTTRAIL added.


配置目標端replicat


回到目標端,使用goldengate使用者登入到ggsci命令列中,對應前面的兩組extractdata pump增加兩個replicat

GGSCI (ggdb) 6> 
add replicat w1rep,exttrail /opt/gg/trails/w1,checkpointtable goldengate.chkpoint
REPLICAT added.

這裡的handlecollisions引數在目標端資料初始化並同步之後去掉

編輯引數檔案:
1. assumetargetdefs:
由於在這裡我們源端和目標端的表結構是完全一致的,因此使用這個引數來使replicat不用去檢視相關的定義檔案,從而提高效率
2. DDLOPTIONS REPORT
:將ddl的具體資訊寫入到報告檔案中
3. BATCHSQL
:將相似的SQL語句放到一個陣列中以加快執行速度。在normal模式下,repliat同一時間只應用一條sql語句。
4. DBOPTIONS DEFERREFCONST
:將完整性約束推遲到replicat事務提交以後再檢測
5. 
如果資料庫版本在10.2.0.511.2.0.2以後,可以使用DBOPTIONS SUPPRESSTRIGGERSreplicat會話中禁用觸發器。如果不是,應該在目標端資料庫中禁用觸發器(觸發器產生的DML操作會從源端同步到目標端)
6. DBOPTIONS LOBWRITESIZE 
:將要寫入目標庫的LOB資料快取在記憶體中,當達到引數中指定的大小時寫入資料,以減少I/O。這個值的範圍是2KB1MB,預設為32KB
7.
DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 5 RETRYDELAY 20:當出現DDL錯誤,重試5次,時間間隔為20秒。如果失敗,replicat會繼續執行,但相關資訊會記錄在discardfile中。
8. HANDLECOLLISIONS:當replicat往表中插入一條記錄,而該記錄已經存在,則進行覆蓋;當replicat在表中試圖更新或刪除一條記錄,而該記錄不存在,則該操作被丟棄。這個引數一般在initial-data load中使用,在源和目標端的資料同步之後應該將該引數刪除
9. MAP TARGET
:源表和目標表之間的對映,可以使用萬用字元

GGSCI (ggdb) 7> 
edit params w1rep

REPLICAT w1rep
ASSUMETARGETDEFS
USERID GOLDENGATE, PASSWORD GOLDENGATE
DISCARDFILE w1repdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
BATCHSQL
DBOPTIONS DEFERREFCONST
DBOPTIONS LOBWRITESIZE 102400
HANDLECOLLISIONS
DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 5 RETRYDELAY 20
MAP goldengate.* , TARGET goldengate.* ;


ADD TRANDATA

 

在啟動goldengate相關程式之前,使用trandata對源資料庫中需要同步的表啟用物件級別的追加日誌

--在源端
GGSCI (rac1) 17> 
dblogin userid goldengate,password goldengate
Successfully logged into database.
--GGSCI (xxx) 2> list tables goldengate.*


GGSCI (rac1) 18> 
add trandata goldengate.*

如果表中沒有主鍵和唯一鍵,會產生一條警告,例如:
2011-12-08 22:53:11 WARNING OGG-00869 No unique key is defined for table UDPPACKPORTSET. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.


 

在源端和目標端開啟MANAGER


在源端和目標端執行ggsci命令start mgr,啟動manager程式
GGSCI (rac1) 34> start mgr

在源端,開啟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

在目標端,啟動複製程式

 
GGSCI (ggdb) 51>
 start rep w1rep

Sending START request to MANAGER ...
REPLICAT DYREP starting

4.測試同步情況

 源端,目標端都建立一個表
源端
SQL> create table test(id int);

Table created.

SQL> insert into test values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into test values(2);

1 row created.

SQL> commit;

Commit complete.
目標端
SQL> create table test(id int);

Table created.

SQL> select  * from test;

 ID
----------
  1
  2

ok ,結束了。


 

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

相關文章