从Oracle到MySQL的安装部署

 

部署环境说明

 

 

源端

主机IP

192.168.56.110

主机名

ggdb01

数据库主目录

/u02/app/oracle/product/11.2.0.4/dbhome_1

数据库版本

11.2.0.4

Goldengate主目录

/u02/app/goldengate

Goldengate版本

11.2.1.0.15

 

 

目标端

主机IP

192.168.56.131

主机名

mysqldb01

数据库主目录

/usr/local/mysql

数据库版本

5.7.26

Goldengate主目录

/u02/app/goldengate

Goldengate版本

11.2.1.0.1

 

准备操作系统用户

在源端和目标端主机上,安装部署GoldenGate软件的操作系统用户,必须对软件的安装目录具有读写权限,同时还需要对数据库的在线日志和归档日志拥有读权限。除此之外,该操作系统用户还需要足够的系统资源权限。

在本示例中,源端使用oracle操作系统用户,目标端使用mysql操作系统用户。

 

安装GoldenGate软件

安装GoldenGate软件的过程非常简单,只需要将软件包解压缩到软件目录,最后在GGSCI命令行接口中输入create subdirs命令即可,详细的安装命令如下所示。

$ cd /u02/app/goldengate

$ unzip p17650070_1121015_Linux-x86-64.zip

$ tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar

$ ./ggsci

GGSCI > create subdirs

至此,GoldenGate软件安装完成。

 

 

源端系统配置

略。。

 

目标端系统配置

创建GoldenGate管理数据库

在MySQL中,数据库就相当于Oracle数据库的schema。在本示例中,可以在目标端MySQL实例下创建ggate数据库,GoldenGate自身产生的所有数据对象都存放在该数据库中。

root@localhost [(none)]>create database ggate;

Query OK, 1 row affected (0.01 sec)

 

root@localhost [(none)]>

 

创建GoldenGate管理用户

root@localhost [(none)]>create user ggate@'localhost' identified by 'ggate_5678';

Query OK, 0 rows affected (0.01 sec)

 

root@localhost [(none)]>grant all on *.* to ggate@'localhost';

Query OK, 0 rows affected (0.01 sec)

 

root@localhost [(none)]>

 

配置GoldenGate软件

源端配置Manager进程

要使用GoldenGate,必须先配置Manager进程,指定Manager进程使用的TCP/IP端口号,还可以在Manager进程的参数文件中指定Trail文件维护和其他属性参数。

(1)、配置Manager进程,命令如下所示。

$ ./ggsci

 

GGSCI > info all

 

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     STOPPED

 

GGSCI > edit params mgr

(2)、在Manager进程的参数文件中添加以下内容。

PORT 7809

userid ggate, password ggate_5678

AUTOSTART ER *

AUTORESTART ER *, RETRIES 3

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 24, MINKEEPFILES 10

LAGREPORTMINUTES 15

LAGCRITICALMINUTES 30

该参数文件指定Manager进程的通信端口为7809,同时设置为该GoldenGate实例下的所有Extract和Replicat进程会随着Manager进程一起自动启动,除此之外,还允许自动删除历史的Trail文件。

(3)、启动Manager进程。

GGSCI > start mgr

Manager started.

 

GGSCI > info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                          

 

GGSCI >

进程的状态为RUNNING,表示Manager进程已经正常运行。

源端添加表级别附加日志

例如,对test用户下的所有表都添加附加日志,命令如下所示。

GGSCI > dblogin userid ggate, password ggate_5678

GGSCI > add trandata test.*

目标端配置checkpoint表

在目标端数据库上,建议配置checkpoint表,表名为ggate.checkpoint,它用来保存GoldenGate进程的检查点信息,具体步骤如下所示。

(1)、修改GoldenGate软件主目录下的GLOBALS文件,命令如下所示。

GGSCI > edit params ./GLOBALS

注意文件名必须为大写的GLOBALS。

(2)、在GLOBALS文件中添加如下内容。

checkpointtable ggate.checkpoint

(3)、调用add checkpointtable命令,创建checkpoint表,命令如下所示。

GGSCI > dblogin sourcedb test@localhost:3306, userid ggate, password ggate_5678

GGSCI > add checkpointtable ggate.checkpoint

至此,目标端在ggate数据库中会创建一个名为checkpoint的表。

目标端配置Manager进程

