OGG雙向條件複製的部署與測試

llnnmc發表於2018-03-28

一、部署環境說明

設計需求:
本地有兩個節點,節點1和節點2,其SCOTT方案的表資料需要同步上傳到主伺服器端做資料歸併,主伺服器端的DDL操作和HR方案的所有物件和資料需要同步釋出到本地各節點,且資料要按照篩選條件來分發。

主伺服器端:
計算機名:ora11g-1
IP:192.168.0.105
作業系統:Windows Server 2008 R2 Enterprise SP1 64位
資料庫:Oracle 11g 11.2.0.4.0 64位

本地節點1:
計算機名:ora11g-2
IP:192.168.0.103
作業系統:Win7 旗艦版 SP1 64位
資料庫:Oracle 11g 11.2.0.4.0 64位

本地節點2:
計算機名:ora11g-3
IP:192.168.0.104
作業系統:Win7 旗艦版 SP1 64位
資料庫:Oracle 11g 11.2.0.4.0 64位

在這裡,本地節點和主伺服器端同時即作為源端,也作為目標端,一部分表由多個本地節點向一個主伺服器端複製,另一部分表由主伺服器端向多個本地節點複製,並且要按照一定條件進行資料篩選分發。
 
二、OGG軟體下載

因為是在Windows系統下Oracle資料庫之間的複製,因此我們選擇for Oracle的64位Windows版本
Oracle GoldenGate 12.3.0.1.2 for Oracle on Windows (64 bit)?(450 MB)?

三、OGG軟體安裝

1、系統環境準備,需要安裝VC2010可再發行元件包(Source & Target DB)


下載地址:

2、安裝OGG軟體,選擇for Oracle 11g,選擇安裝路徑c:\ogg,定位Oracle主目錄,管理埠用預設7809(Source & Target DB)

3、設定永久性環境變數,根據實際情況設定
setx /m ORACLE_BASE C:\oracle
setx /m ORACLE_HOME C:\oracle\product\11.2.0\dbhome_1
setx /m ORACLE_SID mes
setx /m PATH "%PATH%;C:\ogg"

4、建立OGG目錄(Source & Target DB)

進入OGG控制檯
ggsci

建立OGG目錄,如果目錄已經存在,則會提示
create subdirs

四、資料庫準備

1、源端修改資料庫為歸檔模式(Source DB)

檢查源端資料庫當前日誌模式
archive log list;

如為非歸檔模式,則需要重啟資料庫到mount,將資料庫修改為歸檔模式。

首先設定好歸檔路徑和歸檔日誌檔名,這裡在閃回恢復區中建立一個目錄archivelog用於存放歸檔日誌
alter system set log_archive_dest_1 = 'location=E:\fast_recovery_area\mes\archivelog';
alter system set log_archive_format = 'arc_%d_%t_%r_%s.log' scope = spfile;

然後重新載入資料庫
shutdown immediate;
startup mount;

設定資料庫為歸檔模式
alter database archivelog;
alter database open;

確認模式已更改
archive log list;

2、源端資料庫開啟最小化補充日誌和強制日誌(Source DB)

開啟最小化補充日誌
alter database add supplemental log data;

開啟資料庫強制日誌
alter database force logging;

確認最小補充日誌和強制日誌已開啟
select supplemental_log_data_min, force_logging from v$database;

SUPPLEME FORCE_LOGGING
-------- ---------------------------------------
YES      YES

3、禁用源端與同步物件相關的所有觸發器,此條保證資料不會在目標端重複複製。(Source DB)

4、建立OGG專有表空間和使用者並授權(Source & Target DB)

create tablespace ogg datafile 'D:\oradata\mes\ogg01.dbf' size 100m;
create user ogg identified by oggmes01 default tablespace ogg;
grant dba to ogg;
grant execute on utl_file to ogg;
exec dbms_goldengate_auth.grant_admin_privilege('ogg', '*', true);

5、對於Oracle 11.2.0.4及以後版本,需要修改初始化引數(Source & Target DB)

alter system set enable_goldengate_replication = true;

6、為方便測試,在部署OGG之前,分別在本地節點和主伺服器上建立測試表。

在兩個本地節點源端的SCOTT模式下各建立一張測試表,主伺服器目標端也建立一張測試表,源端、目標端中這些表的資料可能是不同的。

節點1:
create table scott.emp1 as select * from scott.emp;
alter table scott.emp1 add constraint pk_emp1 primary key (empno);

節點2:
create table scott.emp1 as select * from scott.emp;
alter table scott.emp1 add constraint pk_emp1 primary key (empno);

主伺服器端:
create table scott.emp1 as select * from scott.emp;
alter table scott.emp1 add constraint pk_emp1 primary key (empno);

在主伺服器源端的HR模式下建立一張測試表,在兩個本地節點目標端也各建立一張測試表,並以不同資料範圍劃分。

主伺服器端:
create table hr.employees1 as select * from hr.employees;
alter table hr.employees1 add constraint pk_employees1 primary key (employee_id);

節點1:
create table hr.employees1 as select * from hr.employees where department_id = 30;
alter table hr.employees1 add constraint pk_employees1 primary key (employee_id);

節點2:
create table hr.employees1 as select * from hr.employees where department_id = 60;
alter table hr.employees1 add constraint pk_employees1 primary key (employee_id);
 
五、OGG部署

1、進入OGG管理介面並登入資料庫(Source & Target DB)

