OGG雙向條件複製的部署與測試
一、部署環境說明
設計需求:
本地有兩個節點,節點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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 測試平臺系列(84) 支援複製其他前置條件
- JUnit5的條件測試、巢狀測試、重複測試巢狀
- PostgreSQL雙向複製教程SQL
- OGG 12c mysql複製到oracle部署方案MySqlOracle
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- OGG_mysql 12c複製到OGG_oracle 11g部署方案MySqlOracle
- ogg 併發複製程式自阻塞
- OGG同步複製時與相容觸發器解決方法觸發器
- MySQL製作具有千萬條測試資料的測試庫MySql
- OGG classic模式maxtransops引數提升複製效率模式
- [20190502]查詢條件不等於測試.txt
- 不可複製的PDF轉成雙層可複製PDF
- 雙向迴圈神經網路+條件隨機場進行分詞神經網路條件隨機場分詞
- MySQL 8 複製(八)——組複製安裝部署MySql
- JavaScript中的淺複製與深複製JavaScript
- Redis 主從複製與哨兵優化部署解析Redis優化
- 淺複製與深複製
- MySQL MHA部署與測試-下篇MySql
- Hyperledger Fabric部署與測試(Ubuntu)Ubuntu
- 架構系列---餓了麼MySQL異地多活的資料雙向複製架構MySql
- ogg複製程式報ORA-01438錯誤處理
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- 寫一個“特殊”的查詢構造器 – (四、條件查詢:複雜條件)
- java檔案複製方式在100MB檔案條件下速度的比較Java
- 成功部署SD-WAN的六個必要條件
- OGG複製程式延遲高,優化方法一(使用索引)優化索引
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- 測試平臺系列(83) 前置條件支援Redis語句Redis
- OGG 18.1 for mysql遠端捕獲測試MySql
- MySQL 複製 - 效能與擴充套件性的基石 2:部署及其配置MySql套件
- MySQL 8 複製(四)——GTID與複製MySql
- Windows Mysql主從複製部署WindowsMySql
- 基於MySQL雙主複製架構下部署LVS+KeepAlived負載均衡MySql架構負載
- 測試平臺系列(95) 前置條件支援簡單的python指令碼Python指令碼
- SharePlex qview工具 vs OGG logdump工具探究兩個複製工具事務開始 or 事務提交複製?View
- BFD雙向轉發檢測
- OGG複製同步,提示欄位長度不夠ORA-01704
- Oracle 19C OGG基礎運維-06增加複製表Oracle運維