注意:

使用 OCI GoldenGate 设置两个 Oracle Heatwave MySQL 受管实例之间的双向复制

简介

Oracle Cloud Infrastructure GoldenGate (OCI GoldenGate) 是一项全托管式服务,可帮助数据工程师实时、大规模地将数据从一个或多个数据管理系统迁移到 OCI 数据库。在单个界面中设计、运行、编排和监视数据复制任务,而无需分配或管理任何计算环境。OCI GoldenGate 支持多个源和目标,包括 MySQL 和 Oracle HeatWave MySQL 数据库服务。

在本教程中,我们将指导您如何使用 OCI GoldenGate 在 OCI 中的两个 Oracle HeatWave MySQL 实例之间设置双向复制。

目标

先决条件

任务 1:部署 OCI GoldenGate

  1. 登录到 OCI 控制台,搜索 GoldenGate ,选择 GoldenGate 服务,然后单击创建部署

  2. 输入以下信息,然后单击创建

    • 名称:输入 MySQLggdeployment1
    • 部署类型:选择数据复制
    • 选择技术:选择 MySQL
    • 选择版本:输入 21.15
    • 硬件配置:输入 # 个 OCPU。
    • 子网选择:选择子网。
    • 许可证类型:选择许可证类型。
    • 实例名称:输入 GGInstance1
    • 身份证明存储:选择 GoldenGate (创建新密码密钥或选择现有密码密钥)。

任务 2:在 Oracle HeatWave MySQL 实例中创建用户

  1. 使用 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 部署中设置连接

  1. 转到 OCI GoldenGate 部署页面,然后单击连接以设置连接。

    图中显示了如何创建连接

  2. 请输入连接信息。

    图中显示了 GoldenGate 连接

  3. 重复以上步骤可添加源连接和目标连接。

  4. 选择部署并单击分配的连接以将连接分配给部署。

    图中显示了如何将连接分配给部署

任务 4:为 OCI GoldenGate 控制台设置入站规则和安全列表

  1. 设置入站规则并更新安全列表,以允许 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
    
  2. 通过 OCI 控制台和 OCI GoldenGate 控制台测试源数据库和目标数据库的连接。

    1. 验证 OCI 控制台中的 MySQL 实例连接。

      图中显示了如何测试连接

    2. 从 OCI GoldenGate 控制台验证相同的连接。

      图中显示了如何在 GG 控制台中测试连接

任务 5:创建提取和复制流程

  1. 创建主要提取 (EXT1)。

    1. 登录到 OCI GoldenGate 控制台。

    2. 转到 Overview(概览),然后单击 Extracts(提取)部分中的 +

      图中显示了如何添加 EXTRACT

    3. 输入提取信息。

      图中显示了 EXTRACT 详细信息

    4. 根据需要编辑参数文件。以下参数文件捕获 classicmodels 数据库中的所有更改,包括 DDL 更改。

      EXTRACT ext1
      USERIDALIAS  MySQLpoc1, DOMAIN OracleGoldenGate
      EXTTRAIL e1
      DDL INCLUDE MAPPED
      TRANLOGOPTIONS FETCHPARTIALJSON
      TABLE classicmodels.*;
      

      注:MySQLpoc1 是源实例。

    5. 启动提取并记下源上的全局事务处理标识符 (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>
      

      启动提取并使其始终运行,即使您仍在努力设置目标数据库以确保捕获所有更改也是如此。

  2. 创建主副本 (REP1)。

    1. 登录到 OCI GoldenGate 控制台。

    2. 转到 Overview(概述),然后单击 Replicat(复制)部分中的 +(+)

      图中显示了 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)
      
    3. 根据需要编辑参数文件。以下参数文件将复制 classicmodels 数据库下的所有对象以及 DDL 更改。

      REPLICAT rep1
      USERIDALIAS  MySQLpoc2, DOMAIN OracleGoldenGate
      DDL INCLUDE MAPPED
      MAP classicmodels.*, TARGET classicmodels.*;
      

      注:MySQLpoc2 是目标实例。

    4. 由于这是主副本,并且它是首次启动,因此它将从线索文件 0 开始应用。但是,如果要更改复制以从特定 GTID 开始,请执行以下步骤:

      1. 转至 OCI GoldenGate 控制台中的复制部分。

      2. 选择复制,单击变更编辑开始,选择 GTID 并输入 GTID

  3. 到目前为止,我们已经为数据操纵语言 (Data Manipulation Language,DML) 和 DDL 复制设置了单向。单向复制同步后,我们可以继续进行双向复制。

    1. 重复步骤 5.1 和步骤 5.2,但这次我们反转源和目标详细信息。源数据库实例现在将充当目标实例,目标实例将充当源实例。

      • 来源:输入 MySQLpoc2
      • 目标:输入 MySQLpoc1
      • 对于此用例,我们使用了第二个数据库 airportdb。可以为同一数据库设置双向复制。
    2. 添加主要提取 (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.*;
      
    3. 手动创建检查点表,因为这是经典副本。双向复制仅支持经典副本和协调副本。

      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:设置初始加载提取

  1. 如果要利用 OCI GoldenGate 将数据初始加载到目标数据库中,请设置初始加载提取。

    1. 登录到 OCI GoldenGate 控制台。

    2. 转到概览,然后单击提取部分中的 + 。这与创建主要提取非常相似,唯一的区别是在创建提取时选择提取类型作为初始加载

      初始加载提取的参数文件。

      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
      
  2. 同样,设置复制,读取由初始加载提取生成的线索文件。初始加载完成后,将删除此复制和初始加载提取。

    1. 在目标数据库上,确保所有表都为空。删除/禁用目标上的所有外键禁用目标上的触发器和索引以提高初始加载性能。

      注:请先为方案对象 DDL 备份,然后再删除任何 DDL。

    2. 以下是使用初始加载提取进行初始数据加载时应创建提取和复制流程的顺序。

      1. 为来源创建主要提取(尚未启动流程)。

      2. 为源创建初始加载提取(尚未启动进程)并在源上捕获 GTID。

      3. 创建复制以处理由目标的初始加载提取生成的线索文件(尚未启动进程)。

        注:初始加载没有单独的复制类型。

      4. 为目标创建主副本(尚未启动进程)。

      5. 对初始装入复制和主复制使用相同的检查点表。初始加载复制指向初始提取线索文件,主要复制指向主要提取线索文件(两个线索文件不同)。

    3. 以下是使用初始加载提取时进程的启动顺序。

      1. 启动主要提取并记下其注册的 GTID。

      2. 启动为初始加载提取创建的复制。

      3. 编辑初始加载提取,然后对其进行更改以从启动主要提取时获得的 GTID 开始。

      4. 启动主副本。

        注:

        • 仅在初始装入的初始装入提取和初始装入的复制同步后启动主复制(链路聚合组 0)。
        • 在启动主副本之前创建或启用外键。

        在启动主副本之前创建索引(如果提前删除索引以提高初始加载性能)。

限制

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心