進入OGG管理介面
ggsci

登入資料庫
dblogin userid ogg password oggmes01
 
2、源端開啟表的最小附加日誌(Source DB)

本地節點開啟模式下的所有表
add trandata scott.*

檢視開啟資訊
info trandata scott.*

主伺服器端因為需要根據表的欄位值來分發資料,因此需要獨立說明各個表的附加日誌,這裡要分發的資料是測試表employees1,並且是根據department_id來篩選
add trandata hr.countries
add trandata hr.departments
add trandata hr.employees
add trandata hr.employees1, cols(department_id)
add trandata hr.jobs
add trandata hr.job_history
add trandata hr.locations
add trandata hr.regions

檢視開啟資訊
info trandata hr.*

可檢視OGG日誌組資訊

本地節點:
col owner for a10
col log_group_name for a20
col table_name for a20
select * from dba_log_groups where owner = 'SCOTT';

OWNER      LOG_GROUP_NAME       TABLE_NAME           LOG_GROUP_TYPE               ALWAYS      GENERATED
---------- -------------------- -------------------- ---------------------------- ----------- --------------
SCOTT      GGS_32198            BONUS                USER LOG GROUP               ALWAYS      USER NAME
SCOTT      SYS_C0010002         BONUS                PRIMARY KEY LOGGING          ALWAYS      GENERATED NAME
SCOTT      SYS_C0010003         BONUS                UNIQUE KEY LOGGING           CONDITIONAL GENERATED NAME
SCOTT      SYS_C0010004         BONUS                FOREIGN KEY LOGGING          CONDITIONAL GENERATED NAME
SCOTT      GGS_32194            DEPT                 USER LOG GROUP               ALWAYS      USER NAME
SCOTT      SYS_C0010006         DEPT                 PRIMARY KEY LOGGING          ALWAYS      GENERATED NAME
SCOTT      SYS_C0010007         DEPT                 UNIQUE KEY LOGGING           CONDITIONAL GENERATED NAME
SCOTT      SYS_C0010008         DEPT                 FOREIGN KEY LOGGING          CONDITIONAL GENERATED NAME
SCOTT      GGS_32196            EMP                  USER LOG GROUP               ALWAYS      USER NAME
SCOTT      SYS_C0010010         EMP                  PRIMARY KEY LOGGING          ALWAYS      GENERATED NAME
SCOTT      SYS_C0010011         EMP                  UNIQUE KEY LOGGING           CONDITIONAL GENERATED NAME
SCOTT      SYS_C0010012         EMP                  FOREIGN KEY LOGGING          CONDITIONAL GENERATED NAME
SCOTT      GGS_33827            EMP1                 USER LOG GROUP               ALWAYS      USER NAME
SCOTT      SYS_C0010014         EMP1                 PRIMARY KEY LOGGING          ALWAYS      GENERATED NAME
SCOTT      SYS_C0010015         EMP1                 UNIQUE KEY LOGGING           CONDITIONAL GENERATED NAME
SCOTT      SYS_C0010016         EMP1                 FOREIGN KEY LOGGING          CONDITIONAL GENERATED NAME
SCOTT      GGS_32199            SALGRADE             USER LOG GROUP               ALWAYS      USER NAME
SCOTT      SYS_C0010018         SALGRADE             PRIMARY KEY LOGGING          ALWAYS      GENERATED NAME
SCOTT      SYS_C0010019         SALGRADE             UNIQUE KEY LOGGING           CONDITIONAL GENERATED NAME
SCOTT      SYS_C0010020         SALGRADE             FOREIGN KEY LOGGING          CONDITIONAL GENERATED NAME

主伺服器端:
col owner for a10
col log_group_name for a20
col table_name for a20
select * from dba_log_groups where owner = 'HR';

OWNER      LOG_GROUP_NAME       TABLE_NAME           LOG_GROUP_TYPE      ALWAYS      GENERATED
---------- -------------------- -------------------- ------------------- ----------- --------------
HR         GGS_91276            COUNTRIES            USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021574         COUNTRIES            PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021575         COUNTRIES            UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021576         COUNTRIES            FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91281            DEPARTMENTS          USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021578         DEPARTMENTS          PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021579         DEPARTMENTS          UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021580         DEPARTMENTS          FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91286            EMPLOYEES            USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021582         EMPLOYEES            PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021583         EMPLOYEES            UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021584         EMPLOYEES            FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_92582            EMPLOYEES1           USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021586         EMPLOYEES1           PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021587         EMPLOYEES1           UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021588         EMPLOYEES1           FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91284            JOBS                 USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021590         JOBS                 PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021591         JOBS                 UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021592         JOBS                 FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91290            JOB_HISTORY          USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021594         JOB_HISTORY          PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021595         JOB_HISTORY          UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021596         JOB_HISTORY          FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91278            LOCATIONS            USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021598         LOCATIONS            PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021599         LOCATIONS            UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021600         LOCATIONS            FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
HR         GGS_91274            REGIONS              USER LOG GROUP      ALWAYS      USER NAME
HR         SYS_C0021602         REGIONS              PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
HR         SYS_C0021603         REGIONS              UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
HR         SYS_C0021604         REGIONS              FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME

可檢視OGG日誌組列資訊

本地節點:
col owner for a10
col table_name for a20
col column_name for a20
select * from dba_log_group_columns where owner = 'SCOTT';

