一、Oracle GoldenGate介紹
GoldenGate軟件是一種基於日志的結構化數據復制軟件。GoldenGate 能夠實現大量交易數據的實時捕捉、變換和投遞,實現源數據庫與目標數據庫的數據同步,保持亞秒級的數據延遲。
1、應用場景
1)高可用容災
2)數據庫遷移、升級(支持跨版本、異構數據庫、零宕機時間、亞秒級恢復)
3)實時數據集成(支持異構數據庫、多源數據庫)
2、常用拓撲
(下圖來自網絡)
3、支持的平台和數據庫
我這邊幾年前做過oracle到mysql的同步,也作過mysql到mysql的同步(支持不是很好,而且有DDL和DML的限制、字段類型限制等)
(下圖來自網絡)
4、OGG同步原理
源端通過抽取進程提取redo log或archive log日志內容,通過pump進程(TCP/IP協議)發送到目標端,最后目標端的rep進程接收日志、解析並應用到目標端,進而完成數據同步。
5、OGG相關進程








6、OGG相關目錄
dirbdb
dirchk:檢查點文件,記錄了該進程的檢查點信息
dircrd
dirdat:trail日志文件,存放收取接手的日志文件
dirdef:用來存放通過DEFGEN工具生成的源或目標端數據定義文件
dirdmp
dirout
dirpcs:用來存放進程狀態文件
dirprm:用來存放參數文件,該進程所配置的參數(edit param 進程組名 就是配置該文件)
dirrpt:用來存放進程報告(report)文件,可以查看該進程運行時的報錯信息等(view report 進程組名 就是看該文件)
dirsql:用來存放SQL腳本文件
dirtmp:當事物所需要的內存超過已分配內存時,缺省存在此目錄
dirwlt
dirwww
二、Oracle GoldenGate安裝
1、安裝環境
源端 |
目標端 |
|
IP地址 |
10.20.11.176 |
10.20.32.23 |
操作系統 |
RHEL6.6_X64 |
RHEL6.6_X64 |
數據庫 |
ORACLE_11.2.0.4 |
ORACLE_11.2.0.4 |
OGG |
Version 12.2.0.1.1 |
Version 12.2.0.1.1 |
2、OGG下載
http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html
http://download.oracle.com/otn/goldengate/12301/123012_fbo_ggs_Linux_x64_shiphome.zip
3、OGG安裝
1)源端:
tnsname配置
開啟歸檔等
archive log list alter database add supplemental log data; select supplemental_log_data_min from v$database; alter database force logging; (不是必須)
alter system set recyclebin=off;(更好的支持DDL)
show parameter recyclebin;
備注: 在oracle中可以通過rowid來定位某條記錄,但是目標端的數據庫和源端數據庫的數據庫可能完全不一樣,所以無法通過rowid來確定源端數據庫的邏輯變化,
這時附加日志supplemental log便登上了表演的舞台。數據庫在開啟附加日志功能后,對於源端的修改操作,oracle會同時追加能夠唯一標示記錄的列到redo log。
這樣目標端數據庫就可以知道源端發生了哪些具體的變化。
ogg安裝(略)
2)目標端:
tnsname配置
開啟歸檔等
ogg安裝
[root@node1 oracle]# unzip 123012_fbo_ggs_Linux_x64_shiphome.zip [root@node1 oracle]# mv fbo_ggs_Linux_x64_shiphome /home/oracle/ogg_install [root@node1 oracle]# chown -R oracle:oinstall /home/oracle/ogg_install [oracle@node1 response]$ vi /home/oracle/ogg_install/Disk1/response/oggcore.rsp INSTALL_OPTION=ORA11g SOFTWARE_LOCATION=/home/oracle/ogg_install START_MANAGER=false MANAGER_PORT= DATABASE_LOCATION= INVENTORY_LOCATION=/home/oracle/ogg_install/ogg_log UNIX_GROUP_NAME=oinstall [oracle@node1 Disk1]$ ./runInstaller -silent -responseFile /home/oracle/ogg_install/Disk1/response/oggcore.rsp
至此OGG軟件安裝成功,為方便管理OGG可以設置環境變量
[oracle@node1 ogg_install]$ vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/home/oracle/ogg_install
[oracle@node1 ogg_install]$ source ~/.bash_profile
[oracle@node1 ~]$ ggsci Oracle GoldenGate Command Interpreter for Oracle Version 12.3.0.1.2 OGGCORE_12.3.0.1.0_PLATFORMS_171208.0005_FBO Linux, x64, 64bit (optimized), Oracle 11g on Dec 8 2017 21:13:00 Operating system character set identified as UTF-8. Copyright (C) 1995, 2017, Oracle and/or its affiliates. All rights reserved. GGSCI (node1) 1> create subdirs Creating subdirectories under current directory /home/oracle Parameter file /home/oracle/ogg_install/dirprm: created. Report file /home/oracle/ogg_install/dirrpt: created. Checkpoint file /home/oracle/ogg_install/dirchk: created. Process status files /home/oracle/ogg_install/dirpcs: created. SQL script files /home/oracle/ogg_install/dirsql: created. Database definitions files /home/oracle/ogg_install/dirdef: created. Extract data files /home/oracle/ogg_install/dirdat: created. Temporary files /home/oracle/ogg_install/dirtmp: created. Credential store files /home/oracle/ogg_install/dircrd: created. Masterkey wallet files /home/oracle/ogg_install/dirwlt: created. Dump files /home/oracle/ogg_install/dirdmp: created.
至此真正的OGG安裝完畢,可以進行下面的數據同步部署了。
三、Oracle GoldenGate數據同步
1、源端配置
1)創建數據同步用戶、表空間
SQL> create tablespace ogg_tbs datafile '/U01/app/oracle/oradata/testdb/ogg_data.dbf' size 30M autoextend on next 10M; Tablespace created. SQL> create user ogguser identified by "ogguser"; User created. SQL> alter user ogguser default tablespace ogg_tbs; User altered. SQL> grant create session to ogguser; Grant succeeded. SQL> grant dba to ogguser; Grant succeeded.
2)更改相關數據庫配置
歸檔檢查和更改:
SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /oracle/archivelog 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
關閉回收站(10g需要,11g可以不關閉)
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
3)配置manager進程
GGSCI (dg) 1> edit params mgr
port 7809 DYNAMICPORTLIST 7810-7880 --AUTORESTART ER *,RETRIES 5,WAITMINUTES 7 PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 7 LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 45
MANAGER進程參數配置說明: PORT:指定服務監聽端口;這里以7839為例,默認端口為7809 DYNAMICPORTLIST:動態端口:可以制定最大256個可用端口的動態列表,當指定的端口不可用時,管理進程將會從列表中選擇一個可用的端口,源端和目標段的Collector、Replicat、GGSCI進程通信也會使用這些端口; COMMENT:注釋行,也可以用--來代替; AUTOSTART:指定在管理進程啟動時自動啟動哪些進程; AUTORESTART:自動重啟參數設置:本處設置表示每7分鍾嘗試重新啟動所有EXTRACT進程,共嘗試5次; PURGEOLDEXTRACTS:定期清理trail文件設置:本處設置表示對於超過7天的trail文件進行刪除。 LAGREPORT、LAGINFO、LAGCRITICAL: 定義數據延遲的預警機制:本處設置表示MGR進程每隔1小時檢查EXTRACT的延遲情況,如果超過了30分鍾就把延遲作為信息記錄到錯誤日志中,如果延遲超過了45分鍾,則把它作為警告寫到錯誤日志中。
4)配置extract進程
ogg 12版本可創建用戶別名:
[oracle@dg ogg]$ ggsci GGSCI (dg) 3> add credentialstore Credential store created in ./dircrd/. GGSCI (dg) 4> alter credentialstore add user gguser alias ogguser Password: Credential store in ./dircrd/ altered. --這里就可以使用別名登錄 (正常用戶名密碼 dblogin userid ggs,password ggs) GGSCI (dg) 3> dblogin useridalias ogguser Successfully logged into database.
GGSCI (dg) 5> add extract EXT01,tranlog,begin now EXTRACT added.
###可以通過命令add extract EXT01,tranlog,begin 2018-05-06 08:05:14,制定開始抽取的日志時間
GGSCI (customerdg) 6> edit params EXT01
##extract配置文件內容如下
EXTRACT ext01 SETENV (ORACLE_HOME="/U01/app/oracle/product/11.2.0.4") setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_SID="testdb") useridalias ogguser GETTRUNCATES REPORTCOUNT EVERY 1 MINUTES, RATE DISCARDFILE ./dirrpt/ext01.dsc,APPEND,MEGABYTES 1000 WARNLONGTRANS 2h,CHECKINTERVAL 10m EXTTRAIL ./dirdat/ex TRANLOGOPTIONS EXCLUDEUSER gguser TRANLOGOPTIONS MINEFROMACTIVEDG DBOPTIONS ALLOWUNUSEDCOLUMN DYNAMICRESOLUTION FETCHOPTIONS FETCHPKUPDATECOLS --table table CUSTOMER.t_t1; table CUSTOMER.t_t2; table CUSTOMER.t_t3;
添加該extract對應的trail文件,用來存儲抽取的數據。單個文件大小設置為100MB
GGSCI (dg) 1> add exttrail /home/oracle/ogg_install/dirdat/ex,extract ext01 MEGABYTES 100
EXTTRAIL added.
5)配置pump進程
為了避免primary extract受到網絡的影響,我們在源端和目標端之間增加一個data pump,這樣的話,primary extract負責將數據從源數據中抽取出來,存在本地的trail文件中,然后data pump進程負責將本地trail文件中的數據傳輸到目標端的trail文件里。這樣能提高更高的靈活性和可用性(當源和目標端之間的網絡出現故障時,primary extract會繼續抽取數據存到本地的trail中)
GGSCI (dg) 5> edit params pump01 EXTRACT pump01 RMTHOST 10.20.32.23, MGRPORT 7809, compress PASSTHRU RMTTRAIL /home/oracle/ogg_install/dirdat/rt DYNAMICRESOLUTION --table table CUSTOMER.t_t1; table CUSTOMER.t_t2; table CUSTOMER.t_t3; GGSCI (dg) 14> add extract pump01,exttrailsource ./dirdat/ex EXTRACT added. GGSCI (dg) 15> add rmttrail /home/oracle/ogg_install/dirdat/rt,extract pump01 RMTTRAIL added.
2、目標端配置
1)創建數據同步用戶、表空間
SQL> create tablespace ogg_tbs datafile '/U01/app/oracle/oradata/testdb/ogg_data.dbf' size 30M autoextend on next 10M; Tablespace created. SQL> create user ogguser identified by "ogguser"; User created. SQL> alter user ogguser default tablespace ogg_tbs; User altered. SQL> grant create session to ogguser; Grant succeeded. SQL> grant dba to ogguser; Grant succeeded.
2)歸檔開啟
3)配置manager進程
GGSCI (node1) 1> add credentialstore Credential store created. GGSCI (node1) 2> alter credentialstore add user ogguser alias ogguser Password: Credential store altered. GGSCI (node1) 3> dblogin useridalias ogguser Successfully logged into database.
GGSCI (node1 as ogguser@testdb) 4> edit params mgr
port 7809 DYNAMICPORTLIST 7810-7880 --AUTORESTART ER *,RETRIES 5,WAITMINUTES 7 PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 7 LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 45
GGSCI (node1) 1> start mgr Manager started. GGSCI (node1) 2> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING
4)配置replicate進程
REPLICAT rep01 SETENV (ORACLE_HOME="/U01/app/oracle/product/11.2.0.4") setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_SID="testdb") useridalias ogguser REPORT AT 01:59 REPORTCOUNT EVERY 30 MINUTES, RATE REPERROR DEFAULT, ABEND HANDLECOLLISIONS assumetargetdefs DISCARDFILE ./dirrpt/rep01.dsc, APPEND, MEGABYTES 1000 GETTRUNCATES ALLOWNOOPUPDATES --table map gguser.t_t1, target gguser.t_t1; map gguser.t_t2, target gguser.t_t2; map gguser.t_t3, target gguser.t_t3;
5)、添加checkpoint表
GGSCI (node1) 5> dblogin useridalias ogguser Successfully logged into database. GGSCI (node1 as ogguser@testdb) 6> add checkpointtable ogguser.checkpointtab Successfully created checkpoint table ogguser.checkpointtab.
GGSCI (node1 as ogguser@testdb) 7> add replicat rep01,exttrail /home/oracle/ogg_install/dirdat/rt,checkpointtable ogguser.checkpointtab REPLICAT added.
3、源端進程啟動
1)源端啟動mgr進程、extract進程、pump進程
GGSCI (dg) 20> start mgr Manager started. GGSCI (dg as gguser@testdb) 9> start ext01 Sending START request to MANAGER ... EXTRACT EXT01 starting GGSCI (dg as gguser@testdb) 12> start PUMP01 Sending START request to MANAGER ... EXTRACT PUMP01 starting GGSCI (dg as gguser@testdb) 14> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING EXT01 00:00:03 00:00:03 EXTRACT RUNNING PUMP01 00:00:00 00:00:08
4、數據庫初始化
1)源端導出數據
##創建導出文件目錄、查看到處點SCN
select * from dba_directories; create directory DATA_PUMP_DIR as '/U01/oracle/oggdump'; col CURRENT_SCN format 999999999999999999999999; set line 200; set pagesize 20000; select current_scn from v$database; select dbms_flashback.get_system_change_number current_scn from dual;
##導出表數據
##只導出數據
expdp \'/ as sysdba\' directory=DATA_PUMP_DIR file=20180506.dmp tables=ogguser.t_t1,ogguser.t_t2,ogguser.t3 grants=n statistics=none triggers=n compress=n content=data_only FLASHBACK_SCN=54995990597 log=expdp.log
##只導出表結構
expdp \'/ as sysdba\' directory=DATA_PUMP_DIR file=20180506.dmp tables=ogguser.t_t1,ogguser.t_t2,ogguser.t3 grants=n statistics=none triggers=n compress=n content=METADATA_ONLY FLASHBACK_SCN=54995990597 log=expdp.log
##導出表結構和數據
expdp \'/ as sysdba\' directory=DATA_PUMP_DIR file=20180506.dmp tables=ogguser.t_t1,ogguser.t_t2,ogguser.t3 grants=n statistics=none triggers=n compress=n FLASHBACK_SCN=54995990597 log=expdp.log
2)目標端數據導入
##若表結構事前沒有創建好,需要表結構和表數據一起導入,若表結構已創建,只需要導入表數據即可
##導入表數據 impdp \'/ as sysdba\' DIRECTORY=DATA_PUMP_DIR DUMPFILE=20180506.dmp REMAP_SCHEMA=source_user:target_user content=data_only LOGFILE=impdp.log ##導入表結構 impdp \'/ as sysdba\' DIRECTORY=DATA_PUMP_DIR DUMPFILE=20180506.dmp REMAP_SCHEMA=source_user:target_user content=METADATA_ONLY LOGFILE=impdp.log ##導入表結構和數據 impdp \'/ as sysdba\' DIRECTORY=DATA_PUMP_DIR DUMPFILE=20180506.dmp REMAP_SCHEMA=source_user:target_user LOGFILE=impdp.log
5、目標端進程啟動
目標端啟動mgr、replicate進程
GGSCI (node1 as ogguser@testdb) 9> start mgr Manager started. GGSCI (node1) 2> start rep01,aftercsn 54995990597 Sending START request to MANAGER ... REPLICAT REP01 starting GGSCI (node1) 4> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING REPLICAT RUNNING REP01 00:00:00 00:00:00
四、Oracle GoldenGate管理
1、進程啟動、關閉以及狀態查看
啟動:
GGSCI (node1) 1> start mgr Manager started.
##可以通過SCN啟動
start rep01,aftercsn 54995990597
##可以通過時間啟動
add extract EXT01,tranlog,begin 2018-05-06 08:05:14
關閉:
GGSCI (node1) 3> stop mgr Manager process is required by other GGS processes. Are you sure you want to stop it (y/n)?yes Sending STOP request to MANAGER ... Request processed. Manager stopped.
狀態查看:
GGSCI (node1) 1> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING REPLICAT STOPPED REP01 00:00:00 00:14:29 GGSCI (node1) 2> info rep01 REPLICAT REP01 Initialized 2018-05-04 16:29 Status STOPPED Checkpoint Lag 00:00:00 (updated 00:14:51 ago) Log Read Checkpoint File /home/oracle/ogg_install/dirdat/rt000000000 First Record RBA 0
2、進程添加、編輯、刪除、配置文件查看
進程文件添加:
##抽取進程 add extract ext5,tranlog,begin now add exttrail /usr/local/mysql/ogg/dirdat/ex,extract ext5 ##pump進程 add extract pump01,exttrailsource /usr/local/mysql/ogg/dirdat/ex add rmttrail /oracle/app/ogg/dirdat/pt,extract pump5 ##檢查點 add checkpointtable ogg.checkpointtab add replicat rep2,exttrail /oracle/app/ogg/dirdat/pt,checkpointtable ogg.checkpointtab ##別名
add credentialstore alter credentialstore add user ogguser alias ogguser
文件編輯:
##管理進程文件
edit params mgr
##抽取進程文件
edit params ext01
##傳輸進程文件
edit params pump01
##應用進程文件
edit params rep01
文件查看:
##管理進程文件 view params mgr ##抽取進程文件 view params ext01 ##傳輸進程文件 view params pump01 ##應用進程文件 view params rep01
文件刪除:
GGSCI (node1) 5> dblogin useridalias ogguser
Successfully logged into database.
GGSCI (node1 as ogguser@testdb) 8> delete checkpointtable ogguser.checkpointtab This checkpoint table may be required for other installations. Are you sure you want to delete this checkpoint table? yes Successfully deleted checkpoint table ogguser.checkpointtab. GGSCI (node1 as ogguser@testdb) 9> delete rep01 Deleted REPLICAT REP01.
3、SCN和時間互轉
##SCN轉為時間戳
select to_char(scn_to_timestamp(54995990597),'yyyy-mm-dd hh24:mi:ss') from dual;
##時間戳轉為為SCN
select timestamp_to_scn(to_timestamp('2018-05-06 08:05:14','yyyy-mm-dd hh24:mi:ss')) from dual;