本文适用于使用阿里云自带数据迁移产品 数据传输 DTS (以下简称 DTS)从 AWS RDS for Oracle 实例不停服迁移数据到阿里云 RDS for MySQL。
对于 AWS RDS for Oracle->阿里云 RDS for MySQL 的迁移,DTS 支持结构迁移、全量数据迁移以及增量数据迁移。各迁移类型的限制如下:
结构迁移
DTS 会将被迁移对象的结构定义迁移到目标实例。目前 DTS 支持结构迁移的对象包括:表、索引、约束、序列。其他对象如视图、同义词、触发器、存储过程、存储函数、包、自定义类型等暂不支持。
全量数据迁移
DTS 会将源数据库迁移对象的存量数据全部迁移到目标阿里云 RDS for MySQL 实例。如果仅做全量数据迁移,不做增量数据迁移,迁移过程中,如果源端 Oracle 数据库中有数据更新的话,那么这部分数据增量变化不一定能够被迁移到目标阿里云 RDS for MySQL 中。所以,如果仅做全量数据迁移,不做增量数据迁移,为保证迁移数据一致性,在数据迁移过程中,源端的 Oracle 实例需停止写入。
增量数据迁移
增量迁移过程中,DTS 会轮询并捕获源 Oracle 实例由于数据变化产生的重做日志 redo log,然后将数据变化的增量实时同步到目标阿里云 RDS for MySQL 实例,通过增量数据迁移可以实现目标阿里云 RDS for MySQL 实例同源 AWS RDS for Oracle 数据库实例的实时数据同步。
当使用 DTS 进行 AWS RDS for Oracle->阿里云 RDS for MySQL 迁移时,在不同迁移类型情况下,对源和目标数据库的迁移帐号权限要求如下:
迁移类型 | 结构迁移 | 全量迁移 | 增量数据迁移 |
---|---|---|---|
源端 AWS RDS for Oracle 实例 | schema 的 owner | schema 的 owner | MASTER USER 具备的权限 |
目标端 RDS for MySQL 实例 | 待迁入数据库的读写权限 | 待迁入数据库的读写权限 | 待迁入数据库的读写权限 |
已创建作为迁移源端的 AWS RDS for Oracle 数据库实例,版本为 10g,11g 或者 12c。
已创建作为迁移目标端的阿里云 RDS for MySQL 5.6 或者 5.7 实例,该实例的可用空间大小需要为源端 AWS RDS for Oracle 实例中待迁移数据量的 2 倍以上(因导入数据库时会产生 Binlog 占用一定的空间,后续系统会自动进行清理)。
由于 Oracle 和 MySQL 的数据类型并不是一一对应的,所以 DTS 在进行结构迁移时,会根据两种数据库类型的数据类型定义,进行类型映射,下面是数据类型映射关系。
Oracle 数据类型 | MySQL 数据类型 | DTS 是否支持 |
---|---|---|
varchar2(n [char/byte]) | varchar(n) | 支持 |
nvarchar2[(n)] | national varchar[(n)] | 支持 |
char[(n [byte/char])] | char[(n)] | 支持 |
nchar[(n)]] | national char[(n)] | 支持 |
number[(p[,s])] | decimal[(p[,s])] | 支持 |
float(p)] | double | 支持 |
long | longtext | 支持 |
date | datetime | 支持 |
binary_float | decimal(65,8) | 支持 |
binary_double | double | 支持 |
timestamp[(fractional_seconds_precision)] | datetime[(fractional_seconds_precision)] | 支持 |
timestamp[(fractional_seconds_precision)]with local time zone | datetime[(fractional_seconds_precision)] | 支持 |
timestamp[(fractional_seconds_precision)]with local time zone | datetime[(fractional_seconds_precision)] | 支持 |
clob | longtext | 支持 |
nclob | longtext | 支持 |
blob | longblob | 支持 |
raw | varbinary(2000) | 支持 |
long raw | longblob | 支持 |
bfile | — | 不支持 |
interval year(year_precision) to mongth | — | 不支持 |
interval day(day_precision) to second[(fractional_seconds_precision)] | — | 不支持 |
由于 RDS for MySQL 中,参数 lower_case_table_names 默认为 1,即表名大小写不敏感,如果使用大写表名建表,RDS for MySQL 会先把表名转为小写,再执行操作。因此,如果在源端 Oracle 中存在表名相同,但仅大小写不同的表,可能在目标端 RDS for MySQL 导致对象重名,在结构迁移中出现“对象已经存在”的报错。
如果出现这种情况,请在配置迁移对象的时候,使用 DTS 提供的对象名映射功能,对存在重名的对象进行重命名。
增量数据迁移期间,支持同步的 SQL 操作包括:
Insert、Delete、Update
CREATE TABLE //不支持分区表,及表内定义包括函数的表
ALTER TABLE ADD COLUMN、ALTER TABLE DROP COLUMN、ALTER TABLE RENAME COLUMN、ALTER TABLE ADD INDEX
DROP TABLE
RENAME TABLE、TRUNCATE TABLE、CREATE INDEX
获取 AWS RDS for Oracle 的外网访问地址,操作步骤如下:
打开 AWS RDS Console, 进入要迁移实例的 Dashboard 页面,单击 DB Instances。
在数据库实例页面单击需要作为迁移源端的数据库实例,进入该实例的页面。
在该实例的页面中,在 Endpoint 处获取该实例的外网访问地址。
确认该实例的 Public accessibility 为 YES,即允许从公网进行访问。
获取配置迁移任务所需的 Oracle 实例用户名和密码,DTS 需要使用创建该实例时使用的 Master User 和 Master Password。Master User 的用户名可以在该实例页面的 Configuration 选项卡中找到。
为该实例所属的安全组添加从外网进行访问的白名单,操作步骤如下:
在需要作为迁移源端的数据库实例的页面中,点击 VPC security groups,进入该实例所属安全组的页面。
在该实例所属安全组的页面中,选择 Inboud 选项卡,单击 Edit 按钮。
在 Edit Inbound Rules 页面中,单击 Add Rule。
在新增加的规则框中,填入 DTS 源端所在区域的服务器所使用的 IP 地址段。
Type:选择 Oracle RDS
Protocol:保持 TCP
Port Range:根据所选 AWS RDS for Oracle 实例所使用的端口,默认为 1521
Source:Customer,并填入 DTS 所在区域的服务器所使用的 IP 地址段。 DTS 服务器的地址段信息,以及添加区域的原则可以从此文档中获取 数据传输 DTS IP 地址段。
Description:可自定义对这个规则的描述
点击 Save,保存添加的规则
配置源端 AWS RDS for Oracle 实例,操作步骤如下:
使用 Master User 和 Master Password,通过 SQL*Plus 连接到源端 AWS RDS for Oracle 实例。
执行命令,确认源端 AWS RDS for Oracle 实例已经处于归档状态。如果该实例尚处于非归档状态,请首先打开归档。
archive log list;
执行命令,打开 DTS 获取数据变化增量所需的强制日志模式
exec rdsadmin.rdsadmin_util.force_logging(p_enable => true);
执行命令,打开 DTS 获取数据变化增量所需的主键附加日志
begin rdsadmin.rdsadmin_util.alter_supplemental_logging(p_action => 'ADD',p_type => 'PRIMARY KEY');end;/
执行命令,打开 DTS 获取数据变化增量所需的唯一键附加日志
begin rdsadmin.rdsadmin_util.alter_supplemental_logging(p_action => 'ADD',p_type => 'UNIQUE');end;/
执行命令,设置归档日志的保存周期,建议至少保存24个小时
begin rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');end;/
执行命令,提交修改
commit;
创建阿里云 RDS for MySQL 实例迁移目标数据库的账号,具体步骤如下:
迁移任务配置,需要提供 AWS RDS for Oracle 实例数据库及目标阿里云 RDS for MySQL 实例数据库所需的迁移账号。迁移账号所需权限详见上文的 迁移权限要求。
阿里云 RDS for MySQL 迁移账号的创建及授权操作详见 RDS 使用手册。
当上面的所有前置条件都配置完成后,就可以开始迁移任务配置。下面详细介绍下具体的迁移步骤。
进入 数据传输服务 DTS 控制台,单击右上角的创建迁移任务,正式开始任务配置。
源端 AWS RDS for Oracle 数据库实例及目标端阿里云 RDS for MySQL 实例的连接信息配置。
这个步骤主要配置迁移任务名称,源端 AWS RDS for Oracle 数据库实例的连接信息及目标端阿里云 RDS for MySQL 实例的连接信息。其中:
任务名称
DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。
源实例信息
目标实例信息
当配置完连接信息后,单击右下角 授权白名单并进入下一步 进行白名单授权。这个步骤 DTS 会将 DTS 服务器的 IP 地址添加到目标阿里云 RDS for MySQL 实例的白名单中,避免因为 RDS 实例设置了白名单,导致 DTS 服务器连接不上目标 RDS for MySQL 实例导致迁移失败。
迁移对象及迁移类型配置。
迁移类型包括:结构迁移、全量数据迁移、增量数据迁移。默认选择 结构迁移 + 全量数据迁移。
迁移对象,需要选择您要迁移的对象。迁移对象选择的粒度可以为:库、表、列三个粒度。
默认情况下,对象迁移到目标阿里云 RDS for MySQL 实例后,对象名与源端 AWS RDS for Oracle 实例的数据库中一致。如果您迁移的对象在源实例与目标实例上名称不同,那么需要使用 DTS 提供的对象名映射功能,详细使用方式可以参考 库表列映射。
当配置完迁移对象及迁移类型后,即进入任务启动前的预检查步骤。
任务预检查。
在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。
如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。
启动迁移任务。
当预检查通过后,我们可以启动迁移任务,任务启动后,可以到任务列表中查看任务具体的迁移状态及进度。
当任务进入增量数据迁移阶段,任务不会自动停止,且一旦源端 AWS RDS for Oracle 数据库实例有增量写入,增量数据就会自动同步到目标阿里云 RDS for MySQL 实例。增量数据迁移是个动态同步的过程,建议在增量迁移达到无延迟状态时,在目标数据库上进行业务验证。如果验证成功,那么可以停掉迁移任务,将业务切换到目标数据库。
至此,完成从 AWS RDS for Oracle 实例数据库到阿里云 RDS for MySQL 实例的数据迁移任务配置。