OWNER      LOG_GROUP_NAME       TABLE_NAME           COLUMN_NAME            POSITION LOGGIN
---------- -------------------- -------------------- -------------------- ---------- ------
SCOTT      GGS_32196            EMP                  EMPNO                         1 LOG
SCOTT      GGS_33827            EMP1                 EMPNO                         1 LOG
SCOTT      GGS_32199            SALGRADE             GRADE                         1 LOG
SCOTT      GGS_32199            SALGRADE             LOSAL                         2 LOG
SCOTT      GGS_32199            SALGRADE             HISAL                         3 LOG
SCOTT      GGS_32198            BONUS                ENAME                         1 LOG
SCOTT      GGS_32198            BONUS                JOB                           2 LOG
SCOTT      GGS_32198            BONUS                SAL                           3 LOG
SCOTT      GGS_32198            BONUS                COMM                          4 LOG
SCOTT      GGS_32194            DEPT                 DEPTNO                        1 LOG

主伺服器端:
col owner for a10
col table_name for a20
col column_name for a20
select * from dba_log_group_columns where owner = 'HR';

OWNER      LOG_GROUP_NAME       TABLE_NAME           COLUMN_NAME            POSITION LOGGIN
---------- -------------------- -------------------- -------------------- ---------- ------
HR         GGS_92582            EMPLOYEES1           EMPLOYEE_ID                   1 LOG
HR         GGS_92582            EMPLOYEES1           DEPARTMENT_ID                 2 LOG
HR         GGS_91276            COUNTRIES            COUNTRY_ID                    1 LOG
HR         GGS_91281            DEPARTMENTS          DEPARTMENT_ID                 1 LOG
HR         GGS_91286            EMPLOYEES            EMPLOYEE_ID                   1 LOG
HR         GGS_91284            JOBS                 JOB_ID                        1 LOG
HR         GGS_91290            JOB_HISTORY          EMPLOYEE_ID                   1 LOG
HR         GGS_91290            JOB_HISTORY          START_DATE                    2 LOG
HR         GGS_91278            LOCATIONS            LOCATION_ID                   1 LOG
HR         GGS_91274            REGIONS              REGION_ID                     1 LOG

注意到employees1表除了主鍵employee_id外,department_id列也被加入附加日誌,因為主伺服器端要依據該列向節點分發資料。

如要取消表的最小附加日誌
delete trandata scott.*

如要直接在模式級別上開啟附加日誌
add schematrandata scott

注:
1)如不執行add trandata,insert同步沒有問題,但在同步update或delete操作時,會因為丟失主鍵報同步錯誤。不開啟表級的最小附加日誌,redo資訊不記錄沒有進行更新的欄位,如主鍵不更新的話主鍵不記錄在redo中,導致同步失敗。

2)對於11.2.0.4以下的Oracle版本,執行add schematrandata命令時會報錯:
OGG-06522  Cannot verify existence of table function that is required to ADD schema level supplemental logging, failed to find function.
此為Oracle自身bug,解決辦法是需要安裝bug 13794550相關的patch補丁。

3)在OGG同步環境搭建好之後再新建的表需要及時新增add trandata,否則同步時update操作將失敗。
 
3、為支援DDL複製,主伺服器源端從OGG安裝目錄進入sqlplus,執行以下指令碼,期間會提示鍵入OGG使用者名稱(Source DB)

@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
@ddl_enable.sql
@marker_status.sql
grant ggs_ggsuser_role to ogg;

注:如果在10g中使用DDL複製,需要關閉回收站,11g不需要。

4、配置全域性引數和checkpoint表(Source DB & Target DB)

全域性引數檔案的路徑應放置在OGG根目錄下,且無副檔名,這一點和其他引數檔案是不一樣的

檔案c:\ogg\globals,內容如下
ggschema ogg
checkpointtable ogg.checkpoint
allowoutputdir c:\ogg\dirdat

新增checkpoint表
add checkpointtable ogg.checkpoint

確認表已建立,包含了checkpoint和checkpoint_lox兩張表
conn ogg/oggmes01
select * from cat;

TABLE_NAME           TABLE_TYPE
-------------------- -----------
CHECKPOINT           TABLE
CHECKPOINT_LOX       TABLE
GGS_DDL_COLUMNS      TABLE
GGS_DDL_HIST         TABLE
GGS_DDL_HIST_ALT     TABLE
GGS_DDL_LOG_GROUPS   TABLE
GGS_DDL_OBJECTS      TABLE
GGS_DDL_PARTITIONS   TABLE
GGS_DDL_PRIMARY_KEYS TABLE
GGS_DDL_RULES        TABLE
GGS_DDL_RULES_LOG    TABLE
GGS_DDL_SEQ          SEQUENCE
GGS_MARKER           TABLE
GGS_MARKER_SEQ       SEQUENCE
GGS_SETUP            TABLE
GGS_STICK            TABLE
GGS_TEMP_COLS        TABLE
GGS_TEMP_UK          TABLE
 
5、配置管理程式(Source & Target DB)

編輯引數檔案
edit param mgr

內容如下
port 7809
autostart er *
autorestart er *, retries 3, waitminutes 5, resetminutes 60
purgeoldextracts c:\ogg\dirdat\*, usecheckpoints, minkeepdays 3

可以檢視管理程式的引數檔案內容
view param mgr

Windows需要將管理程式加入到服務中
cd c:\ogg
install addservice

