部署环境说明
源端 |
主机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参数。