程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 搭建一個Oracle到Oracle的Goldengate雙向復制環境

搭建一個Oracle到Oracle的Goldengate雙向復制環境

編輯:Oracle教程

搭建一個Oracle到Oracle的Goldengate雙向復制環境


目標:搭建一個Oracle到Oracle的Goldengate雙向復制環境(支持DDL+DML)。

n塊iE鏕j?店楫+.)钆'觌zW毐顈N)?喀摣i蒦玓m?譞炞脯xGb?'E閊j塹譵5喧鑦?妷 ?6矉玵隯?? ?6唹烚娳rW縨?奧喀棻?渠??點繪楗靑⒒K?DX<渠??碘?€Q1寶婍?^策钣_鄟玘F贲rW?鷌矉玵镝竣稖曪踛萯畤鈺镩?,r/棣55?佃-?孃i?孃i:稖曖〞拽玘
墻jwH炞翻z瘋趓W喀昢]u譙?#?]u則繪S?-u訊帝N4K妠鼻?岣沚?辴贲rW抵
'汌譵5譵港^?椁*)矢爢械鬓v覿N%y┹舛茻~)bj賺Yk?m卜瑉晦w鷌F 垈u傋+y玘叉輮? 比喀惈y玝?.m孬y薶?w^轫v*農?他醋?j卓椁霁jg瓃封曤?籑?瓄鱞畾鎟窔電^韣)^雛醋?j卓v*毽?y玘w鷌
湌?炞鈺?籑?瓄鱞dr窔電搿乾菜Z峨奧??碉輮篭筆辥诐R@??m~)^雛醋?j卓v*飒W+y玘w鷌玓m?u玮?b奧??碉輮穅}獸j诐D期趓譠撣鈺?籑?瓄鱞璻窔電逇?j紵奧??碉輮籪ナ辥诐Uz笣j譄奧??碉輮晦辥诐Uz笣j謰∩奧??碉輮晦hrG+y玘w鷌U赈u玓:隢},z項觃鄟玘?瓂唛珘汁h氕9舨澟?z項觃鄟玘?1歐+y玘w鷌U赈u玓=欕^項觃鄟玘?オ跉?y玘w鷌U赈u玓E阧鈺?籑?瓄鱞琺⒒\瓂唛珘汁i+Z峨奧??碉輮晦-j郜r窔電^?Z丹雐菬奧??碉輮晦ki菧瓂唛?]㈦_奧??碉輮?凳辥诐咹數據庫重做日志進行分析,將獲取的數據應用到目標端,實現數據同步。因此,源數據庫需要必須處於歸檔模式,並啟用附加日志和強制日志。

歸檔模式、附加日志、強制日志

--查看

SQL> select log_mode,supplemental_log_data_min,force_logging from v$database;

LOG_MODE SUPPLEME FOR

------------ -------- ---

ARCHIVELOG NO NO

--修改

(1)archivelog

SQL>shutdown immediate

SQL>startup mount

SQL>alter database archivelog;

SQL>alter database open;

(2)force logging

SQL>alterdatabase force logging;

(3)supplemental log data

SQL>alterdatabase add supplemental log data;

(2)禁用Recycle Bin

如果啟用DDL 支持,必須關閉recycle bin。官網的解釋如下:

If the recyclebin is enabled, the Oracle GoldenGate DDL trigger session receives implicitrecycle bin DDL operations that cause the trigger to fail.

Oracle 11g:

SQL> alter system set recyclebin=offscope=spfile;

System altered.

如果數據庫是10g,需要關閉recyclebin並重啟;或者手工purge recyclebin。

(3)創建存放DDL 信息的user並賦權

SQL> create user ggtest identified by oracle default tablespace users temporary tablespace temp;

User created.

SQL> grant connect,resource to ggtest;

Grant succeeded.

SQL> grant execute on utl_file to ggtest;

Grant succeeded.

退出所有使用Oracle 的session,然後使用SYSDBA權限的用戶執行如下腳本:

gg1:/u01/ggate> echo $ggate

/u01/ggate

--進入GG的目錄,然後調用腳本:

gg1:/home/oracle> cd $ggate

gg1:/u01/ggate> sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production onTue Nov 8 19:41:58 2011

Copyright (c) 1982, 2011, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Miningand Real Application Testing options

--腳本1:

SQL> @marker_setup.sql;

Marker setup script

You will be prompted for the name of aschema for the GoldenGate database objects.