對於目標端,在Windows服務管理器services.msc中將GGSMGR服務的啟動型別改為自動(延遲啟動),以協調程式之間的順序關係。

如要刪除該服務
sc delete ggsmgr

6、配置源端提取程式(Source DB)

兩個本地節點到主伺服器端的複製是多對1的關係,因此本地節點不能包含相同的DDL,否則主伺服器端將對DDL試圖應用兩次導致出錯。從業務上講,多個本地節點是將不同的DML資料歸併到主伺服器端的相同表中的,而表結構等的DDL應是由主伺服器端向各個本地節點分發的,因此本地節點的各程式引數不應包含對DDL的應用。

本地節點編輯引數檔案
edit param ext1

內容如下
extract ext1
userid ogg, password oggmes01
exttrail c:\ogg\dirdat\e1
table scott.*;

檢視提取程式的引數檔案內容
view param ext1

增加提取程式
add extract ext1, tranlog, begin now
add exttrail c:\ogg\dirdat\e1, extract ext1

主伺服器端應配置兩套提取程式,分別對應兩個本地節點的資料提取,包含DDL操作,部分表按照刷選條件選取資料。

主伺服器端對應節點1
edit param ext1

內容如下
extract ext1
userid ogg, password oggmes01
exttrail c:\ogg\dirdat\e1
ddl include all
table hr.countries;
table hr.departments;
table hr.employees;
table hr.employees1, filter(department_id = 30);
table hr.jobs;
table hr.job_history;
table hr.locations;
table hr.regions;

主伺服器端對應節點2
edit param ext2

內容如下
extract ext2
userid ogg, password oggmes01
exttrail c:\ogg\dirdat\e2
ddl include all
table hr.countries;
table hr.departments;
table hr.employees;
table hr.employees1, filter(department_id = 60);
table hr.jobs;
table hr.job_history;
table hr.locations;
table hr.regions;

檢視提取程式的引數檔案內容
view param ext1
view param ext2

增加提取程式
add extract ext1, tranlog, begin now
add exttrail c:\ogg\dirdat\e1, extract ext1

add extract ext2, tranlog, begin now
add exttrail c:\ogg\dirdat\e2, extract ext2

將提取程式做成Windows後臺服務,方法如下:
1)下載instsrv.exe和srvany.exe兩個Windows後臺服務製作程式,兩個程式複製到OGG安裝目錄


下載地址:

2)Windows命令列中執行該工具,要求必須寫全路徑,本地節點生成名為GGSEXT1的後臺服務,主伺服器端則需要配置兩個服務
c:\ogg\instsrv.exe GGSEXT1 c:\ogg\srvany.exe
c:\ogg\instsrv.exe GGSEXT2 c:\ogg\srvany.exe

3)在Windows登錄檔中掛接服務執行的程式
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下找到GGSEXT1服務,右擊新建項,名為Parameters,單擊該項,在右邊新建兩個字串值:
Application,值為c:\ogg\extract paramfile c:\ogg\dirprm\ext1.prm
AppDirectory,值為c:\ogg

同理對於GGSEXT2服務,登錄檔Application值為c:\ogg\extract paramfile c:\ogg\dirprm\ext2.prm。

在Windows服務管理器services.msc中修改GGSEXT1和GGSEXT2服務的啟動型別為自動(延遲啟動),使得提取程式的啟動在管理程式之後。
 
7、配置源端傳輸程式(Source DB)

源端本地節點編輯引數檔案,其中IP地址是目標端的地址
edit param pump1

節點1
extract pump1
userid ogg, password oggmes01
rmthost 192.168.0.105, mgrport 7809, compress
rmttrail c:\ogg\dirdat\p1
table scott.*;

節點2
extract pump1
userid ogg, password oggmes01
rmthost 192.168.0.105, mgrport 7809, compress
rmttrail c:\ogg\dirdat\p2
table scott.*;

可以檢視傳輸程式的引數檔案內容
view param pump1

本地節點1增加傳輸程式
add extract pump1, exttrailsource c:\ogg\dirdat\e1
add rmttrail c:\ogg\dirdat\p1, extract pump1

本地節點2增加傳輸程式
add extract pump1, exttrailsource c:\ogg\dirdat\e1
add rmttrail c:\ogg\dirdat\p2, extract pump1

對於主伺服器端,分別編輯不同引數檔案指向不同節點,引數檔案中包含了對DDL的應用

對應節點1
edit param pump1

內容如下
extract pump1
userid ogg, password oggmes01
rmthost 192.168.0.103, mgrport 7809, compress
rmttrail c:\ogg\dirdat\p1
ddl include all
table hr.*;

對應節點2
edit param pump2

內容如下
extract pump2
userid ogg, password oggmes01
rmthost 192.168.0.104, mgrport 7809, compress
rmttrail c:\ogg\dirdat\p2
ddl include all
table hr.*;

可以檢視傳輸程式的引數檔案內容
view param pump1
view param pump2

主伺服器端分別增加2個傳輸程式
add extract pump1, exttrailsource c:\ogg\dirdat\e1
add rmttrail c:\ogg\dirdat\p1, extract pump1

add extract pump2, exttrailsource c:\ogg\dirdat\e2
add rmttrail c:\ogg\dirdat\p2, extract pump2
 
8、配置目標端複製程式(Target DB)

多個源端時,目標端需要對應配置多個不同的複製程式。對於同一個源端過來的不同trail,也需要配置不同的複製程式。

