2022年9月5日 星期一

7. MySQL to Oracle 同步設定

MySQL to Oracle 屬於異質性平台的同步設定,資料的初始化必須使用 OGG 原生提供的方式來進行。


來源端 (Source) 版本 : MySQL 5.5.34 + OGG 12.2.0.1.1

目標端 (Target) 版本 : Oracle 11.2.0.4 + OGG 12.2.0.1.1

同步 Schema : HR

作業系統平台均為 Linux 。


  • 前置準備項目

OGG for MySQL 軟體的安裝只需要將其解壓縮即可 :

$ unzip ggs_Linux_x64_MySQL_64bit.tar

$ ./ggsci

GGSCI (nccdb2-p) 1> create subdirs


OGG for Oracle 的安裝可參考章節 2 的說明。


Source 資料庫 (MySQL) 必須符合兩個要求才能進行 Extract , binlog_format 需為 ROW 且 Table 需使用 InnoDB 引擎創建 :

mysql> show variables like 'binlog_format';

+--------------------+-------------+

| Variable_name | Value |

+--------------------+-------------+

| binlog_format | ROW   |

+--------------------+-------------+

1 row in set (0.00 sec)


mysql> SELECT table_schema, table_name, engine FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='hr';


Target 資料庫 (Oracle) 建立 OGG 使用者並授予相關權限 :

SQL> create tablespace ogg datafile '/u01/oradata/ogg.dbf' size 500M;

SQL> create user ogg identified by ogg default tablespace ogg;

SQL> grant create any table to ogg;

SQL> grant create any view to ogg;

SQL> grant create any procedure to ogg;

SQL> grant create any sequence to ogg;

SQL> grant create any index to ogg;

SQL> grant create any trigger to ogg;

SQL> grant create any view to ogg;

SQL> exec dbms_goldengate_auth.grant_admin_privilege('OGG'); (11g 執行)


設定參數 enable_goldengate_replication 為 true :

SQL> alter system set enable_goldengate_replication=true;


  • Source (MySQL) 與 Target (Oracle) 的 MGR 設定

Target (Oracle) 設定 GLOBALS 參數如下 :

$ ./ggsci

GGSCI> edit param ./GLOBALS


GGSCHEMA OGG

CHECKPOINTTABLE OGG.GGSCHKPT


添加 Check Point Table :

$ ./ggsci

GGSCI> dblogin userid ogg, password ogg

GGSCI> add checkpointtable ogg.ggschkpt


Source (MySQL) 與 Target (Oracle) 設定 MGR 參數如下 :

$ ./ggsci

GGSCI> edit param mgr


PORT 7809

AUTORESTART ER *, RETRIES 50, WAITMINUTES 4

