将数据从 Oracle® 迁移到 Cloud SQL for MySQL

本文档是系列文章中的一篇,介绍了如何将数据从 Oracle 迁移到 Cloud SQL for MySQL。本系列中的以下文档将进行详细介绍:

准备迁移数据

本部分重点介绍如何将数据从 Oracle 迁移到 Cloud SQL for MySQL。以下前提条件对于避免实时迁移过程中出现问题至关重要:

  • 所有数据库对象(包括表、视图、存储过程和函数)均已执行从 Oracle 到 Cloud SQL for MySQL 的架构转换
  • 已使用一些示例数据对目标架构进行了测试,以确保其可以保存与源架构相同的数据。

可以通过两种基本方法迁移数据:一次性加载和实时复制。一次性加载方法是指从 Oracle 导出现有数据并将其导入到 MySQL 中。实时复制方法是指数据生成之后立即从 Oracle 复制到 MySQL。

对于一次性加载方法,源数据库必须仅在该过程期间打开进行写入。因此,此方法也称为离线数据迁移Oracle SQL 开发者是用户从 Oracle 导出数据的最常用工具之一。此工具支持从采用各种格式(包括 CSV 和 SQL 插入语句)的 Oracle 表中导出数据。或者,您可以使用 SQL*Plus 选择数据并设置其格式,然后将其假脱机到文件中。将数据从 Oracle 导出到平面文件后,您可以使用 LOAD DATA INFILE 命令将数据加载到 MySQL 中。该方法通常是一种最便宜的迁移方法,但它可能需要更多的手动输入,并且比使用迁移工具要慢。它还需要在迁移过程中将应用停机。

相比之下,实时复制方法(也称为更改数据捕获)是一种在线数据迁移方法。在初始数据复制期间,源数据库保持打开状态。复制产品会捕获源数据库上发生的数据更改,并将这些更改传输并应用到目标数据库。如果是迁移生产数据,您可以使用此方法以最大限度地减少所需的停机时间,并确保在进行切换之前停机时间接近零。此方法涉及使用第三方更改数据捕获 (CDC) 产品,例如 GoldenGateStriim 或 Informatica 的数据复制

如需从充当源数据库的 Oracle 使用 CDC,我们建议您使用以下命令在数据库级层启用补充日志记录功能:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

除常规主键或唯一索引列外,此命令还会使重做日志文件记录其他列数据。

您可以先在初始加载步骤(包括从源 Oracle 数据库环境转移多达数 TB 的所有现有数据,以及捕获任何当前正在进行的数据修改直到两个环境同步为止)中使用第三方 CDC 产品,然后再在两个平台之间进行切换。CDC 产品通常提供其他功能,例如数据类型转换和其他简单转换。

执行数据迁移

迁移数据时,请遵循以下准则,其中大部分准则同时适用于一次性加载方法和实时复制方法:

  • 字符集:确保源 Oracle 数据库与目标 MySQL 数据库之间的字符集兼容。
  • 外键:要提升提取速度,请暂时停用目标 MySQL 数据库上的外键限制条件。加载完成后再启用外键限制条件。
  • 索引:与外键类似,目标 MySQL 数据库上的索引可能会显著降低初始加载的速度。确保在初始加载完成之前,在目标数据库上未创建索引。
  • Oracle 序列:MySQL 支持 AUTO_INCREMENT 而不是序列。确保在初始加载期间停用 AUTO_INCREMENT 特性,以避免覆盖 Oracle 的序列生成的值。在初始加载完成后,将 AUTO_INCREMENT 特性添加到主键列。
  • 网络连接:如果您使用的是 CDC,请确保来源环境和目标环境都可以与 CDC 产品建立网络连接,以允许在 Oracle 端捕获数据并在 Cloud SQL for MySQL 端加载数据。

GoldenGate 使用场景

本部分详细介绍使用 Oracle 的 CDC 产品 GoldenGate 可将哪些项目在线迁移到 Cloud SQL。第一步是在源系统和目标系统中安装 GoldGate 来为环境做好运行 GoldenGate 的准备。在源端,您可以在 Oracle 服务器上安装应用,也可以在通过 SQL*Net 连接连接到 Oracle 数据库的远程服务器上安装应用。在目标端,您必须在 Google Cloud 上使用模拟虚拟机来运行 GoldenGate 应用,因为您无法在 Cloud SQL 机器上直接安装 GoldenGate。GoldGate 附带一款名为 GGSCI 的命令行实用程序,可用于配置和执行各种 GoldenGate 程序。

设置环境后,您可以配置并添加 EXTRACT 程序来捕获数据更改。我们将在开始加载初始数据之前完成此操作,因此在运行加载期间正在进行的事务更改不会丢失。如前所述,CDC 要求对源 Oracle 数据库启用补充日志记录功能。提交的事务会从重做日志中提取,然后转换为 logical change records (LCRs) 并写入本地的跟踪记录文件和远程暂存区域(Google Cloud 虚拟机)。您需要弄清楚如何调整跟踪记录文件的大小,以便它们保留足够长的时间而不会用尽所有可用的磁盘空间。

下一步是配置名为 EXTRACT 的 GoldenGate 捕获过程以执行初始数据加载操作。此操作包括创建一个参数文件,用于指定 Oracle 中的源表与 MySQL 中的目标表(例如 MAP schema/table to TARGET database.table)之间的映射列表。与 CDC 相比,初始加载使用源表而非重做日志来派生源数据。我们通过启动 EXTRACT 程序并验证结果来执行初始加载程序。初始加载的持续时间取决于您的数据量和网络吞吐量。

初始数据加载成功完成后,您可以配置更改交付,这是将 LCRs 应用于目标 MySQL 数据库的过程。REPLICAT 程序从远程跟踪记录文件读取这些记录,将它们转换为 DML 和 DDL 语句,然后将其应用于目标 MySQL 数据库。REPLICAT 程序有自己的参数文件,其中包括介绍如何处理冲突和其他异常的部分。

确定数据复制是否有效的最简单方法是在源表上运行行计数,并将结果与其目标表进行比较。GGSCI 具有报告和统计信息命令,让您可以查看复制统计信息和错误。

成功标准

仅当满足以下标准时,才将数据迁移(无论离线还是在线)视为成功:

  • 转移数据时未发生错误或出现程序失败的情况。
  • 如果您使用的是一次性加载方法,则加载的持续时间未超过您的业务允许的停机时间窗口。
  • 如果您使用的是 CDC,则您的应用用户在初始加载期间未发现性能受到影响。
  • 如果您使用的是 CDC,则复制延迟会随着时间逐渐减少,以便目标数据库最终与源数据库同步。

迁移后验证数据完整性

在此阶段中,您希望找出目标 MySQL 环境存在的任何问题和不一致的地方,以便快速解决数据之间的所有差异。请按照以下步骤操作:

  1. 比较源数据库表与目标数据库表的行数以找出所有差距。除了运行 count 之外,还要对同一组表运行 sumavgminmax
  2. 针对目标 MySQL 环境运行常用的 SQL 语句,以确保数据与源 Oracle 数据库匹配。
  3. 将应用连接到源数据库和目标数据库,并验证结果是否匹配。

后续步骤