写点什么

AWS 数据库迁移服务:将 Oracle 数据库迁移到 MySQL

作者:Deepak Vohra

  • 2022-09-22
    北京
  • 本文字数:7033 字

    阅读完需:约 23 分钟

AWS数据库迁移服务:将Oracle数据库迁移到MySQL

AWS数据库迁移服务(DMS)是在 AWS 上进行数据库迁移的服务。目标数据库必须是 AWS 支持的数据库之一,例如由 AWS关系数据库服务(RDS)托管的数据库、Amazon DynamoDBAmazon Redshift。源数据库可以是 AWS 上的数据库、本地数据库或其他云平台(如Oracle数据库云服务)上的数据库。源数据库在迁移过程中不需要停机。

为什么要迁移数据库

你可能会因为以下一个或多个原因而迁移数据库。


  • 同构迁移——迁移到不同平台但相同类型的数据库引擎。同构迁移可以用于对数据库进行备份。

  • 异构迁移——迁移到不同的数据库引擎,如 Oracle 数据库迁移到 MySQL 数据库。如果我们需要利用另一个数据库的功能(例如源数据库不支持某些数据类型),就需要进行异构迁移。商业数据库可以迁移到开源数据库,反之亦然。关系数据库可以迁移到 NoSQL 数据库。

  • 数据复制——将数据持续地复制到不同的目标数据库,用于测试和开发以及实现数据库的区域分布。

  • 数据库整合——可以将多个源数据库迁移到单个数据库进行整合。

  • 平台迁移——本地机器上的数据可以被迁移到云数据库服务。基于云的数据库即服务(Database-as-a-Service,DBaaS)提供了很多好处:不需要 DBA 的全托管服务、具有故障转移能力的高可用性、可伸缩性以及与其他云服务集成(实现自动化监控和日志记录)。在本文中,我们将把 Oracle 数据库迁移到 MySQL 数据库。如果你更喜欢开源 MySQL 数据库而不是商业 Oracle 数据库,那就可能需要进行迁移。MySQL 和 Oracle 数据库是完全不同的,你可能会出于一个或多个原因而迁移到 MySQL,例如不同的数据类型支持、操作系统支持和部署规模。


进行迁移唯一的先决条件是 AWS 帐户,可以在这里创建。

第 1 步:在 RDS 上创建 Oracle 和 MySQL DB 实例

因为我们分别将 Oracle 和 MySQL RDS DB 实例作为 DMS 迁移的源和目标,因此需要创建两个 RDS 实例,一个用于 Oracle 数据库,另一个用于 MySQL。在创建 RDS 实例之前,我们需要创建新的 VPC(虚拟私有云)、新的 DB 子网组和安全组(可选)。我们也可以使用默认的 VPC 安全组。如果 AWS 帐户的 VPC 最大数量有限制,请在创建 RDS 实例前删除部分不使用的 VPC。在创建 RDS 实例时,将公开访问选项设置为“是”,因为我们需要在执行 DMS 迁移之前直接访问这些实例,运行一些命令,并在迁移完成后验证迁移的数据。由于 RDS 默认情况下不创建数据库,所以我们需要选择附加配置,并为每个 RDS 实例指定初始数据库名称。MySQL RDS 实例数据库名称为 mysqldb,Oracle RDS 实例数据库名称为 orcl。某些保留关键字,如 MySQL RDS 实例的“mysql”不能用在配置中(如数据库名称、数据库实例标识符、主用户名、主密码)。Oracle 和 MySQL 的源和目标 RDS 实例如图 1 所示。


图 1. RDS 数据库实例


如果安全组没有满足需求的入站/出站规则,可能需要修改它们。单击 RDS 控制台中每个数据库实例的安全组链接。检查安全组的“Type”为“All traffic”、“Protocol”为“All”、“Port Range”为“All”、“Source”为“Anywhere”(0.0.0.0/0),如果不是,单击“Edit inbound rules”按钮并修改设置,然后单击“Save rules”。类似地,出站规则也应该允许所有流量。把每个 DB 实例的主用户名和主密码记录下来。

