注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 OCI GoldenGate 设置两个 Oracle Heatwave MySQL 受管实例之间的双向复制
简介
Oracle Cloud Infrastructure GoldenGate (OCI GoldenGate) 是一项全托管式服务,可帮助数据工程师实时、大规模地将数据从一个或多个数据管理系统迁移到 OCI 数据库。在单个界面中设计、运行、编排和监视数据复制任务,而无需分配或管理任何计算环境。OCI GoldenGate 支持多个源和目标,包括 MySQL 和 Oracle HeatWave MySQL 数据库服务。
在本教程中,我们将指导您如何使用 OCI GoldenGate 在 OCI 中的两个 Oracle HeatWave MySQL 实例之间设置双向复制。
目标
- 使用 OCI 中的 OCI GoldenGate 在两个 Oracle HeatWave MySQL 托管实例之间设置双向复制。
先决条件
-
源和目标 Oracle HeatWave MySQL 实例必须使用
InnoDB
引擎,并且必须在5.7
或8.*
版本上运行。 -
对于双向复制,建议在源和目标上使用相同版本的 MySQL 实例。
-
源和目标实例上的
binlog_expire_logs_second
实例参数必须至少设置为 72 小时。 -
源和目标实例上的
binlog_row_metadata
实例参数必须设置为完全,以允许数据定义语言 (Data Definition Language,DDL) 复制。注:只能通过创建定制配置来更改实例参数。有关详细信息,请参阅为 MySQL 创建自定义配置。
-
查看支持的数据类型。有关更多信息,请参见MySQL:Supported Data Types,Objects,and Operations 。
-
查看 DDL 复制限制。有关更多信息,请参见 Using DDL Replication 。
-
应使用以下方法之一提前从源创建目标实例:
- 方法 1:使用 MySQL shell 实用程序,例如
util.dumpInstance
和util.loadDump
。 - 方法 2:通过基于 OCI 控制台的备份和还原选项。
- 方法 3:使用 OCI GoldenGate 执行初始提取和复制,以执行初始数据加载。在本教程中使用了此方法(任务 7)。
- 方法 1:使用 MySQL shell 实用程序,例如
-
根据设计,提取将忽略心跳表 DDL。应在目标上手动创建心跳表。
-
安装了 MySQL 客户机的堡垒主机。
-
入站规则和更新的安全列表允许在源、目标、堡垒和 OCI GoldenGate 之间进行通信。
任务 1:部署 OCI GoldenGate
-
登录到 OCI 控制台,搜索 GoldenGate ,选择 GoldenGate 服务,然后单击创建部署。
-
输入以下信息,然后单击创建。
- 名称:输入
MySQLggdeployment1
。 - 部署类型:选择数据复制。
- 选择技术:选择 MySQL 。
- 选择版本:输入
21.15
。 - 硬件配置:输入 # 个 OCPU。
- 子网选择:选择子网。
- 许可证类型:选择许可证类型。
- 实例名称:输入
GGInstance1
。 - 身份证明存储:选择 GoldenGate (创建新密码密钥或选择现有密码密钥)。
- 名称:输入
任务 2:在 Oracle HeatWave MySQL 实例中创建用户
-
使用 OCI 堡垒主机连接到源和目标 MySQL 实例,并为 OCI GoldenGate 提取和复制流程创建用户。运行下面的查询:
-
源 MySQL 实例上。
> create user 'ggsuser_S'@'%' identified by "<password>"; > grant all privileges on airportdb.* to 'ggsuser_S'@'%' with grant option; > Grant select, process, replication slave, replication client on *.* to 'ggsuser_S'@'%';
-
在目标 MySQL 实例上。
> create user 'ggsuser_T'@'%' identified by "<password>"; > grant all privileges on airportdb.* to 'ggsuser_T'@'%' with grant option; > Grant select, process, replication slave, replication client on *.* to 'ggsuser_T'@'%';
-
任务 3:在 OCI GoldenGate 部署中设置连接
-
转到 OCI GoldenGate 部署页面,然后单击连接以设置连接。
-
请输入连接信息。
-
重复以上步骤可添加源连接和目标连接。
-
选择部署并单击分配的连接以将连接分配给部署。
任务 4:为 OCI GoldenGate 控制台设置入站规则和安全列表
-
设置入站规则并更新安全列表,以允许 Oracle HeatWave MySQL 实例、OCI GoldenGate 部署和 OCI 堡垒计算之间进行通信。
注:如果使用 VPN,则可以跳过此步骤。
按照此处列出的步骤操作:选项 B:在 OCI 计算上使用您自己的堡垒。
ssh -i <private-ssh-key-of-bastion-compute> opc@<bastion-compute-public-ip> -L 443:<GoldenGategate-deployment-hostname>:443 -N
-
通过 OCI 控制台和 OCI GoldenGate 控制台测试源数据库和目标数据库的连接。
-
验证 OCI 控制台中的 MySQL 实例连接。
-
从 OCI GoldenGate 控制台验证相同的连接。
-
任务 5:创建提取和复制流程
-
创建主要提取 (
EXT1
)。-
登录到 OCI GoldenGate 控制台。
-
转到 Overview(概览),然后单击 Extracts(提取)部分中的 + 。
-
输入提取信息。
-
根据需要编辑参数文件。以下参数文件捕获
classicmodels
数据库中的所有更改,包括 DDL 更改。EXTRACT ext1 USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate EXTTRAIL e1 DDL INCLUDE MAPPED TRANLOGOPTIONS FETCHPARTIALJSON TABLE classicmodels.*;
注:
MySQLpoc1
是源实例。 -
启动提取并记下源上的全局事务处理标识符 (Global Transaction Identifier,GTID)。
MySQL> select @@gtid_executed, @@gtid_purged\G *************************** 1. row *************************** @@gtid_executed: 3b631a96-6aa7-11ef-95c0-02001701769c:1-94 <--- make a note of this GTID @@gtid_purged: 3b631a96-6aa7-11ef-95c0-02001701769c:1-72 1 row in set (0.00 sec) MySQL>
启动提取并使其始终运行,即使您仍在努力设置目标数据库以确保捕获所有更改也是如此。
-
-
创建主副本 (
REP1
)。-
登录到 OCI GoldenGate 控制台。
-
转到 Overview(概述),然后单击 Replicat(复制)部分中的 +(+) 。
注:检查点表名应以小写形式以数据库/方案名作为前缀。如果不这样做,将导致检查点表的创建失败。
例如,
classicmodels.OCIGG_CHECKPOINT_REP1
。建议为检查点表创建单独的专用数据库/方案(例如
ggadmin
方案)。MySQL> create database ggadmin; Query OK, 1 row affected (0.01 sec) MySQL> grant all privileges on ggadmin.* to 'ggsuser_T'@'%' with grant option; Query OK, 0 rows affected (0.00 sec) MySQL> grant all privileges on ggadmin.* to 'ggsuser_S'@'%' with grant option; Query OK, 0 rows affected (0.00 sec)
-
根据需要编辑参数文件。以下参数文件将复制
classicmodels
数据库下的所有对象以及 DDL 更改。REPLICAT rep1 USERIDALIAS MySQLpoc2, DOMAIN OracleGoldenGate DDL INCLUDE MAPPED MAP classicmodels.*, TARGET classicmodels.*;
注:
MySQLpoc2
是目标实例。 -
由于这是主副本,并且它是首次启动,因此它将从线索文件 0 开始应用。但是,如果要更改复制以从特定 GTID 开始,请执行以下步骤:
-
转至 OCI GoldenGate 控制台中的复制部分。
-
选择复制,单击变更、编辑、开始,选择 GTID 并输入 GTID 。
-
-
-
到目前为止,我们已经为数据操纵语言 (Data Manipulation Language,DML) 和 DDL 复制设置了单向。单向复制同步后,我们可以继续进行双向复制。
-
重复步骤 5.1 和步骤 5.2,但这次我们反转源和目标详细信息。源数据库实例现在将充当目标实例,目标实例将充当源实例。
- 来源:输入
MySQLpoc2
。 - 目标:输入
MySQLpoc1
。 - 对于此用例,我们使用了第二个数据库
airportdb
。可以为同一数据库设置双向复制。
- 来源:输入
-
添加主要提取 (
EXT2
)。EXTRACT ext2 USERIDALIAS MySQLpoc2, DOMAIN OracleGoldenGate EXTTRAIL e2 DDL INCLUDE MAPPED TRANLOGOPTIONS FILTERTABLE ggadmin.OCIGG_CHECKPOINT_REP* -- from 23ai GG use EXCLUDEFILTERTABLE TABLE airportdb.*;
-
手动创建检查点表,因为这是经典副本。双向复制仅支持经典副本和协调副本。
For example: ggadmin.OCIGG*CHECKPOINT_REP`- Add primary REPLICAT REP2:` REPLICAT rep2 USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate DDL INCLUDE MAPPED MAP airportdb.*, TARGET airportdb.\_;
-
任务 6:运行 DDL 和 DML 测试
现在,双向设置已完成,是时候运行简单的 DML 和 DDL 测试了。
--DML test from classicmodels database on source MySQLpoc1
MySQLpoc1> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626432 |
+----------+
1 row in set (0.19 sec)
MySQLpoc1> insert into weatherdata values ('2005-01-02','04:50:00',-8.1,3,57.0,990.00,38.00,'Nebel-Schneefall',61);
Query OK, 1 row affected (0.00 sec)
MySQLpoc1> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626433 |
+----------+
1 row in set (0.23 sec)
-DDL replication test from classicmodels database on source MySQLpoc1
MySQLpoc1> create table test (name char(5));
Query OK, 0 rows affected (0.02 sec)
MySQL> insert into test values ('cj');
Query OK, 1 row affected (0.00 sec)
MySQL>
--Now Let's check if the above DML and DDLs got replicated to target MySQLpoc2
MySQLpoc2> select count(*) from weatherdata;
+----------+
| count(*) |
+----------+
| 4626433 | <--- row count matches to source
+----------+
1 row in set (0.37 sec)
MySQLpoc2>
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj | <-- table CJ got replicated
+------+
1 row in set (0.00 sec)
MySQL>
-- Now testing Bi directional
-- on target (MySQLpoc2)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
+------+
1 row in set (0.00 sec)
MySQLpoc2> insert into test values ('cj2');
Query OK, 1 row affected (0.01 sec)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
+------+
2 rows in set (0.00 sec)
MySQLpoc2> insert into test values ('cjs3');
Query OK, 1 row affected (0.00 sec)
MySQLpoc2> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
| cjs3 |
+------+
3 rows in set (0.00 sec)
MySQLpoc2>
--On source (MySQLpoc1):
--DML on the target got REPLICATed on the source
MySQLpoc1> select * from test;
+------+
| name |
+------+
| cj |
| cj2 |
| cjs3 |
+------+
3 rows in set (0.00 sec)
MySQL>
任务 7:设置初始加载提取
-
如果要利用 OCI GoldenGate 将数据初始加载到目标数据库中,请设置初始加载提取。
-
登录到 OCI GoldenGate 控制台。
-
转到概览,然后单击提取部分中的 + 。这与创建主要提取非常相似,唯一的区别是在创建提取时选择提取类型作为初始加载。
初始加载提取的参数文件。
Parameter file for initial load EXTRACT: EXTRACT EXTIL USERIDALIAS MySQLpoc1, DOMAIN OracleGoldenGate EXTFILE il , PURGE TABLE airportdb.*; MAP_PARALLELISM 4 MIN_APPLY_PARALLELISM 2 MAX_APPLY_PARALLELISM 10 SPLIT_TRANS_RECS 1000 CHUNK_SIZE 1 GB
-
-
同样,设置复制,读取由初始加载提取生成的线索文件。初始加载完成后,将删除此复制和初始加载提取。
-
在目标数据库上,确保所有表都为空。删除/禁用目标上的所有外键。禁用目标上的触发器和索引以提高初始加载性能。
注:请先为方案对象 DDL 备份,然后再删除任何 DDL。
-
以下是使用初始加载提取进行初始数据加载时应创建提取和复制流程的顺序。
-
为来源创建主要提取(尚未启动流程)。
-
为源创建初始加载提取(尚未启动进程)并在源上捕获 GTID。
-
创建复制以处理由目标的初始加载提取生成的线索文件(尚未启动进程)。
注:初始加载没有单独的复制类型。
-
为目标创建主副本(尚未启动进程)。
-
对初始装入复制和主复制使用相同的检查点表。初始加载复制指向初始提取线索文件,主要复制指向主要提取线索文件(两个线索文件不同)。
-
-
以下是使用初始加载提取时进程的启动顺序。
-
启动主要提取并记下其注册的 GTID。
-
启动为初始加载提取创建的复制。
-
编辑初始加载提取,然后对其进行更改以从启动主要提取时获得的 GTID 开始。
-
启动主副本。
注:
- 仅在初始装入的初始装入提取和初始装入的复制同步后启动主复制(链路聚合组 0)。
- 在启动主副本之前创建或启用外键。
在启动主副本之前创建索引(如果提前删除索引以提高初始加载性能)。
-
-
限制
-
仅经典副本和协调副本支持双向和多方向复制,不支持并行复制。
-
自动递增列问题。
-
如果一个表有一列,但该列不是主键或唯一键,则映射将失败,因为该表的所有列的组合在源和目标上都是相同的。
-
数据类型、DDL 和其他功能限制。
-
使用主动 - 主动复制时,两个系统上的时区必须相同,以便基于时间戳的冲突解决和检测能够运行。
相关链接
确认
- 作者 — Chakradhar Jagganagari(LIFT 实施专家—自定义、第三方、VM 数据库和应用)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Set up Bidirectional Replication Between Two Oracle Heatwave MySQL managed instances using OCI GoldenGate
G29688-02
Copyright ©2025, Oracle and/or its affiliates.