主伺服器端對應本地節點1,編輯複製程式引數檔案
edit param rep1

內容如下
replicat rep1
userid ogg, password oggmes01
map scott.*, target scott.*;

主伺服器端對應本地節點2,編輯複製程式引數檔案
edit param rep2

內容如下
replicat rep2
userid ogg, password oggmes01
map scott.*, target scott.*;

檢視配置
view param rep1
view param rep2

主伺服器端新增複製程式
add replicat rep1, exttrail c:\ogg\dirdat\p1, checkpointtable ogg.checkpoint
add replicat rep2, exttrail c:\ogg\dirdat\p2, checkpointtable ogg.checkpoint

兩個本地節點編輯複製程式引數檔案
edit param rep1

內容如下
replicat rep1
userid ogg, password oggmes01
map hr.*, target hr.*;

檢視配置
view param rep1

兩個本地節點新增複製程式,分別對應主伺服器端傳來的不同trail檔案

節點1
add replicat rep1, exttrail c:\ogg\dirdat\p1, checkpointtable ogg.checkpoint

節點2
add replicat rep1, exttrail c:\ogg\dirdat\p2, checkpointtable ogg.checkpoint
 
9、程式的啟動

按照以下順序分別啟動目標端和源端各程式。

1)目標端

啟動管理程式,可在Windows服務管理器services.msc中啟動服務,或在Windows命令列中啟動服務
sc start ggsmgr

檢視程式啟動狀態
sc query ggsmgr

確認管理程式已啟動,並且複製程式也被自動啟動
info all

2)源端

啟動管理程式,可在Windows服務管理器services.msc中啟動服務,或在Windows命令列中啟動服務
sc start ggsmgr

檢視管理程式啟動狀態
sc query ggsmgr

確認管理程式已啟動,並且傳播程式也被自動啟動
info all

啟動提取程式,可在Windows服務管理器services.msc中啟動服務,或在Windows命令列中啟動服務
sc start ggsext1

檢視提取程式啟動狀態
sc query ggsext1

確認提取程式已啟動
info all

注:
1)一些程式如傳輸程式可能不會隨管理程式一次性啟動成功,按照管理程式中引數的配置,未啟動成功的程式間隔一定時間後會自動嘗試重新啟動直至成功。
2)實測在Windows中直接使用OGG命令start mgr和start ext1是不能啟動管理程式和提取程式的。
3)如果不將提取程式做成後臺服務,而直接在Windows命令列中啟動提取程式,則視窗必須一直保持開啟不能關閉,否則程式終止。
c:\ogg\extract paramfile c:\ogg\dirprm\ext1.prm

六、各種物件的同步測試

1、表

// insert
主伺服器源端插入資料
insert into employees1 values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into employees1 values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;

檢查本地節點目標端資料被同步,應當是第一條記錄被同步到節點1,第二條記錄被同步到節點2。

本地節點1源端插入資料
insert into scott.emp1 values('1001', 'zhang', 'clerk', '7902', sysdate, 1000, '', '20');
commit;

本地節點2源端插入資料
insert into scott.emp1 values('1002', 'wang', 'clerk', '7902', sysdate, 1000, '', '20');
commit;

注意因為需要將兩個源端的資料同步合併到目標端,因此插入的主鍵值需要跳開,不能一樣。

檢查主伺服器目標端資料被同步合併。

// update
主伺服器源端更新資料
update employees1 set salary = 3500 where employee_id = 1001;
update employees1 set salary = 3000 where employee_id = 1002;
commit;

檢查本地節點目標端資料分別被同步更新。

本地節點1源端更新資料
update scott.emp1 set job='manager' where ename='zhang';
commit;

本地節點2源端更新資料
update scott.emp1 set job='manager' where ename='wang';
commit;

檢查主伺服器目標端資料被同步更新。

// delete
主伺服器源端刪除資料
delete from employees1 where employee_id in (1001, 1002);
commit;

檢查本地節點目標端資料被同步刪除。

本地節點1源端刪除資料
delete from scott.emp1 where ename='zhang';
commit;

本地節點2源端刪除資料
delete from scott.emp1 where ename='wang';
commit;

檢查主伺服器目標端資料被同步刪除。

// modify column
主伺服器源端增加表列的DDL操作
alter table hr.employees1 add col1 varchar2(20);

檢查本地節點目標端表列被同步增加。

主伺服器源端刪除表列的DDL操作
alter table hr.employees1 drop column col1;

檢查本地節點目標端表列被同步刪除。

// constraint
主伺服器源端給表增加非空約束
alter table hr.employees1 modify first_name constraint nn_first_name not null;

檢查本地節點目標端約束已同步
col constraint_name for a20
col table_name for a20
col r_constraint_name for a20
col column_name for a20
select constraint_name, constraint_type, table_name, column_name, r_constraint_name, status from user_constraints natural join user_cons_columns where table_name = 'EMPLOYEES1';

CONSTRAINT_NAME      CONSTRAINT_TYPE TABLE_NAME           COLUMN_NAME          R_CONSTRAINT_NAME    STATUS
-------------------- --------------- -------------------- -------------------- -------------------- --------
SYS_C009996          C               EMPLOYEES1           LAST_NAME                                 ENABLED
SYS_C009997          C               EMPLOYEES1           EMAIL                                     ENABLED
SYS_C009998          C               EMPLOYEES1           HIRE_DATE                                 ENABLED
SYS_C009999          C               EMPLOYEES1           JOB_ID                                    ENABLED
PK_EMPLOYEES1        P               EMPLOYEES1           EMPLOYEE_ID                               ENABLED
NN_FIRST_NAME        C               EMPLOYEES1           FIRST_NAME                                ENABLED