第 2 步:为 DMS 准备 Oracle 和 MySQL 数据库

为了能够使用 RDS 上的 Oracle DB 作为 DMS 源,我们需要在 DB 实例上配置一些东西。我们可以在命令行中连接到 Oracle 实例来进行配置。要在命令行中连接到 RDS DB 实例,我们需要获取 RDS 实例的端点。RDS 上的 DB 实例的端点可以从 RDS 控制台获得。


安装Oracle Instant客户端。使用下面的 sqlplus 命令连接到 Oracle DB 实例,其中 HOST、SID 和 PORT 对于不同的用户来说是不一样的。HOST 就是端点移除端口后缀后剩下的部分。


sqlplus admin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=orcl.crbmlbxmp8qi.us-east-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))
复制代码


SQL*Plus 命令行连接到 RDS 上的 Oracle DB,并启用 DMS 数据库级别的补充日志。


exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
复制代码


PL/SQL 过程执行完毕。


使用下面的命令启用数据库级别的 PRIMARY KEY 日志。


exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','PRIMARY KEY');
复制代码


由于源数据库是 Oracle,要复制正在进行的变更,需要打开补充日志。我们需要确保存档日志在服务器上保留足够长的时间(通常是 24 小时)。要在 RDS 数据库上设置存档日志保留期限,可以使用下面的命令。


exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24);
复制代码


在迁移数据库时,表和数据也会被迁移。为数据库迁移专门创建一个新的 Schema。为新用户授予 CREATE SESSION 和 CREATE TABLE 权限。


CREATE USER dms_user IDENTIFIED BY dms_user_pwDEFAULT TABLESPACE usersQUOTA unlimited ON users;
GRANT CREATE SESSION, CREATE TABLE TO dms_user;
复制代码


在 Oracle 数据库中创建一张叫作 wlslog 的数据库表。


CREATE TABLE dms_user.wlslog(time_stamp VARCHAR2(255) PRIMARY KEY,category VARCHAR2(255),type VARCHAR2(255),servername VARCHAR2(255), code VARCHAR2(255),msg VARCHAR2(255));INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:16-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to STANDBY');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:17-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to STARTING');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:18-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to ADMIN');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:19-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to RESUMING');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:20-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000361','Started WebLogic AdminServer');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:21-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to RUNNING');INSERT INTO dms_user.wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:22-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000360','Server started in RUNNING mode');
复制代码


若要为没有 PRIMARY KEY 日志的表添加补充日志,或者如果未设置数据库级别的 PRIMARY KEY 日志,可以为表添加补充日志。


alter table dms_user.wlslog add supplemental log data (ALL) columns;
复制代码


我们还可以直接在 CREATE TABLE 语句中启用补充日志。


CREATE TABLE dms_user.wlslog(time_stamp VARCHAR2(255) PRIMARY KEY,category VARCHAR2(255),type VARCHAR2(255),servername VARCHAR2(255), code VARCHAR2(255),msg VARCHAR2(255),supplemental log data(ALL) columns);
复制代码

第 3 步:创建复制实例

在本小节中,我们将创建一个复制实例,将 RDS 上的 Oracle DB 实例迁移到 MySQL DB 实例。在 AWS 控制台中选择 DMS 服务。单击创建复制实例,如图 2 所示。


图 2. 创建复制实例


打开“Create replication instance”向导,在“Name”字段中指定复制实例名(ora-mysql-repl)。选择一个 Instance class,我们选择了 dms.t3.medium。在“引擎版本”下拉框中选择 AWS DMS 版本(3.4.7)。选择“Allocated storage”(50GiB)。选择运行复制实例的 Amazon VPC。将“Multi-AZ”下拉框改为“Single-AZ”,我们只使用单个可用分区。选择“Publicly accessible”选项。


在“Advanced security and network configuration”中选择“复制子网组”。保持“Availability zone”默认值“No preference”不变。选择默认的 VPC 安全组。选择 KMS 密钥作为默认值(aws/dms)。点击“Create”。创建的复制实例如图 3 所示。