PURGEOLDEXTRACTS ./dirdat/*, usecheckpoints, minkeepfiles 10

LAGREPORTHOURS 1

LAGINFOMINUTES 30

LAGCRITICALMINUTES 45


啟動 MGR 完成設定 :

$ ./ggsci

GGSCI> start mgr


  • Source (MySQL) 的 OGG 設定 :

由於 Source 與 Target 資料庫為不同平台,所以於 Source 必須建立 Define File ,並且將此檔複製到 Target 端,用意在於讓 Target OGG 同步時可以清楚的知道 Source 端的表格定義。


編輯 Define File 的參數 :

$ ./ggsci

GGSCI> edit param mgr


defsfile ./dirdef/defgen.def, purge

sourcedb hrdb@localhost:3306, userid root,password root1234

table hr.*;


於 OGG 目錄下執行 defgen 建立 Define File :

$ ./defgen paramfile ./dirprm/defgen.prm


執行完畢後將 ./dirdef/defgen.def 檔案複製到 Target 端 OGG 的 ./dirdef 目錄下。


接下來建立 Extract 與 Pump ,首先編輯 Extract 參數 E_HR :

$ ./ggsci

GGSCI> edit param E_HR


EXTRACT E_HR

SETENV (NLS_LANG="AMERICAN_AMERICA.UTF8")

SETENV (MYSQL_HOME="/apps/mysql")

TRANLOGOPTIONS ALTLOGDEST /apps/mysql/data/mysql-bin-9757.index

SOURCEDB hrdb@localhost:3306,userid root,password root1234

EXTTRAIL ./dirdat/E1

DISCARDFILE ./dirrpt/E_HR.dsc, PURGE, MEGABYTES 100

GETUPDATEBEFORES

NOCOMPRESSDELETES

NOCOMPRESSUPDATES

GETTRUNCATES

FETCHOPTIONS FETCHPKUPDATECOLS

EOFDELAYCSECS 10

TABLE hr.*;


設定 Pump 參數 P_HR :

$ ./ggsci

GGSCI> edit param P_HR


EXTRACT P_HR

SETENV (NLS_LANG="AMERICAN_AMERICA.UTF8")

SETENV (MYSQL_HOME="/apps/mysql")

RMTHOST 192.168.49.20 , MGRPORT 7809

RMTTRAIL ./dirdat/R1

PASSTHRU

GETTRUNCATES

TABLE hr.*;


添加 Extract 與 Pump Group :

GGSCI> add extract e_hr, tranlog, begin now

GGSCI> add exttrail ./dirdat/E1, extract e_hr, megabytes 100

GGSCI> add extract p_hr, exttrailsource ./dirdat/E1

GGSCI> add rmttrail ./dirdat/R1, extract p_hr, megabytes 100


啟動 Extract 與 Pump :

GGSCI> start extract e_hr

GGSCI> start extract p_hr


  • 資料 Initial Load

由於 Source (MySQL) 與 Target (Oracle) 為不同平台,所以必須使用 OGG 原生的 Initial Load 方式。 Target (Oracle) 端所有表格定義與資料型態的匹配需要先規劃好,然後在執行 Initial Load 之前將其事先建立完成。


於 Source (MySQL) 端編輯 Initial Load Extract 參數 E_INIT :

$ ./ggsci

GGSCI> edit param E_INIT


SOURCEISTABLE

sourcedb hrdb@localhost:3306, userid root,password root1234

rmthost 192.168.49.20, mgrport 7809

rmtfile ./dirdat/ia, maxfiles 9999, megabytes 200

table hr.*;


直接執行 extract 進行 Initial Load Extract 抽取 Source 端的資料:

$ cd $GG_HOME

$ ./extract paramfile ./dirprm/E_INIT.prm


接下來於 Target (Oracle) 端編輯 Initial Load Replicate 參數 R_INIT :

$ ./ggsci

GGSCI> edit param R_INIT


SPECIALRUN

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="hrdb")

SETENV (ORACLE_HOME="/oracle/app/oracle/product/11.2.0/db")

userid ogg, password ogg

sourcedefs ./dirdef/defgen.def

EXTFILE ./dirdat/ia , MAXFILES 9999 , Megabytes 200 , append 

MAP HR.*, TARGET HR.*;


直接執行 replicat 來 Apply 這些初始化的資料:

$ cd $GG_HOME

$ ./replicat paramfile ./dirprm/R_INIT.prm


  • Target (Oracle) 的 OGG 設定 :

在資料初始化結束之後,接下來就可以設定 Replicate 同步,編輯 Replicate 參數 R_HR :

$ ./ggsci

GGSCI> edit param R_HR


REPLICAT R_HR

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="hrdb")

SETENV (ORACLE_HOME="/oracle/app/oracle/product/11.2.0/db")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS

APPLYNOOPUPDATES

HANDLECOLLISIONS

END RUNTIME

SOURCEDEFS ./dirdef/defgen.def

DISCARDFILE ./dirrpt/R_HR.dsc, MEGABYTES 10, PURGE

GETTRUNCATES

MAP HR.*, TARGET HR.*;


添加 Replicate Group :

$ ./ggsci

GGSCI> add replicat r_hr, exttrail ./dirdat/R1


啟動 Replicate :

$ ./ggsci

GGSCI> start replicat r_hr


第一次啟動 Replicate 時,參數中必須有 HANDLECOLLISIONS 與 END RUNTIME 參數,待 Replicate 解決 Initial Load 過程中的衝突後會自動停止,此時再將參數 HANDLECOLLISIONS 與 END RUNTIME 移除 :

$ ./ggsci

GGSCI> edit param R_HR


REPLICAT R_HR

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="hrdb")

SETENV (ORACLE_HOME="/oracle/app/oracle/product/11.2.0/db")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS

APPLYNOOPUPDATES

SOURCEDEFS ./dirdef/defgen.def

DISCARDFILE ./dirrpt/R_HR.dsc, MEGABYTES 10, PURGE

GETTRUNCATES

MAP HR.*, TARGET HR.*;


重新啟動 Replicate 開始差異資料的同步 :

$ ./ggsci

GGSCI> start replicat r_hr


完成設定後,接下來就只需要使用 info all 來觀察同步狀態即可。



沒有留言:

張貼留言