GoldenGate簡單複製環境的搭建

jeanron100發表於2016-11-11
GoldenGate簡單複製環境的搭建

今天試了下搭建GoldenGate,搭建的過程也簡單總結了一下。
目前源資料庫是newtest2  目標資料庫是dataguru 都是11.2.0.4.0版本
關於GoldenGate的下載可以到下面的連結下載
http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html 在11g中,存在一個和GoldenGate有關的引數,預設是false,我們需要在源庫,目標庫都開啟

 SQL> show parameter golde
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
enable_goldengate_replication        boolean                FALSE

SQL> alter system set enable_goldengate_replication=true;
alter database

然後檢視supplemental log的情況,這個也是需要的設定。
SQL> select SUPPLEMENTAL_LOG_DATA_min from v$database;
SUPPLEMENTAL_LOG
----------------
YES

alter database add supplemental log data; 做完之後,切換日誌使得附加日誌生效。

SQL> alter system archive log current;
System altered.當然我們希望在源端和目標端的資料庫都配置一個資料庫使用者。OGG是宣稱不需要觸發器,中間表,增量標記和時間戳欄位的。

源端的配置資料庫使用者的指令碼如下:

create user ogg_source identified by oracle default tablespace users;
grant alter session to ogg_source;
grant create session to ogg_source;
grant connect to ogg_source;
grant resource to ogg_source;
grant select any dictionary to ogg_source;
grant select any table to ogg_source;
grant flashback any table to ogg_source;
grant alter any table to ogg_source;

目標端配置資料庫使用者的指令碼如下:

 create user ogg_target identified by oracle default tablespace users;
grant alter session to ogg_target;
grant create session to ogg_target;
grant connect to ogg_target;
grant resource to ogg_target;
grant select any dictionary to ogg_target;
grant select any table to ogg_target;
grant flashback any table to ogg_target;
grant alter any table to ogg_target;
grant insert any table to ogg_target;
grant update any table to ogg_target;
grant delete any table to ogg_target;

新增一個表日誌:

EDIT PARAMS ./GLOBALS
GGSCHEMA ogg_source
CHECKPOINTTABLE ogg_source.CHKPTAB

在源端使用資料庫使用者登入

1> dblogin userid ogg_source,password oracle
Successfully logged into database. 為所有要複製的表新增trandata,目前我需要複製的是newtest2這個資料庫下的n1使用者

2> add trandata n1.*;
ERROR: No viable tables matched specification.

這個時候就會明顯感覺到OGG的格式不大喜歡結尾符,得去掉結尾符才可以。

3> add trandata n1.*
2016-11-11 14:13:05  WARNING OGG-06439  No unique key is defined for table A. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
Logging of supplemental redo data enabled for table N1.A.
TRANDATA for scheduling columns has been added on table 'N1.A'. 不過丟擲來下面的錯誤,是許可權不夠,還需要附一個許可權。

2016-11-11 14:13:05  WARNING OGG-00706  Failed to add supplemental log group on table N1.A due to ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_CAPTURE_ADM' must be declared
ORA-06550: line 1, column 7: PL/SQL: Statement ignored SQL BEGIN DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name => '"N1"."A"', supplemental_logging => 'none'); END; 解決方法:

SQL>  grant execute on sys.DBMS_CAPTURE_ADM to ogg_source;
Grant succeeded. 再次執行就沒有問題了。
然後連線到資料庫,開始配置抽取程式

14>  dblogin userid ogg_source,password oracle
Successfully logged into database.

配置引數,使用本地的方式。

15> edit params ext_1
EXTRACT EXT_1
USERID ogg_source, PASSWORD oracle
EXTTRAIL /home/oracle/ogg/ogg_work/dirdat/ss
TABLE N1.*;
新增抽取程式,從資料庫日誌中抓取資料。

>  ADD EXTRACT EXT_1, TRANLOG, BEGIN NOW
EXTRACT added.

配置本地佇列,然後啟動

> ADD EXTTRAIL /home/oracle/ogg/ogg_work/dirdat/ss, EXTRACT EXT_1

> start EXT_1
Sending START request to MANAGER ...
EXTRACT EXT_1 starting

配置完成之後,就可以檢視是否能夠正常抽取了,可以看到是沒有正常啟動。狀態現在還是STOPPED

> info EXT_1
EXTRACT    EXT_1     Initialized   2016-11-11 16:16   Status STOPPED
Checkpoint Lag       00:00:00 (updated 00:01:22 ago)
Log Read Checkpoint  Oracle Redo Logs
                     2016-11-11 16:16:04  Seqno 0, RBA 0
                     SCN 0.0 (0)在11g中沒有配置和OGG相關的資料庫引數,就會丟擲如下的問題了.