主伺服器源端刪除約束
alter table hr.employees1 drop constraint nn_first_name;
 
檢查本地節點目標端約束被同步刪除。

// index
主伺服器源端給表新增索引
create index hr.idx_first_name on hr.employees1(first_name);

檢查本地節點目標端索引已同步
col column_name for a20
col tablespace_name for a20
col table_name for a20
select index_name, index_type, table_name, column_name, tablespace_name, uniqueness, status from user_indexes natural join user_ind_columns where table_name = 'EMPLOYEES1';

INDEX_NAME                     INDEX_TYPE                  TABLE_NAME           COLUMN_NAME          TABLESPACE_NAME      UNIQUENESS STATUS
------------------------------ --------------------------- -------------------- -------------------- -------------------- ---------- --------
PK_EMPLOYEES1                  NORMAL                      EMPLOYEES1           EMPLOYEE_ID          USERS                UNIQUE     VALID
IDX_FIRST_NAME                 NORMAL                      EMPLOYEES1           FIRST_NAME           USERS                NONUNIQUE  VALID

主伺服器源端刪除索引
drop index hr.idx_first_name;

檢查本地節點目標端索引被同步刪除。

// create table
主伺服器源端建立表的DDL操作
create table hr.t1 as select * from hr.employees;

新增表的補充日誌
add trandata hr.t1

修改主伺服器源端的兩個提取程式引數,新增對錶t1的提取
edit param ext1

新增
table hr.t1;

edit param ext2

新增
table hr.t1;

在Windows服務程式services.msc中重啟兩個提取程式GGSEXT1和GGSEXT2的服務。

確認程式恢復執行
info all

插入資料
insert into t1 values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into t1 values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;

檢查本地節點目標端,由於t1表沒有做資料篩選,所以被全部複製。

更新資料
update t1 set salary = 3000 where employee_id = 1001;
update t1 set salary = 2500 where employee_id = 1002;
commit;

檢查本地節點目標端,資料被同步更新。
 
// truncate
截斷表
truncate table hr.t1;

檢查本地節點目標端,表被截斷。

// drop table
刪除表
drop table hr.t1 purge;

檢查本地節點目標端,表被刪除。

實測表明,新增表之後,需要及時在源端開啟表的補充日誌,否則update將失敗,並導致目標端複製程式異常終止。但同時也驗證了對於沒有主鍵和唯一索引的表,複製可以正常進行。

修改主伺服器端兩個提取程式引數,取消對t1表的提取,並在Windows服務程式services.msc中重啟兩個提取程式GGSEXT1和GGSEXT2的服務。

2、儲存過程

主伺服器源端建立儲存過程
create or replace procedure hr.test1 is
  my_count number;
begin
  select count(*) into my_count from employees;
  dbms_output.put_line('The number of records in table EMPLOYEES is ' ||
                       my_count);
end;
/

檢查本地節點目標端儲存過程已同步建立,可以看到Oracle自動加入了OGG複製的註釋
col text for a80
select line, text from user_source where name = 'TEST1';

      LINE TEXT
---------- --------------------------------------------------------------------------------
         1 procedure      "TEST1" is
         2        my_count number;
         3      begin
         4        select count(*) into my_count from employees;
         5        dbms_output.put_line('The number of records in table EMPLOYEES is ' ||
         6                             my_count);
         7      end;
         8
         9
        10
        11   /* GOLDENGATE_DDL_REPLICATION */

主伺服器源端更新儲存過程
create or replace procedure hr.test1 is
  my_count number;
begin
  select count(*) into my_count from jobs;
  dbms_output.put_line('The number of records in table JOBS is ' ||
                       my_count);
end;
/

檢查本地節點目標端儲存過程已同步更新。

主伺服器源端刪除儲存過程
drop procedure hr.test1;

檢查本地節點目標端儲存過程已同步刪除。
 
3、序列

主伺服器源端建立序列
create sequence hr.myid start with 1 increment by 10;

檢查本地節點目標端序列已同步建立
col sequence_name for a30
select * from user_sequences;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ ---------- ---------- ---------- -----------
DEPARTMENTS_SEQ                         1       9990           10 N          N                   0         280
EMPLOYEES_SEQ                           1       1E28            1 N          N                   0         207
LOCATIONS_SEQ                           1       9900          100 N          N                   0        3300
MYID                                    1       1E28           10 N          N                  20           1

主伺服器源端更新序列
alter sequence hr.myid increment by 20;

檢查本地節點目標端序列已同步更新。

主伺服器源端刪除序列
drop sequence hr.myid;

檢查本地節點目標端序列已同步刪除。

4、同義詞

主伺服器源端建立同義詞
create public synonym e for hr.employees;

檢查本地節點目標端確認public同義詞也是可以同步的
col owner for a10
col synonym_name for a15
col table_owner for a10
col table_name for a15
col db_link for a20
select * from dba_synonyms where synonym_name='E';

OWNER      SYNONYM_NAME    TABLE_OWNE TABLE_NAME      DB_LINK
---------- --------------- ---------- --------------- --------------------
PUBLIC     E               HR         EMPLOYEES