图 3. 复制实例

第 4 步:创建端点

接下来是配置端点,它们是源和目标数据库的端点。选择左边栏中的“端点”,单击“Create endpoint”。源和目标端点是分别创建的。在“DMS->Endpoints->创建端点向导”中,选择“Endpoint type”为“Source endpoint”,单击“Select RDS DB”复选框,从下拉菜单中选择 orcl RDS 实例。在“Endpoint configuration”中指定端点标识符 orcl。“Source engine”应该为 Oracle,因为我们选择了 Oracle 数据库 RDS 引擎。在“Access to endpoint database“中选择“Provide access information manually”选项。“Server name”和“Port”应该会自动添加。为 ADMIN 用户指定密码,用户名必须为大写,因为 Oracle 数据库是区分大小写的。“Secure Socket Layer (SSL) mode”设置为 none。“SID/Service name”应该自动填充为在 Oracle RDS 实例中配置的值(ORCL)。在“Test endpoint connection (optional) ”中单击 Run test。复制实例 ora-mysql-repl 被用于端点连接。“Status”为“successful”表示连接建立成功。单击“Create endpoint”,源数据库的端点就创建好了,如图 4 所示。


图 4. 源端点


要创建目标端点,请再次单击“Create endpoint”,启动创建端点向导。这一次,选择“Target endpoint”作为“Endpoint type”。单击“Select RDS DB”复选框并选择 mysqldb 实例。在“Endpoint configuration”中应该会自动添加“Endpoint identifier”。“Target engine”被设置为 MySQL。对于“Access to endpoint database”,选择“Provide access information manually”。“Server name”和“Port”应该会自动添加好。为 admin 用户指定密码。用户名必须用小写字母指定,因为 MySQL 使用小写字母。“Secure Socket Layer (SSL) mode”设置为 none。在“Test endpoint connection (optional) ”中单击 Run test。复制实例 ora-mysql-repl 被用于端点连接。“Status”为“successful”表示连接建立成功。单击“Create endpoint”,目标数据库的端点就创建好了,如图 5 所示。


图 5. 目标端点

第 5 步:创建任务

接下来,我们需要创建一个迁移任务,但在此之前,我们需要像前面所说的那样创建一个复制实例。在左边栏中选择“Database migration tasks”。在 DMS->Database migration tasks 表中单击“Create task”。在“Create database migration task”向导的“Task configuration”中指定一个“Task identifier”(orcl-to-mysql)。在“Replication instance”下拉框中选择前面创建的复制实例。在源数据库端点中选择为 Oracle 数据库 RDS 实例创建的 orcl 端点。对于目标数据库端点,选择前面创建的 mysqldb 端点。对于“Migration type”,选择“Migrate existing data and replicate ongoing changes”。


我们必须至少为一个任务配置一个选择规则,否则创建任务就会失败。在“Table mappings”中单击“Selection rules”下拉框。单击“Add new selection rule”按钮。在规则详细信息中配置“Where”选择规则。在“Schema”下拉框中选择“Enter Schema”。指定“Source name”为 DMS_USER,“Source table name”为 WLSLOG。模式名/表名/视图名/列名必须是大写的,因为 Oracle 数据库是区分大小写的。%是模式/表名的通配符,表示所有的模式/表。对于 Action 字段,我们可以通过选择 Include 或 Exclude 来包含或排除对象。排除操作在包含操作之后处理。将“Action”选为“Include”。源过滤器限制了可以添加的从源到目标的记录数量和类型。选择规则配置如图 6 所示。


图 6. 选择规则


你可以使用转换规则来修改或转换部分或所有选定对象的模式、表或列名。我们可以单击“Add transformation rule”按钮来添加一个转换规则。假设我们要转换表名。在“Rule target”下拉框中选择“Table”。在“Source name”中选择“Enter schema”。将 Schema 指定为 DMS_USER。指定“Source table name”为 WLSLOG。在 Action 下拉框中选择一个可用的操作,例如添加/移除/替换前缀/后缀等。选择 Action 为“Make lowercase”,因为 MySQL 以小写形式存储 Schema/表名。表名的转换规则如图 7 所示。