同样,在目标端系统上也必须先配置Manager进程,指定Manager进程使用的TCP/IP端口号,还可以在Manager进程的参数文件中指定Trail文件维护和其他属性参数。

(1)、配置Manager进程,命令如下所示。

$ ./ggsci

 

GGSCI > info all

 

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     STOPPED

 

GGSCI > edit params mgr

(2)、在Manager进程的参数文件中添加以下内容。

PORT 7809

sourcedb test@localhost:3306, userid ggate, password ggate_5678

AUTOSTART ER *

AUTORESTART ER *, RETRIES 3

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 24, MINKEEPFILES 10

LAGREPORTMINUTES 15

LAGCRITICALMINUTES 30

(3)、启动Manager进程。

GGSCI > start mgr

Manager started.

 

GGSCI > info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                          

 

GGSCI >

进程的状态为RUNNING,表示目标端GoldenGate的Manager进程已经正常运行。

源端添加Extract进程

在源端GGSCI工具命令行下,执行ADD EXTRACT命令添加Extract进程。

(1)、本示例中的源端数据库是一个单节点数据库,需要创建一个Extract进程,从现在立刻进行增量抽取,进程名为e_0a,则具体命令如下所示。

GGSCI > add extract e_0a,  tranlog,  begin now

EXTRACT added.

(2)、创建完Extract进程后,我们需要指定这个Extract进程抽取的增量数据存放到哪个Trail文件中,假设Trail文件存放到GoldenGate软件主目录的dirdat子目录下,Trail文件名的前缀为0a,每个Trail文件大小为200MB,则具体的命令如下所示。

GGSCI > add exttrail ./dirdat/0a, extract e_0a, megabytes 200

EXTTRAIL added.

GGSCI (prodzhdb6) 7>

(3)、接着,我们需要编辑这个Extract进程的参数文件,命令如下所示。

GGSCI > edit params e_0a

(4)、指定这个Extract进程负责抽取哪些数据对象上发生的增量数据。假设我们要抽取test用户下所有表发生的增量数据,则参数文件内容如下所示。

EXTRACT e_0a

 

SETENV (ORACLE_HOME = "/u02/app/oracle/product/11.2.0.4/dbhome_1")

SETENV (ORACLE_SID="oggdb")

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

 

USERID ggate, password ggate_5678

 

EXTTRAIL ./dirdat/0a

 

--TRANLOGOPTIONS DBLOGREADER

 

--DDL INCLUDE ALL

--DDLOPTIONS ADDTRANDATA

 

DISCARDFILE ./dirrpt/e_0a.dsc, append, megabytes 1000

DISCARDROLLOVER AT 02:00

 

REPORTROLLOVER AT 02:00

REPORTCOUNT EVERY 1 HOURS, RATE

 

FETCHOPTIONS, USESNAPSHOT, NOUSELATESTVERSION, MISSINGROW REPORT

STATOPTIONS REPORTFETCH

 

WARNLONGTRANS 2H, CHECKINTERVAL 3m

 

TABLE test.*;

注意,GoldenGate进程的参数文件中EXTTRAIL参数使用的路径必须与add exttrail命令中指定的Trail文件路径完全一致。

(5)、启动该Extract进程,具体命令如下所示。

start extract e_0a

此时,源端test用户下的表对象如果发生DML操作,则所有的增量数据都会被抽取记录到本地的Trail文件中。

(6)、查看Extract进程e_0a的增量数据抽取情况,命令如下所示。

GGSCI > stats e_0a

 

Sending STATS request to EXTRACT E_0A ...

 

Start of Statistics at 2020-07-26 10:41:53.

 

Output to ./dirdat/0a:

 

Extracting from TEST.MM to TEST.MM:

 

*** Total statistics since 2020-07-26 10:41:43 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Daily statistics since 2020-07-26 10:41:43 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Hourly statistics since 2020-07-26 10:41:43 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Latest statistics since 2020-07-26 10:41:43 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

End of Statistics.

可以看出TEST用户下的MM这张表已经有数据变化,新删除了9条记录已经被Extract进程捕获。

源端添加Datapump进程

在此配置中,Extract进程负责读取源端数据库的日志文件,将增量数据写入到本地的Trail文件,而本地的Datapump进程负责读取本地的Trail文件,并将数据传输到目标端主机上的远程Trail文件,最终目标端主机上的Trail文件由目标端的Replicat进程读取。