主伺服器源端刪除同義詞
drop public synonym e;

檢查本地節點目標端同義詞已同步刪除。
 
5、觸發器

主伺服器源端建立測試表
create table hr.employees2 as select * from hr.employees;

新增表的補充日誌
add trandata hr.employees2

修改提取程式,新增對錶employees2的提取
edit param ext1

新增
table hr.employees2;

edit param ext2

新增
table hr.employees2;

重啟主伺服器端的兩個提取程式。

主伺服器源端建立觸發器
create or replace trigger hr.tri1
  after insert on hr.employees1
  for each row
begin
  insert into hr.employees2
    (employee_id,
     first_name,
     last_name,
     email,
     phone_number,
     hire_date,
     job_id,
     salary,
     commission_pct,
     manager_id,
     department_id)
  values
    (:new.employee_id,
     :new.first_name,
     :new.last_name,
     :new.email,
     :new.phone_number,
     :new.hire_date,
     :new.job_id,
     :new.salary,
     :new.commission_pct,
     :new.manager_id,
     :new.department_id);
end;
/

檢查本地節點目標端觸發器已同步建立
col text for a50
select line, text from user_source where name = 'TRI1';

      LINE TEXT
---------- --------------------------------------------------
         1 trigger "HR"."TRI1"
         2   after insert on "HR"."EMPLOYEES1"
         3   for each row
         4 begin
         5   insert into hr.employees2
         6     (employee_id,
         7      first_name,
         8      last_name,
         9      email,
        10      phone_number,
        11      hire_date,
        12      job_id,
        13      salary,
        14      commission_pct,
        15      manager_id,
        16      department_id)
        17   values
        18     (:new.employee_id,
        19      :new.first_name,
        20      :new.last_name,
        21      :new.email,
        22      :new.phone_number,
        23      :new.hire_date,
        24      :new.job_id,
        25      :new.salary,
        26      :new.commission_pct,
        27      :new.manager_id,
        28      :new.department_id);
        29 end;
        30   /* GOLDENGATE_DDL_REPLICATION */

主伺服器源端對錶employees1插入資料,測試本地節點目標端的同步效果
insert into employees1 values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into employees1 values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;
 
結果主伺服器源端表employees2中觸發新增了兩條記錄,本地節點目標端表employees2中同步新增了兩條記錄,但本地節點目標端表employees1的觸發器未執行,否則employees2中應該有重複的記錄,employees2表本身是沒有主鍵約束和唯一約束的。

主伺服器源端刪除觸發器
drop trigger hr.tri1;

檢查本地節點目標端觸發器已同步刪除。

刪除主伺服器端employees2表,修改主伺服器端兩個提取程式引數,取消對employees2表的提取,並在Windows服務程式services.msc中重啟兩個提取程式GGSEXT1和GGSEXT2的服務。

6、型別和函式

主伺服器源端建立型別
create or replace type hr.type1 as table of varchar2(255);

建立函式
create or replace function hr.f1(v_str varchar2, v_sep varchar2 := ',')
  return type1
  pipelined is
  my_idx  pls_integer;
  my_list varchar2(32767) := v_str;
begin
  loop
    my_idx := instr(my_list, v_sep);
    if my_idx > 0 then
      pipe row(substr(my_list, 1, my_idx - 1));
      my_list := substr(my_list, my_idx + length(v_sep));
    else
      pipe row(my_list);
      exit;
    end if;
  end loop;
  return;
end;
/

檢查本地節點目標端型別和函式已同步
col text for a50
select line, text from user_source where name = 'TYPE1';

      LINE TEXT
---------- --------------------------------------------------
         1 type      "TYPE1" as table of varchar2(255);
         2
         3   /* GOLDENGATE_DDL_REPLICATION */

col text for a80
select line, text from user_source where name = 'F1';

      LINE TEXT
---------- --------------------------------------------------------------------------------
         1 function      "F1"(v_str varchar2, v_sep varchar2 := ',')
         2    return type1
         3    pipelined is
         4    my_idx  pls_integer;
         5    my_list varchar2(32767) := v_str;
         6  begin
         7    loop
         8      my_idx := instr(my_list, v_sep);
         9      if my_idx > 0 then
        10        pipe row(substr(my_list, 1, my_idx - 1));
        11        my_list := substr(my_list, my_idx + length(v_sep));
        12      else
        13        pipe row(my_list);
        14        exit;
        15      end if;
        16    end loop;
        17    return;
        18  end;
        19
        20   /* GOLDENGATE_DDL_REPLICATION */

主伺服器源端刪除型別和函式
drop type hr.type1;
drop function hr.f1;

檢查本地節點目標端型別和函式已同步刪除。
 
7、檢視及許可權的測試

主伺服器源端建立檢視,需要給hr使用者授權
conn / as sysdba
grant create view to hr;
conn hr/hr
create or replace view v1 as select * from employees1;

檢查本地節點目標端檢視已同步
col text for a80
select view_name, text from user_views where view_name = 'V1';

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
V1                             select "EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE"
                               ,"JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID" from employees1
                                 /* GOLDENGATE_DDL_REPLICATION */

此時發現已可以在本地節點目標端建立檢視,表明許可權的授予也是同步複製的
create or replace view v2 as select * from employees1;

主伺服器源端刪除檢視
drop view v1;

檢查本地節點目標端檢視已同步刪除。

主伺服器源端收回許可權
conn / as sysdba
revoke create view from hr;

