第48期 OGG 实现 MySQL 数据库数据实时迁移

来源:这里教程网 时间:2026-03-03 22:49:39 作者:

一、OGG使用背景介绍 在金融、电商等关键业务领域,数据的准确性与实时性是保障业务稳定运行和决策精准的核心要素。 哪怕是瞬间的数据延迟或错误,都可能在这些领域引发严重的连锁反应,造成巨大的经济损失和信誉损害。 因此,确保数据库之间的高效同步成为了技术架构中的关键环节。 Oracle GoldenGate(OGG)工具,作为数据同步与集成领域的佼佼者,能够为企业提供强大的数据容灾和迁移解决方案。 借助OGG,不仅可以实现数据的实时复制,保障业务连续性,还能在系统升级、架构调整时,平稳地完成数据迁移工作, 最大程度降低对业务的影响。二、OGG原理它是基于日志捕获技术实现数据实时同步,属于逻辑同步。OGG同步过程大致为源端OGG负责抽取源端数据库变化数据,并将变化数据投递至目标端OGG,目标端OGG负责解析并持久化到目标数据库,OGG进程不多,只有5个进程。如下: 1、各进程详细说明:1)Manager进程不管是源端还是目标端必须并且只能有一个Manager进程,可以启动、关闭、监控其他进程的健康状态,报告错误事件、分配数据存储空间,发布阀值报告等。2)Extract 进程运行在数据库源端,负责从源端数据表或日志中捕获数据,然后捕获到的将写到本地trail文件。 想要复制的对象数据发生改变时,Extract进程 就会进行捕捉,当事务提交时,所有和该事务相关的日志记录被以事务为单元顺序的记录到trai文件中。Extract进程利用其内在的checkpoint机制,周期性的记录其读写的位置,实现断点同步。3)Pump进程(可选)运行在数据库源端 ,其作用是将源端产生的本地trail文件,把trai以数据块的形式通过TCP/IP 协议发送到目标。但是如果如果不使用trail文件,那么extract进程在抽取完数据以后,直接投递到目标端,生成远程trail文件,那么这时候,Pump进程就可以不用配置。4)Replicat进程运行在数据库目标端,负责读取源端传送到目标端的trail文件中的内容,并将其解析为DML或 DDL语句,然后应用到目标数据库中。5)Server Collector进程运行于目标端,作用就是把Extract/Pump进程投递过来的数据块重新组装成Trail文件。运行期间无需任何配置。是一个完全自动的进程。 三、环境准备 (一)准备环境

节点 操作系统版本 数据库版本 OGG版本 IP地址
源端数据库 Rocky-9 mysql 8.0 12.2.0.2.0 192.168.83.100
目的端数据库 Rocky-9 mysql 8.0 12.2.0.2.0 192.168.83.101

(二)下载ogg安装包

官网地址: https://edelivery.oracle.com/

登录后输入:Oracle GoldenGate for Non Oracle Database,找到相应的版本的安装包即可。

(三)部署OGG

1、源端

[root@mysql100 ~]# mkdir -p /oggmysql
解压ogg的包
[root@mysql100 ~]# tar -xvf ggs_Linux_x64_MySQL_64bit.tar

初始化ogg

[root@mysql100 ~]#  ./ggsci
GGSCI (mysql100) 1> edit params ./GLOBALS
MGRSERVNAME GGMGR
GGSCI (mysql100) 2> create subdirs

源端MySQL配置 创建数据库用户ogg,该用户用来同步数据:

mysql> create user ogg@'%' identified by '123456';
mysql> grant all privileges on *.* to ogg@'%';
mysql>ALTER USER 'ogg'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql>FLUSH PRIVILEGES;

创建测试数据

-- 创建 test 数据库
CREATE DATABASE IF NOT EXISTS test;
USE test;
-- 创建表1:示例表,包含整数、字符串、日期等字段
CREATE TABLE test1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    create_date DATE
);
-- 插入数据到test1张表
 INSERT INTO test1(name, age, create_date)
        VALUES ('name1', 24, CURDATE());
 INSERT INTO test1(name, age, create_date)
        VALUES ('name2', 25, CURDATE());
 INSERT INTO test1(name, age, create_date)
        VALUES ('name3', 26, CURDATE());

源端配置管理进程mgr