图 7. 将表名转为小写的转换规则


类似地,添加另一个转换规则将 Schema 名转为小写,如图 8 所示。


图 8. 将 Schema 名称转为小写的转换规则


在“Task settings->Advanced task settings->Control table settings”中将“Create control table in target using schema”设置为“mysqldb”。如果选择了“Enable premigration assessment run”复选框,可能会执行预迁移评估。在“Migration task startup configuration”中选择“Manually later”。另一个选项是“Automatically on create”,这个选项只在未启用预迁移时才可用。随后,单击“Create task”。


一个新任务就添加好了。任务状态最开始时是“创建”,在创建好以后 Status 变为“Ready”,如图 9 所示。


图 9. 任务状态变为 Ready

第 6 步:运行任务

要运行迁移任务,请选择表中带有复选框的任务,并单击 Actions 下拉框中的 Restart/Resume。任务的 Status 应该会变为 Starting。在启动之后,Status 会变为 Running,当迁移完成时,Status 将变为 Load complete,如图 10 所示。Table statistics 选项卡应该会列出迁移的表。


图 10. 任务执行完毕

第 7 步:查询迁移的数据库 Schema

使用 MySQL 客户端列出迁移的数据库和表。首先,连接到 MySQL RDS 实例。要连接到 MySQL DB,可以从它的配置信息中获取端点,然后使用 MySQL 客户端的命令行连接 MySQL。在出现提示时输入密码:


mysql -h mysqldb.crbmlbxmp8qi.us-east-1.rds.amazonaws.com -P 3306 -u admin  –p
复制代码


使用 SHOW SCHEMAS 命令列出所有 Schema,其中包含了 dms_user 的 Schema。


~$ mysql -h mysqldb.crbmlbxmp8qi.us-east-1.rds.amazonaws.com -P 3306 -u admin -p Enter password: MySQL [(none)]> SHOW SCHEMAS;+--------------------+| Database           |+--------------------+| dms_user           || information_schema || mysql              || mysqldb            || performance_schema || sys                |+--------------------+6 rows in set (0.078 sec)
复制代码


使用 use dms_user 命令选择 dms_user 数据库。使用 show tables 命令列出表,可以看到之前在 Oracle 数据库中创建的 wlslog 表已被迁移。


MySQL [(none)]> use dms_user;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedMySQL [dms_user]> SHOW TABLES;+--------------------+| Tables_in_dms_user |+--------------------+| wlslog |+--------------------+1 row in set (0.078 sec)
复制代码


迁移的 wlslog 表中包含了数据,如查询结果所示。


MySQL [dms_user]> SELECT * FROM wlslog;+---------------------------+----------+----------------+-------------+------------+----------------------------------+| TIME_STAMP                | CATEGORY | TYPE           | SERVERNAME  | CODE       | MSG                              |+---------------------------+----------+----------------+-------------+------------+----------------------------------+| Apr-8-2014-7:06:16-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000365 | Server state changed to STANDBY  || Apr-8-2014-7:06:17-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000365 | Server state changed to STARTING || Apr-8-2014-7:06:18-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000365 | Server state changed to ADMIN    || Apr-8-2014-7:06:19-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000365 | Server state changed to RESUMING || Apr-8-2014-7:06:20-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000361 | Started WebLogic AdminServer     || Apr-8-2014-7:06:21-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000365 | Server state changed to RUNNING  || Apr-8-2014-7:06:22-PM-PDT | Notice   | WebLogicServer | AdminServer | BEA-000360 | Server started in RUNNING mode   |+---------------------------+----------+----------------+-------------+------------+----------------------------------+7 rows in set (0.078 sec)
MySQL [dms_user]>
复制代码


默认情况下,迁移进程不会主动轮询源数据库来获取数据变更。如果对源数据库做了修改,例如将数据添加到表中或创建了新表,必须再次运行迁移任务。我们有时候可能需要修改迁移任务,例如添加/删除选择规则或修改其他任务设置。任务在未运行时可以被修改。我们可以单击“Modify”来修改任务。