本地節點目標端試圖再次建立檢視,報許可權不足
create or replace view v3 as select * from employees1;

本地節點目標端清理單獨建立的檢視
drop view v2;

這也表明,在符合邏輯的情況下,對目標端的直接操作不會破壞OGG的複製機制。

8、連線斷開的測試

1)測試主伺服器斷開的情況

關閉主伺服器目標端機器,之後可以看到本地節點源端傳播程式已經異常終止。

本地節點1源端向表中插入資料
insert into scott.emp1 values('1001', 'zhang', 'clerk', '7902', sysdate, 1000, '', '20');
commit;

本地節點2源端向表中插入資料
insert into scott.emp1 values('1002', 'wang', 'clerk', '7902', sysdate, 1000, '', '20');
commit;

兩個本地節點源端都做三次日誌切換,將資料全部歸檔掉
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

開啟主伺服器目標端機器,之後檢查各程式恢復正常,目標端資料已同步。

兩個本地節點源端刪除插入的資料,驗證主伺服器目標端資料被同步刪除。

2)測試本地節點斷開的情況

關閉一個本地節點目標端機器,之後可以看到主伺服器源端對應的傳播程式已經異常終止。

主伺服器端建立表
create table hr.t1 as select * from employees;

修改主伺服器源端的兩個提取程式引數,新增對錶t1的提取
edit param ext1

新增
table hr.t1;

edit param ext2

新增
table hr.t1;
 
在Windows服務程式services.msc中重啟兩個提取程式GGSEXT1和GGSEXT2的服務。

主伺服器源端插入資料
insert into t1 values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into t1 values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;

做三次日誌切換,將資料全部歸檔掉
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

開啟關閉的本地節點,之後檢查各程式恢復正常,目標端資料已同步。

主伺服器源端刪除測試表t1,檢查本地節點目標端已同步刪除。

修改主伺服器源端的兩個提取程式引數,取消對錶t1的提取。

在Windows服務程式services.msc中重啟兩個提取程式GGSEXT1和GGSEXT2的服務。

七、引數說明

管理程式引數:
定義動態埠,可以指定最大256個可用埠的動態列表,當指定的埠不可用時,管理程式會從列表中選擇一個可用的埠
dynamicportlist 7840-7939
自動啟動所有程式
autostart er *
每5分鐘嘗試重新啟動所有程式,共嘗試3次,以後每60分鐘清零,再按照每5分鐘嘗試一次共試3次
autorestart er *, retries 3, waitminutes 5, resetminutes 60
定期清理trail檔案,超過3天的trail自動刪除,但要滿足檢查點要求,不能刪除未處理的佇列
purgeoldextracts c:\ogg\dirdat\*, usecheckpoints, minkeepdays 3
定義資料延遲的預警機制,mgr程式每隔1小時檢查extract的延遲情況,如果延遲超過了30分鐘,就把延遲作為資訊記錄到錯誤日誌中,如果延遲超過了45分鐘,則把它作為警告寫到錯誤日誌中
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45

提取/傳輸程式引數:
定義需要排除的表,如果在table引數中使用了萬用字元,可以使用該引數指定排除掉的表
tableexclude scott.e*;
是否複製update操作,預設複製
getupdates|ignoreupdates
是否複製delete操作,預設複製
getdeletes|ignoredeletes
是否複製insert操作,預設複製
getinserts|ignoreinserts
是否複製truncate操作,預設複製
gettruncates|ignoretrundates
在extract程式執行時首先執行一個SQL語句
qlexec

複製程式引數:
定義需要排除的表,如果在table引數中使用了萬用字元,可以使用該引數指定排除掉的表
tableexclude scott.e*;
用於使用在map中使用*匹配時排除掉指定的表
mapexclude
在replicat程式執行時首先執行一個SQL語句
qlexec

八、常見運維處理

1、在c:\ogg\dirrpt裡記錄了各個程式的執行報告(.rpt)和廢棄檔案(.dsc)資訊,程式啟動失敗時可以檢視,也可以透過OGG控制檯命令檢視報告
view report <程式名>

程式的資訊也可以透過info、status、stats等命令來檢視
info mgr
info ext1 detail
status ext1
stats ext1

也可以檢視OGG安裝目錄下的ggserr.log,獲取OGG日誌資訊。

2、程式的停止
stop <程式名>

如遇到源庫不能把資料傳送到備庫,不能停止傳送程式的情況,可強行停止程式
send extract <傳輸程式名>, forcestop

3、程式的刪除
刪除程式需要登入到資料庫
dblogin userid ogg password oggmes01
delete <程式名>

4、在確定重新從某個時間點開始提取和複製時需要修改程式的複製點
修改提取程式的提取開始時間
alter <程式名>, tranlog, begin 2018-03-09 10:00:00
如果是從現在開始提取
alter <程式名>, tranlog, begin now
可以根據scn號重新啟動複製程式
如查詢當前scn號
select dbms_flashback.get_system_change_number from dual;
重啟複製程式
start replicat rep1, aftercsn <scn>

5、因源端和目標端存在某些不一致,如源端更新或刪除操作的表在目標端不存在導致的目標端複製程式終止,可考慮重新設定複製起始點
目標端:
停止複製程式
stop <程式名>
重設複製起始點
alter <程式名> begin now
重啟複製程式
start <程式名>

6、必要時可刪除程式並重建。


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

相關文章