本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
数据传输服务DTS(Data Transmission Service)支持在不影响业务正常运行的情况下,将部署在本地、ECS或其他云上的MySQL数据库迁移至RDS MySQL实例。DTS支持库表结构迁移、全量迁移以及增量迁移,同时使用这三种迁移类型可以实现在自建应用不停服的情况下,平滑地完成自建MySQL数据库的迁移上云。
前提条件
自建MySQL(源库)数据库版本需为MySQL 5.1、5.5、5.6、5.7、8.0。
目标RDS实例的可用存储空间需大于自建MySQL数据库中已使用的存储空间。
迁移方案概述
DTS提供以下三种迁移类型,在自建数据库迁移至RDS MySQL时,建议您同时配置结构、全量和增量迁移,实现自建应用在不停机的情况下平滑迁移上云。
库表结构迁移:迁移库表结构、视图、触发器、存储过程和函数。
全量迁移:迁移源库中的存量数据。
增量迁移:在全量迁移的基础上,将源库的增量数据迁移到目标库中。
常见迁移方案
迁移方案 | 业务中断时间 | 数据一致性 | 费用 | 适用场景 |
结构+全量+增量迁移(推荐) | 不停机(业务不中断) | 无论迁移期间是否有数据写入,迁移完成后(增量迁移无延迟)数据一致。 | 收费 | 生产环境迁移,要求不停机或停机时间最短。 |
结构+全量迁移 | 较长(需等待全量迁移完成) |
| 免费 | 能容忍长时间停机的业务或测试环境。 |
计费说明
使用DTS将自建MySQL迁移至RDS MySQL时,库表结构迁移、全量迁移和公网流量均免费,以下内容收费:
增量迁移:当配置迁移任务时选择了增量迁移,则在增量迁移正常运行期间计费(库表结构迁移和全量迁移运行期间、增量迁移暂停或失败期间均不收费)。
数据校验:当配置迁移任务时选择了数据校验,可能会产生数据校验费用。
注意事项
主键限制:所有待迁移的表必须包含主键或唯一约束,且约束内的字段值具有唯一性,否则可能导致目标库出现数据重复。
DDL限制:在库表结构迁移和全量迁移阶段,请勿执行DDL操作(如库表结构变更),否则数据迁移任务会失败。
DML限制:如果仅执行全量迁移任务(无增量迁移),请勿向源实例中写入新的数据,否则会导致源端和目标端数据不一致。
表数量限制:若迁移对象为表级别且需编辑列名映射,单次任务最多支持1000张表。超出此限制时提交任务会报错,请拆分为多个子任务。
字符集限制:若待迁移的数据中包含四字节存储的内容(例如生僻字、表情等信息),则目标端接收数据的数据库和表必须使用
utf8mb4
字符集。若您使用DTS迁移库表结构,则还需将目标库中实例级别的参数character_set_server
设置为utf8mb4
。账号迁移限制:如需将源库账号迁移至目标库,还需满足额外的账号迁移条件和注意事项。
主备切换限制:如果源库有主备结构且在迁移时发生了主备切换,则会导致迁移失败。
MySQL 8.0隐藏列限制:若源库为MySQL 8.0.23及以上版本,且数据包含不可见的隐藏列(包括无主键表自动生成的隐藏主键),必须先将其设置为可见 (
ALTER TABLE ... ALTER COLUMN ... SET VISIBLE;
),否则会导致数据丢失。不支持迁移以下内容:
使用注释语法定义的解析器(Parser)。
不记录Binlog的操作(如物理备份恢复、外键级联)所产生的数据。
阶段一:准备工作
授权DTS访问云资源
使用阿里云账号(主账号)访问快速授权页面,单击确认授权。
在执行完授权操作后,如果页面出现提示
EntityAlreadyExists.Role
和EntityAlreadyExists.Role.Policy
,则表明当前阿里云账号已授予DTS访问云资源的权限,您可以继续完成后续准备工作。
创建数据库账号并授权
使用DTS进行数据迁移时,源库账号和目标库账号必须具备如下权限:
数据库账号 | 库表结构迁移 | 全量迁移 | 增量迁移 |
自建MySQL账号 | SELECT权限 |
| |
RDS MySQL账号 | 读写权限 |
您可以使用已有数据库账号(需具备相关权限)完成迁移任务,也可以通过以下方式分别在源库和目标库创建并授权用于迁移的数据库账号:
自建MySQL账号
-- 创建迁移专用账号(dts_user和Your_Password123需修改为您自己的数据库账号和密码)
CREATE USER 'dts_user'@'%' IDENTIFIED BY 'Your_Password123';
-- 授予SELECT权限(用于结构迁移、全量迁移)
GRANT SELECT ON *.* TO 'dts_user'@'%';
-- 授权增量迁移所需额外权限
GRANT REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW ON *.* TO 'dts_user'@'%';
-- 允许DTS创建心跳表,用于推进Binlog位点,监控增量同步延迟
GRANT CREATE ON *.* TO 'dts_user'@'%';
FLUSH PRIVILEGES;
RDS MySQL账号
建议使用RDS MySQL高权限账号,您可以通过如下方式创建:
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击账号管理,然后单击创建账号。
账号类型选择高权限账号,其他参数(如账号名称和密码)按控制台要求填写。
确认源库接入方式并添加白名单
您需要根据自建MySQL数据库类型选择合适的接入方式。同时,若您的自建数据库只允许与特定IP地址建立连接,您需要将DTS服务器的IP地址段加入到相应数据库的安全设置(防火墙、白名单、安全组等)中,以允许DTS服务器的访问。
自建数据库类型 | 推荐接入方式 | 白名单与配置 |
本地自建数据库 (有公网地址) | 公网IP | 需手动添加DTS服务器的IP地址段。 |
本地自建数据库 (无公网地址) |
|
|
ECS自建数据库 | ECS自建数据库 | 系统自动添加DTS服务IP地址段。 |
RDS MySQL(目标库)实例的接入方式为云实例,系统会自动添加DTS服务IP地址段进RDS实例白名单中,无需您手动配置。
(如需增量迁移)配置源库Binlog
如果您需要使用增量迁移,源库Binlog需完成以下配置并重启MySQL使配置生效:
源库需开启本地Binlog日志,且Binlog日志需保留7天及以上。
源库
binlog_format
参数需设置为row
,binlog_row_image
参数需设置为full
。如果自建MySQL是双主集群(两者互为主从),为保障DTS能获取全部的Binlog日志,您需开启参数
log_slave_updates
。
您可以通过以下命令配置源库Binlog:
Linux命令
使用
vim
命令,修改配置文件my.cnf中的如下参数。log_bin=mysql_bin binlog_format=row # MySQL 8.0以下版本通过expire_logs_days设置binlog保存时长,默认为0(永不过期) # MySQL 8.0以上版本通过binlog_expire_logs_seconds设置binlog保存时长,默认为2592000秒(30天) # 如果您修改过MySQL中Binlog保留时长且小于7天,可以通过以下参数重新设置Binlog保存时长为7天及以上 # expire_logs_days=7 # binlog_expire_logs_seconds=604800 # 建议设置为大于1的整数 server_id=2 # 当自建MySQL的版本大于5.6时,则必须设置该项。 binlog_row_image=full # 当自建数据库为双主集群时,需打开此参数 # log_slave_updates=ON
修改完成后,重启MySQL进程。
/etc/init.d/mysqld restart
Windows命令
修改配置文件my.ini中的如下参数。
log_bin=mysql_bin binlog_format=row # MySQL 8.0以下版本通过expire_logs_days设置binlog保存时长,默认为0(永不过期) # MySQL 8.0以上版本通过binlog_expire_logs_seconds设置binlog保存时长,默认为2592000秒(30天) # 如果您修改过MySQL中Binlog保留时长且小于7天,可以通过以下参数重新设置Binlog保存时长为7天及以上 # expire_logs_days=7 # binlog_expire_logs_seconds=604800 # 建议设置为大于1的整数 server_id=2 # 当自建MySQL的版本大于5.6时,则必须设置该项。 binlog_row_image=full # 当自建数据库为双主集群时,需打开此参数 # log_slave_updates=ON
修改完成后,重启MySQL服务。 您可以通过Windows中的服务管理器重启服务,或使用如下命令重启服务:
net stop mysql net start mysql
阶段二:配置迁移任务
登录数据传输服务DTS控制台,在左侧导航栏选择数据迁移,然后单击创建任务。
配置源库及目标库信息
源库配置
配置项
说明
数据库类型
选择MySQL。
接入方式
选择准备工作中确认的源库接入方式,本文以本地自建数据库(有公网地址)为例,对应接入方式为公网IP。
实例地区
选择源MySQL数据库所属地域。如果源库地域不在可选地域范围内,就近选择即可。
域名或IP地址
填入源库外网地址或IP。如源库地址具有公共DNS可解析的域名,推荐优先以域名方式接入。
端口
填入源库的服务端口(需开放至公网),默认为3306。
数据库账号
填入准备工作中新建的账号或符合权限要求的已有账号。
数据库密码
填入该数据库账号对应的密码。
连接方式
请根据实际情况选择非加密连接或SSL安全连接。
若自建MySQL未开启SSL加密,请选择非加密连接。
若自建MySQL已开启SSL加密,请选择SSL安全连接。同时,您还需要上传CA 证书并填写CA 密钥。
目标库配置
配置项
说明
数据库类型
选择MySQL。
接入方式
选择云实例。
实例地区
选择RDS MySQL实例所在地域。
是否跨阿里云账号
选择不跨账号。
RDS实例ID
选择目标RDS MySQL实例ID。
数据库账号
填入RDS MySQL实例的数据库账号,推荐使用高权限账号。
数据库密码
填入该数据库账号对应的密码。
连接方式
根据数据库实际情况选择非加密连接或SSL安全连接。如果设置为SSL安全连接,您需要提前开启RDS MySQL实例的SSL加密功能,详情请参见使用云端证书快速开启SSL链路加密。
测试源库与目标库连接
在页面下方单击测试连接以进行下一步,并在弹出的DTS服务器访问授权对话框单击测试连接。若测试不通过,请根据错误提示检查网络、账号或权限配置。
配置任务对象
您需要依次完成以下对象配置、高级配置和数据校验配置内容。
对象配置
在对象配置页面中,您可以参考下表描述,结合业务实际情况配置迁移类型、待迁移的库表、触发器和事件迁移、目标库大小写策略及已存在表的处理模式等内容。在配置完成后,单击下一步高级配置。
配置
说明
迁移类型
如果只需要进行全量迁移,建议同时选中库表结构迁移和全量迁移。
如果需要进行不停机迁移,建议同时选中库表结构迁移、全量迁移和增量迁移。
说明若未选中库表结构迁移,请确保目标库中存在接收数据的数据库和表,并根据实际情况,在已选择对象框中使用库表列名映射功能。
若未选中增量迁移,为保障数据一致性,数据迁移期间请勿在源实例中写入新的数据。
源库触发器迁移方式
请根据实际情况选择迁移触发器的方式,若您待迁移的对象不涉及触发器,则无需配置。更多信息,请参见配置同步或迁移触发器的方式。
说明仅当迁移类型同时选择了库表结构迁移和增量迁移时才可以配置。
开启迁移评估
评估源库和目标库的结构(如索引长度、存储过程、依赖的表等)是否满足要求,您可以根据实际情况选择是或者否。
说明仅当迁移类型选择了库表结构迁移时才可以配置。
若选择是,则可能会增加预检查时间。您可以在预检查阶段查看评估结果,评估结果不影响预检查结果。
目标已存在表的处理模式
预检查并报错拦截:检查目标数据库中是否有同名的表。如果目标数据库中没有同名的表,则通过该检查项目;如果目标数据库中有同名的表,则在预检查阶段提示错误,数据迁移任务不会被启动。
说明如果目标库中同名的表不方便删除或重命名,您可以更改该表在目标库中的名称,请参见库表列名映射。
忽略报错并继续执行:跳过目标数据库中是否有同名表的检查项。
警告选择为忽略报错并继续执行,可能导致数据不一致,给业务带来风险,例如:
表结构一致的情况下,在目标库遇到与源库主键的值相同的记录:
全量期间,DTS会保留目标集群中的该条记录,即源库中的该条记录不会迁移至目标数据库中。
增量期间,DTS不会保留目标集群中的该条记录,即源库中的该条记录会覆盖至目标数据库中。
表结构不一致的情况下,可能导致只能迁移部分列的数据或迁移失败,请谨慎操作。
是否迁移 Event
请根据实际情况选择是否迁移源库中的事件(Event)。若您选择是,则还需遵循相关要求并进行后续操作。更多信息,请参见同步或迁移事件。
目标库对象名称大小写策略
您可以配置目标实例中迁移对象的库名、表名和列名的英文大小写策略。默认情况下选择DTS默认策略,您也可以选择与源库、目标库默认策略保持一致。更多信息,请参见目标库对象名称大小写策略。
源库对象
在源库对象框中选择待迁移对象,然后单击
将其移动至已选择对象框。
说明迁移对象选择的粒度为库、表、列。若选择的迁移对象为表或列,其他对象(如视图、触发器、存储过程)不会被迁移至目标库。
已选择对象
如需更改单个迁移对象在目标实例中的名称,请右击已选择对象中的迁移对象,设置方式,请参见库表列名单个映射。
如需批量更改迁移对象在目标实例中的名称,请单击已选择对象方框右上方的批量编辑,设置方式,请参见库表列名批量映射。
说明如果使用了对象名映射功能,可能会导致依赖这个对象的其他对象迁移失败。
如需设置WHERE条件过滤数据,请在已选择对象中右击待迁移的表,在弹出的对话框中设置过滤条件。设置方法请参见设置过滤条件。
如需按库或表级别选择迁移的SQL操作,请在已选择对象中右击待迁移对象,并在弹出的对话框中选择所需迁移的SQL操作。
高级配置(可选)
高级配置是基于正常DTS迁移任务上的微调(如断连重试时间、迁移速率限制、监控告警等)及特殊情况的处理(如DTS专属集群、源表Online DDL工具执行过程的临时表)。如无以下高级配置需求,可不修改此页面,保持默认值,单击下一步数据校验。
配置
说明
选择调度该任务的专属集群
DTS默认将任务调度到共享集群上,您无需选择。若您希望任务更加稳定,可以购买专属集群来运行DTS迁移任务。
复制源表Online DDL工具执行过程的临时表到目标库
若源库使用数据管理DMS(Data Management)或gh-ost执行Online DDL变更,您可以选择是否迁移Online DDL变更产生的临时表数据。
重要DTS任务暂不支持使用pt-online-schema-change等类似工具执行Online DDL变更,否则会导致DTS任务失败。
是:迁移Online DDL变更产生的临时表数据。
说明Online DDL变更产生的临时表数据过大,可能会导致迁移任务延迟。
否,适配DMS Online DDL:不迁移Online DDL变更产生的临时表数据,只迁移源库使用数据管理DMS(Data Management)执行的原始DDL语句。
说明该方案会导致目标库锁表。
否,适配gh-ost:不迁移Online DDL变更产生的临时表数据,只迁移源库使用gh-ost执行的原始DDL语句,同时您可以使用默认的或者自行配置gh-ost影子表和无用表的正则表达式。
说明该方案会导致目标库锁表。
是否迁移账号
请根据实际情况选择是否迁移源库的账号信息。若您选择迁移是,还需要选择待迁移的账号并确认账号权限。
源库、目标库无法连接后的重试时间
在迁移任务启动后,若源库或目标库连接失败则DTS会报错,并会立即进行持续的重试连接,默认重试720分钟,您也可以在取值范围(10~1440分钟)内自定义重试时间,建议设置30分钟以上。如果DTS在设置的时间内重新连接上源、目标库,迁移任务将自动恢复。否则,迁移任务将失败。
说明针对同源或者同目标的多个DTS实例,网络重试时间以后创建任务的设置为准。
由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
源库、目标库出现其他问题后的重试时间
在迁移任务启动后,若源库或目标库出现非连接性的其他问题(如DDL或DML执行异常),则DTS会报错并会立即进行持续的重试操作,默认持续重试时间为10分钟,您也可以在取值范围(1~1440分钟)内自定义重试时间,建议设置10分钟以上。如果DTS在设置的重试时间内相关操作执行成功,迁移任务将自动恢复。否则,迁移任务将会失败。
重要源库、目标库出现其他问题后的重试时间的值需要小于源库、目标库无法连接后的重试时间的值。
是否限制全量迁移速率
在全量迁移阶段,DTS将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。您可以根据实际情况,选择是否对全量迁移任务进行限速设置(设置每秒查询源库的速率QPS、每秒全量迁移的行数RPS和每秒全量迁移的数据量(MB)BPS),以缓解目标库的压力。
说明仅当迁移类型选择了全量迁移,才有此配置项。
您也可以在迁移实例运行后,调整全量迁移的速率。
是否限制增量迁移速率
您也可以根据实际情况,选择是否对增量迁移任务进行限速设置(设置每秒增量迁移的行数RPS和每秒增量迁移的数据量(MB)BPS),以缓解目标库的压力。
说明仅当迁移类型选择了增量迁移,才有此配置项。
您也可以在迁移实例运行后,调整增量迁移的速率。
环境标签
您可以根据实际情况,选择用于标识实例的环境标签。本示例无需选择。
是否去除正反向任务的心跳表sql
根据业务需求选择是否在DTS实例运行时,在源库中写入心跳SQL信息。
是:不在源库中写入心跳SQL信息,DTS实例可能会显示有延迟。
否:在源库中写入心跳SQL信息,可能会影响源库的物理备份和克隆等功能。
配置ETL功能
监控告警
根据业务需求选择是否设置告警并接收告警通知。
不设置:不设置告警。
设置:设置告警。您还需要设置告警阈值和告警联系人,当迁移失败或延迟超过阈值后,系统将进行告警通知。
数据校验(可选)
数据校验用于监控源库与目标库数据差异,支持在不停服的情况下对源库和目标库进行校验,帮助您及时发现数据和结构不一致的问题。数据校验类型分为以下三类:
数据校验方式
费用
说明
全量校验
收费
对全量任务中需要校验的数据进行校验。
增量校验
对增量任务的数据进行校验。
结构校验
免费
对需要校验的对象进行结构校验。
如需使用数据校验功能,可以在配置迁移任务时配置数据校验,也可以在迁移任务完成后单独配置数据校验任务。如无需数据校验,可直接进行后续步骤。
阶段三:预检查与启动
在完成阶段二的配置后,单击下一步保存任务并预检查。DTS将检查源库和目标库的环境、权限、配置等是否满足迁移要求。
等待预检查完成。
预检查通过率显示为100%:则说明环境已准备就绪,可以进行后续购买和启动。
预检查失败或出现不可忽略的警告:请单击失败检查项后的查看详情,并根据提示修复后重新进行预检查。
出现可忽略的警告项:请仔细阅读警告内容,确认无相关风险后(如数据不一致等问题)可选择忽略。
预检查完全通过后,单击下一步购买。
选择资源组配置(默认为default resource group)和合适的链路规格(规格越高,迁移速度越快)。
阅读并选中《数据传输(按量付费)服务条款》,单击购买并启动,并在弹出的确认对话框,单击确定,任务将自动开始执行。
阶段四:数据验证与业务切换
等待DTS迁移任务完成
未包含增量迁移的任务:在全量迁移完成后自动结束,任务运行状态变为已完成。
包含增量迁移的任务:任务不会自动结束,增量迁移会持续进行(任务运行状态为运行中)。当增量迁移显示无延迟时,表示源库与目标库数据一致,可以进行数据验证。
数据验证
当迁移任务结束或增量迁移无延迟(低延迟)时,可以进行源库和目标库的数据验证:
自动校验:在DTS中配置数据校验任务,自动对比源库和目标库的数据。
手动抽样校验:您可以从多种维度手动校验数据(如对比源库和目标库的表行数、核心业务数据等),抽样验证数据一致性。以下为示例代码:
-- 示例1:在源库和目标库分别执行,对比表行数 SELECT COUNT(*) FROM your_table; -- 示例2:在源库和目标库分别执行,对比关键业务指标,如某时间段内的订单总金额 SELECT SUM(amount) FROM orders WHERE create_time >= '2024-01-01';
业务切换
数据验证完成后,建议您选择业务低峰期,将应用服务内的自建数据库连接地址修改为RDS MySQL实例的连接地址,完成业务切换。如果DTS迁移任务中包含增量迁移,请在切换完成后及时释放该任务,避免迁移任务持续计费。
附录1:迁移类型说明
迁移类型 | 说明 |
库表结构迁移 | 将源库中待迁移对象的结构定义迁移到目标库:
|
全量迁移 | 将源库中待迁移对象的存量数据,全部迁移到目标库中。 |
增量迁移 | 在全量迁移的基础上,将源库的增量更新数据迁移到目标库中。通过增量数据迁移可以实现在自建应用不停机的情况下,平滑地完成数据迁移。 |
附录2:增量迁移时支持的SQL操作
操作类型 | SQL操作语句 |
DML | INSERT、UPDATE、DELETE |
DDL |
|
常见问题
Q1:测试连接报错“JDBC: [conn_error, cause: null, message from server: "Host 'XXX' is not allowed to connect to this MySQL server"]; PING: []; TELNET: []; requestId=[XXX]”
该报错为JDBC异常,请您检查JDBC的账号、密码及权限问题,或使用高权限账号测试连接。
Q2:创建迁移任务,为什么无法选择福州地域的RDS实例?
目前DTS不支持福州地域的实例。您可以将MySQL 5.7、8.0自建数据库备份上云。