作者简介:

Deepak Vohra 是 Oracle 认证 Java 程序员和 Oracle 认证 Web 组件开发人员,出版了 20 多本书。


原文链接

How to Migrate an Oracle Database to MySQL Using AWS Database Migration Service


相关阅读:

亚马逊云科技宣布 Lambda 分级定价

Stack Overflow 2022 报告:亚马逊云科技的软件开发“武器库”

TLS 1.2 成为亚马逊云科技最低 TLS 协议级别

2022-09-22 08:006788

评论

发布
暂无评论
发现更多内容

Java程序员常用的日志框架有哪些?

java易二三

Java 编程 程序员 计算机

初探webAssembly | 京东物流技术团队

京东科技开发者

前端 webassembly JavaScrip Blazor WebAssembly 企业号 7 月 PK 榜

暑假提升休闲两不误,与华为阅读一起开启高质量听书

最新动态

快速玩转 Llama2!阿里云机器学习 PAI 推出最佳实践(二)——全参数微调训练

阿里云大数据AI技术

人工智能

Qualcomm WiFi7 Routerboard,IPQ9574,4X4,4XM.2,SFP,Industrial High Power|DR9574

wallyslilly

ipq9574

JAVA和JVM运行原理是什么?

java易二三

Java 编程 JVM 计算机 程序猿

数仓现网案例丨超大结果集接收异常

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

大文件传输过程中的网络拥塞控制方法研究

镭速

大文件传输 网络拥塞问题

直播程序源码开发建设:洞察全局,数据统计与分析功能-山东布谷科技创作

山东布谷科技

软件开发 直播 源码搭建 程序源码 mac数据分析统计软件

Java一维数组是什么,怎么用?

java易二三

Java 编程 程序员 数组 计算机

HBase Compaction 原理与线上调优实践

vivo互联网技术

HBase 调优参数 Minor Compaction Compaction策略 Major Compaction

并发编程-FutureTask解析 | 京东物流技术团队

京东科技开发者

并发编程 源码剖析 FutureTask 企业号 7 月 PK 榜

一文让你知道等保测评和渗透测试的区别与联系

行云管家

信息安全 渗透测试 等级保护 等保测评

密集发布AI应用后,微软2023财报传递了什么信号|TE解读

TE智库

fastposter v2.16.0 让海报开发更简单

物有本末

图片处理 海报生成器 海报生成

用Rust生成Ant-Design Table Columns | 京东云技术团队

京东科技开发者

rust swagger 企业号 7 月 PK 榜 Columns

视觉套件专项活动!与飞桨技术专家一起提升技术实力,更多荣誉奖励等你领取

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

在langchain中使用带简短知识内容的prompt template

程序那些事

人工智能 AI 程序那些事 AI大语言模型 大语言模型

Java基础 日期和时间

java易二三

程序员 计算机 java 编程

印刷行业MES系统解决方案

万界星空科技

开源 MES系统 印刷

Java Web应用开发案例|使用AJAX实现省市区三级联动效果

TiAmo

Java Java web 开发实例

用友发布业界首个企业服务大模型YonGPT

用友BIP

NineData已支持「最受欢迎数据库」PostgreSQL

NineData

postgresql 客户端 数据源 NineData 集成AI

开发语音APP源码的小知识

山东布谷网络科技

app源码

澜舟科技CEO周明:不过度追求AGI,更看重大模型语言理解能力和应用落地性 | 1号位

澜舟孟子开源社区

长连接:ChatGPT流式响应背后的逻辑 | 京东物流技术团队

京东科技开发者

websocket 长连接 企业号 7 月 PK 榜 sse

英特尔合作埃森哲推出一套共计34个开源AI参考套件

E科讯

暑期读书指南 | 用缤纷字体读精品好书,华为阅读上新啦!

最新动态

Inpaint Anything:一键进行多种图像修补

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 7 月 PK 榜

AWS数据库迁移服务:将Oracle数据库迁移到MySQL_服务革新_InfoQ精选文章