NOTE: The schema must be created prior torunning this script.

NOTE: Stop all DDL replication beforestarting this installation.

--輸入我們之前創建的用戶名:

Enter GoldenGate schema name:ggtest

Marker setup table script complete, runningverification script...

Please enter the name of a schema for theGoldenGate database objects:

Setting schema name to ggtest

MARKER TABLE

-------------------------------

OK

MARKER SEQUENCE

-------------------------------

OK

Script complete.

--腳本2:

SQL> @ddl_setup.sql;

GoldenGate DDL Replication setup script

Verifying that current user has privilegesto install DDL Replication...

You will be prompted for the name of aschema for the GoldenGate database objects.

NOTE: For an Oracle 10g source, the systemrecycle bin must be disabled. For Oracle 11g and later, it can be enabled.

--注意這裡提示我們在10g裡,必須關閉recycle bin,在11g以後的版本,可以不用關閉。

NOTE: The schema must be created prior torunning this script.

NOTE: Stop all DDL replication beforestarting this installation.

--提示輸入GG的用戶:

Enter GoldenGate schema name:ggtest

You will be prompted for the mode ofinstallation.

To install or reinstall DDL replication,enter INITIALSETUP

To upgrade DDL replication, enter NORMAL

--這裡讓我們選擇安裝模式: install 和 reinstall 選擇INITIALSETUP

Enter mode of installation:INITIALSETUP

Working, please wait ...

Spooling to file ddl_setup_spool.txt

Checking for sessions that are holdinglocks on Oracle Golden Gate metadata tables ...

Check complete.

Using ggtest as a GoldenGate schema name,INITIALSETUP as a mode of installation.

Working, please wait ...

DDL replication setup script complete,running verification script...

Please enter the name of a schema for theGoldenGate database objects:

Setting schema name to ggtest

DDLORA_GETTABLESPACESIZE STATUS:

……

STATUS OF DDL REPLICATION

-------------------------------------------------------------------------------------------------------

SUCCESSFUL installation of DDL Replicationsoftware components

Script complete.

--腳本3:

SQL> @role_setup.sql;

GGS Role setup script

This script will drop and recreate the roleGGS_GGSUSER_ROLE

To use a different role name, quit thisscript and then edit the params.sql script to change the gg_role parameter tothe preferred name. (Do not run the script.)

You will be prompted for the name of aschema for the GoldenGate database objects.

NOTE: The schema must be created prior torunning this script.

NOTE: Stop all DDL replication beforestarting this installation.

--同樣輸入GG用戶名:

Enter GoldenGate schema name:ggtest

Wrote file role_setup_set.txt

PL/SQL procedure successfully completed.

Role setup script complete

Grant this role to each user assigned tothe Extract, GGSCI, and Manager processes, by using the following SQL command:

--這裡提示我們賦權給相關的用戶:

GRANT GGS_GGSUSER_ROLE TO<loggedUser>

where <loggedUser> is the userassigned to the GoldenGate processes.

--腳本4:賦權

SQL> grant GGS_GGSUSER_ROLE to ggtest;

Grant succeeded.

--腳本5:

SQL> @ddl_enable.sql;

Trigger altered.

注意這裡腳本創建的table都是使用默認的名稱,當然也可以修改這些table的默認名。

三、測試

注意:

(1) 目標庫的用戶名和對象名稱可以與源端不同,關鍵在於配置文件中要能夠正確匹配。

(2) 配置源和目標兩端tnsnames,保持互聯互通。(記得啟動lsnrctl)

gg1:

SQL> create user ssgg identified by oracle default tablespace users temporary tablespace temp;

User created.

SQL> grant connect,resource,dba to ssgg;

Grant succeeded.

gg2:

SQL> create user ttgg identified by oracle default tablespace users temporary

tablespace temp;

User created.

SQL> grant connect,resource,dba to ttgg;

Grant succeeded.

參數設置

配置gg1,添加checkpoint表:

GGSCI (gg1) 1> dblogin userid ggtest,password oracle

Successfully logged into database.

GGSCI (gg1) 2> view params ./GLOBAL

ggschema ggtest

checkpointtable ggtest.checkpoint

GGSCI (gg1) 27> view params mgr

PORT 7809 --指定管理端口

dynamicportlist 7810-7900 --動態端口列表,當指定端口不可用時,管理進程會自動選擇一個可用端口。最大可指定256個端口