(1)、在源端GGSCI工具命令行下,执行ADD EXTRACT命令添加Datapump进程,例如,需要创建一个名为p_0a的Datapump进程,读取的数据源为本地前缀为0a开始的Trail文件,具体命令如下所示。

GGSCI > add extract p_0a, exttrailsource ./dirdat/0a

(2)、创建完Datapump进程后,我们需要指定这个Datapump进程将数据传输到远程主机的Trail文件中,假设存放到GoldenGate软件主目录的dirdat目录下,Trail文件名的前缀为aa,每个远程Trail文件大小为200MB,则具体的命令如下所示。

GGSCI > add rmttrail ./dirdat/aa, extract p_0a, megabytes 200

(3)、接着,我们需要编辑这个Datapump进程,命令如下所示。

GGSCI > edit params p_0a

(4)、修改Datapump进程的参数文件,指定这个Datapump进程负责将哪些数据对象上发生的增量数据传输到哪个主机上。假设我们要将test用户下的所有表发生的增量数据传输到目标端主机的Trail文件里,具体参数文件内容如下所示。

EXTRACT p_0a

 

SETENV (ORACLE_HOME="/u02/app/oracle/product/11.2.0.4/dbhome_1")

SETENV (ORACLE_SID="oggdb")

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

 

Passthru

 

RMTHOST 192.168.56.131, MGRPORT 7809

 

RMTTRAIL ./dirdat/aa

 

DISCARDFILE ./dirrpt/p_0a.dsc, append, megabytes 1000

DISCARDROLLOVER AT 02:00

 

REPORTROLLOVER AT 02:00

REPORTCOUNT EVERY 4 HOURS, RATE

 

TABLE test.*;

(5)、启动该Datapump进程,具体命令如下所示。

GGSCI > start extract p_0a

此时,源端test用户下的所有表如果发生DML操作,则所有的增量数据都会被传输到远程主机上的Trail文件中。

(6)、查看Datapump进程p_0a的增量数据抽取情况,命令如下所示。

GGSCI > stats p_0a

Sending STATS request to EXTRACT P_0A ...

 

Start of Statistics at 2020-07-26 10:50:16.

 

Output to ./dirdat/aa:

 

Extracting from TEST.MM to TEST.MM:

 

*** Total statistics since 2020-07-26 10:50:01 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Daily statistics since 2020-07-26 10:50:01 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Hourly statistics since 2020-07-26 10:50:01 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

*** Latest statistics since 2020-07-26 10:50:01 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

 

End of Statistics.

可以看出Datapump进程已经开始工作,TEST用户下的MM这张表已经有数据传输到目标端主机,此时在目标端主机上已经存在前缀为aa的Trail文件。

 

源端生成表定义文件

在异构数据库环境中,需要使用defgen工具生成sourcedefs或者targetdefs表结构定义文件。

(1)、在GGSCI命令行中,执行以下命令创建一个DEFGEN参数文件。

EDIT PARAMS DEFGEN

(2)、在DEFGEN参数文件中指定需要生成数据定义文件的表对象,例如,需要生成test.mm这张表的定义文件,具体参数内容如下所示。

DEFSFILE /u02/app/goldengate/dirdef/mm.def

USERID ggate, PASSWORD ggate_5678

 

TABLE test.mm;

(3)、保存DEFGEN参数文件并退出。

(4)、运行DEFGEN工具来生成数据定义文件。进入GoldenGate软件的主目录运行DEFGEN工具,具体命令如下所示。

$ ./defgen paramfile dirprm/defgen.prm

如果源端和目标端的GoldenGate版本不同,并且表结构也不同时,需要在defgen命令行中加上NOEXTATTR参数。

(5)、使用ASCII模式,通过FTP将数据定义文件从GoldenGate软件目录的dirdef子目录发送到另一个系统,将其保存到该系统上GoldenGate软件的dirdef子目录。

 

目标端添加Replicat进程

在目标端GGSCI工具命令行下,执行ADD REPLICAT命令添加Replicat进程。

(1)、本示例中,在目标端系统上创建一个名为r_0a的Replicat进程,该进程读取以aa为前缀的Trail文件,则具体命令如下所示。

GGSCI > add replicat r_0a, exttrail ./dirdat/aa, checkpointtable ggate.checkpoint

(2)、接下来,我们需要编辑Replicat进程,命令如下所示。

GGSCI > edit params r_0a

(3)、编辑Replicat进程的参数文件。假设将源端test用户下的表发生的增量数据复制到目标端test用户下相同的表上,具体的参数如下所示。