GGSCI (mysql100) 4> edit param mgr
#新增以下内容:
#指定端口号
port 7809 
#绑定可用端口列表 
dynamicportlist 7840-7939  
#定时清理trail文件
purgeoldextracts /oggmysql/dirdat/*,usecheckpoints, minkeepdays 1

启动管理进程mgr

GGSCI (mysql100) 5> start mgr
GGSCI (mysql100) 6> info all

配置抽取进程Extract

GGSCI (mysql100) 6> edit param exta
#定义抽取进程名称
extract exta
#指定OGG连接数据库的地址、账户与密码
sourcedb test@192.168.83.100:3306 userid ogg password 123456
#指定写入到本地的哪个队列
exttrail /oggmysql/dirdat/ea
#定义discardfile文件位置,如果处理中有记录出错会写入到此文件中
discardfile  /oggmysql/dirrpt/exta.dsc,append
#指定在解析数据库日志时所需要的特殊参数
TranLogOptions AltLogDest /data/mysql/mysql-bin.index
#定义需复制的表,后面需以;结尾
table test.*;
GGSCI (mysql100) 8> add extract exta,tranlog,begin now
GGSCI (mysql100) 9> add exttrail /oggmysql/dirdat/ea,extract exta

配置投递进程pmysql

GGSCI (mysql100) 10> edit param pmysql
#定义投递进程名
extract pmysql
passthru
#源端数据库地址、用户名
sourcedb test@192.168.83.100:3306 userid ogg password 123456
#目标端地址
rmthost  192.168.83.101,mgrport 7809,compress
# 指定写入文件
rmttrail  /oggmysql/dirdat/rl
dynamicresolution
numfiles 3000
#投递的表
table test.*;
GGSCI (mysql100) 11> add extract pmysql,exttrailsource /oggmysql/dirdat/rl
GGSCI (mysql100) 12> add rmttrail /oggmysql/dirdat/rl,extract pmysql

创建表定义文件,传送到目标端

GGSCI (mysql100) 13> edit param defgen
defsfile ./dirdef/test.def
sourcedb test@192.168.83.100:3306 userid ogg, password 123456
table test.*;

配置数据结构表定义文件

[root@mysql100 mysqlogg]# ./defgen paramfile ./dirprm/defgen.prm

生成表定义文件,生成成功后复制一份到目标端OGG的dirdef目录下.

[root@mysql100 mysqlogg]# scp /mysqlogg/dirdef/test.def 192.168.83.101:/mysqlogg/dirdef/

2、目标端配置

mysql的配置

mysql> create user ogg@'%' identified by '123456';
mysql> grant all privileges on *.* to ogg@'%';
mysql> flush privileges;
mysql> ALTER USER 'ogg'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.20 sec)
mysql> FLUSH PRIVILEGES;

目标端安装ogg软件

[root@mysql101 ~]# mkdir -p /mysqlogg
[root@mysql101 ~]# cd /mysqlogg/
[root@mysql101 mysqlogg]# tar -xvf ggs_Linux_x64_MySQL_64bit.tar 
[root@mysql101 mysqlogg]# ls

配置初始化ogg

[root@mysql101 mysqlogg]# ggsci
GGSCI (mysql01) 1> create subdirs
GGSCI (mysql01) 2> edit param mgr
port 7809
dynamicportlist 7840-7939
port 7809
dynamicportlist 7840-7939  
purgeoldextracts /mysqlogg/dirdat/*,usecheckpoints, minkeepdays 1 
~                                                              
GGSCI (mysql01) 3> start mgr
GGSCI (mysql01) 4> info all

在目标端新建库。

mysql> create database test;   
mysql> show databases;   
mysql> CREATE TABLE `test1` (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `name` varchar(255) DEFAULT NULL,
    ->   `age` int DEFAULT NULL,
    ->   `create_date` date DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=262145 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

配置检查表。

GGSCI (mysql101) 5> dblogin sourcedb test@192.168.83.101:3306 userid ogg password 123456 
GGSCI (mysql101 DBLOGIN as ogg) 6> add checkpointtable test.checkpoint

配置应用进程Replicat

 GGSCI (mysql101  DBLOGIN as ogg) 7> edit params repa
#定义应用进程名称
replicat repa 
#配置目标端数据库地址、用户名和密码
targetdb test@192.168.83.101:3306 userid ogg password 123456     
handlecollisions  
#假定两端数据结构不一致,使用此参数指定源端的数据结构定义文件,该文件需要由GlodenGate工具产生
sourcedefs /mysqlogg/dirdef/test.def
#定义discardfile文件位置,如果处理中有记录出错会写入到此文件中,建议参数值1024m  
discardfile /mysqlogg/dirrpt/repa.dsc,purge
#用于指定源端与目标端表的映射关系
map test.*, target test.*;
GGSCI (mysql101 DBLOGIN as ogg) 8> add replicat repa,exttrail /mysqlogg/dirdat/rl,checkpointtable test.checkpoint

四、开启数据同步

在这种情况下,我们可以不用备份数据,直接在目的端新建数据库和表结构即可,就可以开启数据同步了。

进入ggsci启动源端抽取进程、投递进程和目标端的应用进程,随后在源端数据库手动插入数据查看目标数据库是否完成了同步 源端

GGSCI (mysql100) 18> start exta
GGSCI (mysql100) 19> start pmysql

目标端

GGSCI (mysql101 DBLOGIN as ogg) 9> start repa
GGSCI (mysql101 DBLOGIN as ogg) 10> info all
GGSCI (mysql101 DBLOGIN as ogg) 10> info *

查看日志:

[root@mysql101 mysqlogg]# tailf  /mysqlogg/ggserr.log

测试数据是否同步 新增数据: 在源端新增数据:

INSERT INTO test1(name, age, create_date)
        VALUES ('name4', 27, CURDATE());

我们观察目的端的表数据是否同步,到这里基本就完成数据同步了。

相关推荐