autostart er * --mgr開啟時自動開啟所有的extract and replicat process

autorestart er *,retries 5,waitminutes 2 --extract and replicat processes fail mgr automatically start

參數每2分鐘重啟一次,重啟5次後放棄

1、 t o c o n f i g u r e t h e p r i m a r y e x t r a c t g o u p

GGSCI (gg1) 10> add extract ext01,tranlog,begin now

EXTRACT added.

GGSCI (gg1) 13> add exttrail /u01/ggate/dirdat/sd,extract ext01

EXTTRAIL added.

GGSCI (gg1) 28> view params ext01

extract ext01 --提取進程組的名字

userid ggtest, password oracle --同步用戶

exttrail /u01/ggate/dirdat/sd --trail 文件目錄和標識(類似於sd*這樣文件),命名只能是2個字符。

tranlogoptions excludeuser ggtest --避免循環復制的出現

DDL INCLUDE ALL

DDLOPTIONS ADDTRANDATA

table ssgg.*; --同步的表或用戶下所有的表

當你需要同步除Goldengate和Oracle數據庫自帶的用戶外所有用戶的DDL操作時,可在源端主抽取進程中加入下面的內容

ddl include all

然後再在目標端Replicat進程參數文件中加入DDL錯誤的處理語句即可。

2、 t o c o n f i g u r e t h e d a t a p u m p

GGSCI (gg1) 19> add extract p01,exttrailsource /u01/ggate/dirdat/sd,begin now

EXTRACT added.

GGSCI (gg1) 20> add rmttrail /u01/ggate/dirdat/pd,extract p01

RMTTRAIL added.

GGSCI (gg1) 29> view params p01

extract p01

userid ggtest,password oracle

rmthost 192.168.50.231,mgrport 7809 --指定遠端IP和MGR端口

rmttrail /u01/ggate/dirdat/pd

table ssgg.*;

3、 t o c o n f i g u r e t h e r e p l i c a t g r o u p

GGSCI (gg1) 3> add replicat r02,exttrail /u01/ggate/dirdat/dp,begin now

ERROR: No checkpoint table specified for ADD REPLICAT.

GGSCI (gg1) 4> add replicat r02,exttrail /u01/ggate/dirdat/dp,checkpointtable ggtest.checkpoint

REPLICAT added.

GGSCI (gg1) 30> view params r02

replicat r02

assumetargetdefs --定義目標表和源表使用MAP語法有相同的列結構,當出現熱點時,不查看源結構而直接從源定義文件查

userid ggtest,password oracle

DISCARDFILE /u01/ggate/dirdat/sdisc.dsc,append,megabytes 100

DDL INCLUDE MAPPED

DDLERROR DEFAULT IGNORE RETRYOP

map ttgg.*, target ssgg.*;

啟動所有進程:

GGSCI (gg1) 3> start mgr

Manager started.

GGSCI (gg1) 4> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

EXTRACT RUNNING EXT01 00:00:00 00:00:07

EXTRACT RUNNING P01 00:00:00 00:00:01

REPLICAT RUNNING R02 00:00:00 00:00:08

配置gg2,添加checkpoint表:

GGSCI (gg2) 1> dblogin userid ggtest,password oracle

Successfully logged into database.

GGSCI (gg2) 25> view params ./GLOBAL

ggschema ggtest

checkpointtable ggtest.checkpoint

GGSCI (gg2) 29> view params mgr

PORT 7809

dynamicportlist 7810-7900

autostart er *

autorestart er *,retries 5,waitminutes 2

c o n f i g u r a t i o n f r o m s e c o u n d a r y s y s t e m t o p r i m a r y s y s t e m

1 、t o c o n f i g u r e t h e p r i m a r y e x t r a c t g r o u p

GGSCI (gg2) 12> add extract ext02,tranlog,begin now

EXTRACT added.

GGSCI (gg2) 13> add exttrail /u01/ggate/dirdat/td,extract ext02

EXTTRAIL added.

GGSCI (gg2) 26> view params ext02

extract ext02

userid ggtest, password oracle

exttrail /u01/ggate/dirdat/td

tranlogoptions excludeuser ggtest

DDL INCLUDE ALL

DDLOPTIONS ADDTRANDATA

table ttgg.*;

2 、t o c o n f i g u r e t h e p u m p

GGSCI (gg2) 17> add extract p02,exttrailsource /u01/ggate/dirdat/td,begin now