REPLICAT r_0a

 

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

HANDLECOLLISIONS

targetdb test@localhost, USERID ggate, password ggate_5678

 

sourcedefs /u02/app/goldengate/dirdef/mm.def

 

DISCARDFILE ./dirrpt/r_0a.dsc, append, megabytes 1000

DISCARDROLLOVER AT 02:00

 

REPORTROLLOVER AT 02:00

REPORTCOUNT EVERY 4 HOURS, RATE

 

MAP test.mm, TARGET test.mm;

目前我们还不能直接启动Replicat进程,因为此时目标端的数据库上还不存在test用户,还没有初始数据,而Replicat进程读取来自Trail文件内的增量数据。

 

 

目标端数据初始化

创建业务数据库

在MySQL中,数据库就相当于Oracle数据库的schema。在本示例中,需要同步源端test用户下的mm表。所在可以在目标端MySQL实例下创建test数据库。

root@localhost [sys]>create database test CHARACTER SET utf8mb4;

Query OK, 1 row affected (0.01 sec)

 

root@localhost [sys]>

如果字符集不对,导入的中文均未乱码。

创建表结构

要创建innodb引擎的表,注意ORACLE和MYSQL的对应数据类型。ORACLE中的number对应MYSQL的int,ORACLE中的varchar2对应MYSQL的varchar,建表中需要进行数据类型的转换。

Test.mm表在Oracle源端的表结构如下所示:

create table test.mm(id number, name varchar2(100), primary key(id));

所以,在MySQL目标端的表结构必须修改为:

create table test.mm(id int, name varchar(100), primary key(id));

 

数据初始化

(1)、在源端系统上,将test.mm这张表中的数据导出成文本文件,字段之间用逗号分隔。

create or replace directory utlpath as '/u02';

 

declare

    outfile utl_file.file_type;

begin

    outfile := utl_file.fopen('UTLPATH','mm.txt','W');

    for rec in (select * from test.mm)

    loop

       utl_file.put_line(outfile, rec.id||','||rec.name);

    end loop;

    utl_file.fclose(outfile);

end;

/

此时,在/u02目录下会生成一个名为mm.txt的文本文件,文件内容为test.mm这张表中的数据。

 

(2)、将源端系统上生成的文本文件复制到目标端数据库主机上。例如/tmp目录下。

 

(3)、在目标端MySQL服务器中将文本文件中的数据导入到test.mm表中。

root@localhost [(none)]>load data infile '/tmp/mm.txt' into table test.mm FIELDS TERMINATED BY ',';

Query OK, 9991 rows affected (0.17 sec)

Records: 9991  Deleted: 0  Skipped: 0  Warnings: 0

 

root@localhost [(none)]>commit;

Query OK, 0 rows affected (0.02 sec)

 

root@localhost [(none)]>select count(*) from test.mm;

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

| count(*) |

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

|     9991 |

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

1 row in set (0.01 sec)

 

root@localhost [(none)]>

 

目标端启动Replicat进程

启动目标端的复制进程,命令如下所示:

GGSCI > start r_0a

 

复制进程启动后,检查复制进程当前的状态,命令如下所示。

GGSCI (mysqldb01.oracle.com) 21> stats r_0a

 

Sending STATS request to REPLICAT R_0A ...

 

Start of Statistics at 2020-07-26 11:46:52.

 

Replicating from TEST.MM to test.mm:

 

*** Total statistics since 2020-07-26 11:46:38 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

        Total delete collisions                            9.00

 

*** Daily statistics since 2020-07-26 11:46:38 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

        Total delete collisions                            9.00

 

*** Hourly statistics since 2020-07-26 11:46:38 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

        Total delete collisions                            9.00

 

*** Latest statistics since 2020-07-26 11:46:38 ***

        Total inserts                                      0.00

        Total updates                                      0.00

        Total deletes                                      9.00

        Total discards                                     0.00

        Total operations                                   9.00

        Total delete collisions                            9.00

 

End of Statistics.

 

GGSCI (mysqldb01.oracle.com) 22>

可以看出,复制进程已经工作,当目标端的复制进程追平源端时,关闭复制进程中的HANDLECOLLISIONS参数。

 

上一篇:JavaScript基础1--简介及简单应用


下一篇:ADD NEW TABLE TO AN EXISTING GOLDENGATE CONFIGURATION