2016-11-11 16:17:11  ERROR   OGG-02091  Oracle GoldenGate Capture for Oracle, ext_1.prm:  Operation not supported because enable_goldengate_replication is not set to true.
2016-11-11 16:17:11  ERROR   OGG-01668  Oracle GoldenGate Capture for Oracle, ext_1.prm:  PROCESS ABENDING.修復之後,重新啟動,這個問題就迎刃而解了,檢視這個抽取程式的狀態,可以看到已經有了狀態資料。
> info ext_1
EXTRACT    EXT_1     Last Started 2016-11-11 16:20   Status RUNNING
Checkpoint Lag       00:04:49 (updated 00:00:03 ago)
Process ID           53455
Log Read Checkpoint  Oracle Redo Logs
                     2016-11-11 16:16:04  Seqno 9416, RBA 8206848
                     SCN 0.0 (0)然後開始在源端配置PUMP程式,目標資料庫的IP是10.127.2.32,PASSTHRU代表是一個傳輸程式data pump

>  edit params dpump_1
EXTRACT dpump_1
PASSTHRU
RMTHOST 10.127.2.32, MGRPORT 1530
RMTTRAIL  /home/oracle/ogg/ogg_work/dirdat/ss
TABLE n1.*;

> ADD EXTRACT dpump_1,EXTTRAILSOURCE /home/oracle/ogg/ogg_work/dirdat/ss
EXTRACT added.
> ADD RMTTRAIL /home/oracle/ogg/ogg_work/dirdat/ss, EXTRACT dpump_1
RMTTRAIL added.

配置完成之後,啟動PUMP程式。
> start dpump_1
Sending START request to MANAGER ...
EXTRACT DPUMP_1 starting檢視DUMP程式的資訊如下:

> info dpump_1
EXTRACT    DPUMP_1   Last Started 2016-11-11 16:24   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:04 ago)
Process ID           53479
Log Read Checkpoint  File /home/oracle/ogg/ogg_work/dirdat/ss000000000
                     First Record  RBA 0

對於OGG如果估計最常用的就是info all這個命令了。

> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
EXTRACT     RUNNING     DPUMP_1     00:00:00      00:00:07    
EXTRACT     RUNNING     EXT_1       00:00:00      00:00:00

源端配置完成,我們來配置目標端。  
新增表日誌:

> edit param ./GLOBALS
GGSCHEMA ogg_target
CHECKPOINTTABLE ogg_target.CHKPTAB

登入到資料庫端:

>  dblogin userid ogg_target,password oracle
Successfully logged into database.

目標端配置檢查點:

> add checkpointtable ogg_target.CHKPTAB

Successfully created checkpoint table ogg_target.CHKPTAB

配置投遞佇列引數,將資料應用到目標庫,這裡有個對映關係,就是源庫的n1.*和目標庫的n1.*是對應的。

> edit params rep_1
REPLICAT REP_1
USERID ogg_target, PASSWORD oracle
ASSUMETARGETDEFS
HANDLECOLLISIONS
MAP n1.*,TARGET n1.*; 新增投遞佇列

> ADD REPLICAT REP_1, EXTTRAIL /home/oracle/ogg/ogg_work/dirdat/ss,CHECKPOINTTABLE ggs_target.CHKPTAB
REPLICAT added.

這裡自己給自己埋了一個坑,先不說破了。看看下面的錯誤。

啟動投遞應用程式,但是發現卻有報錯。

> start REP_1
Sending START request to MANAGER ...
REPLICAT REP_1 starting

錯誤提示是比較奇怪的,怎麼使用者名稱密碼錯誤了。

Delivery for Oracle, rep_1.prm:  OCI Error beginning session (status = 1017-ORA-01017: invalid username/password; logon denied),還有SYS.DBMS_STREAMS的訪問許可權不足

下面這個地方錯誤花了些時間來分析,最後才發現是自己把使用者名稱寫錯了。

先刪除,再新增

>delete replicat rep_1 新增的語句如下ogg_target.CHKPTAB是主要的地方,自己給寫錯為ggs_target了。

> ADD REPLICAT REP_1, EXTTRAIL /home/oracle/ogg/ogg_work/dirdat/ss,CHECKPOINTTABLE ogg_target.CHKPTAB
REPLICAT added.

再次啟動就沒有問題了。

> start REP_1
Sending START request to MANAGER ...
REPLICAT REP_1 starting

啟動成功後的狀態是這樣的。
> INFO REP_1
REPLICAT   REP_1     Last Started 2016-11-11 17:02   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:02 ago)
Process ID           69571
Log Read Checkpoint  File /home/oracle/ogg/ogg_work/dirdat/ss000000000
                     First Record  RBA 0不過這個過程中,目標庫還沒有初始資料所以還無法同步,我們應該在目標庫先初始基礎資料,通過exp/imp,expdp/impdp都可以。
同步之後來簡單來一個小的測試。

在源端刪除表test_lock的資料

SQL> delete from test_lock;
99 rows deleted.
SQL> commit;
Commit complete.

然後在源端檢視,可以看到抽取程式的SCN開始變化

2016-11-11 17:15:04  Seqno 9417, RBA 729600
SCN 0.17848618 (17848618)
稍等一會就變為
2016-11-11 17:17:25  Seqno 9417, RBA 841728
SCN 0.17848776 (17848776)                    
然後檢視目標端,開始是有資料的

SQL> select count(*)from test_lock;
  COUNT(*)
----------
        99

稍作等待,就可以看到資料被刪除了。

 SQL> /
  COUNT(*)
----------
         0  


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

相關文章