EXTRACT added.

GGSCI (gg2) 19> add rmttrail /u01/ggate/dirdat/dp,extract p02

RMTTRAIL added.

GGSCI (gg2) 27> view params p02

extract p02

userid ggtest,password oracle

rmthost 192.168.50.230,mgrport 7809

rmttrail /u01/ggate/dirdat/dp

table ttgg.*;

3.t o c o n f i g u r e t h e r e p l i c a t g r o u p

GGSCI (gg2) 7> add replicat r01,exttrail /u01/ggate/dirdat/pd,begin now

ERROR: No checkpoint table specified for ADD REPLICAT.

GGSCI (gg2) 8> add replicat r01,exttrail /u01/ggate/dirdat/pd,checkpointtable ggtest.checkpoint;

REPLICAT added.

GGSCI (gg2) 28> view params r01

replicat r01

assumetargetdefs

userid ggtest,password oracle

DISCARDFILE /u01/ggate/dirdat/sdisc.dsc,append,megabytes 100

DISCARDFILE不能直接在安裝目錄/u01/ggate/,進程可能起不來。

DDL INCLUDE MAPPED

DDLERROR DEFAULT IGNORE RETRYOP

map ssgg.*, target ttgg.*;

啟動所有進程:

GGSCI (gg2) 3> start mgr

Manager started.

GGSCI (gg2) 4> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

EXTRACT RUNNING EXT02 00:00:00 00:00:03

EXTRACT RUNNING P02 00:00:00 00:00:07

REPLICAT RUNNING R01 00:00:14 00:00:04

數據同步測試:

Gg1:

SQL> conn ssgg/oracle

Connected.

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

------------------------------ ------- ----------

SSGG TABLE

TTGG TABLE

SQL> create table test as select * from ssgg;

Table created.

SQL> select * from test;

ID

----------

1

5

SQL> commit;

Commit complete.

然後查看gg2,看數據是否同步

Gg2:

SQL> conn ttgg/oracle

Connected.

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

------------------------------ ------- ----------

SSGG TABLE

TTGG TABLE

SQL> /

TNAME TABTYPE CLUSTERID

------------------------------ ------- ----------

SSGG TABLE

TEST TABLE

TTGG TABLE

SQL> insert into test values(10);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test;

ID

----------

1

5

10

再返回gg1,查看數據是否同步:

SQL> host hostname

gg1

SQL> select * from test;

ID

----------

1

5

10

至此,Oracle到Oracle的雙向數據同步成功(DML+DDL)。

實現雙向復制,一般用於雙業務中心環境下在實際應用中。雙向復制(DDL+DML)面臨著許多問題,主要有如下幾點:

1. 如果兩個庫同時更新同一條記錄如何處理?調整業務規則

2. 如果網絡出現失敗如何處理?支持斷點續傳

3. 如果數據不同步後如何修復?導出源端,導入目標端

總結:

雙向復制避免數據沖突是難點,解決這個難點根本還是調整業務:

a) 只在一段開展業務

b) 兩端開展不同業務,涉及不同數據集

c) 兩端開展相同業務,但依據地域或其他條件對數據予以區分,兩邊不操作同一條數據

補充:

在oracle中可以通過rowid來定位某條記錄,但是目標端的數據庫和源端數據庫的數據庫可能完全不一樣,所以無法通過rowid來確定源端數據庫的邏輯變化,這時附加日志supplemental log便登上了表演的舞台。數據庫在開啟附加日志功能後,對於源端的修改操作,oracle會同時追加能夠唯一標示記錄的列到redo log。這樣目標端數據庫就可以知道源端發生了哪些具體的變化。

在目標庫上創建checkpointtable ,此表中保存的檢查點指示 Replicat 進程的當前讀寫位置。這用於在進程需要重啟時或者在服務器出現任何故障或網絡停頓時防止數據丟失。如果沒有這一機制,將導致數據丟失。另一個好處是,通過使用檢查點,多個 Extract 或 Replicat 進程可通過相同的一組線索進行讀取。

對於以批處理模式運行的 Extract 和 Replicat 進程,檢查點不是必需的,因為這樣的進程總是可以重啟。然而,在 Extract 和 Replicat 進程連續工作的情況下,檢查點是必需的。檢查點通常保存在 dirchk 子目錄的文件中,但是對於 Replicat,可以選擇在數據庫的檢查點表中保存檢查點。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved