惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
F
Fortinet All Blogs
I
InfoQ
Jina AI
Jina AI
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
B
Blog RSS Feed
C
Check Point Blog
Y
Y Combinator Blog
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
Engineering at Meta
Engineering at Meta
G
Google Developers Blog

博客园 - 五岳

JDK中使用的设计模式 Java的List.sort()排序方法源码理解 Cloud Agent 开发笔记(4):Skill 与 MCP 集成、项目后记 Cloud Agent 开发笔记(3):Web 交互与数据持久化 Cloud Agent 开发笔记(2):Agent 引擎与 Tool 体系 Cloud Agent 开发笔记(1):V1从跑通到放弃 单点登录系统思维导图与资料收集 阿里云DTS按业务场景批量迁移RDS MySQL表实战(下):迁移管理平台设计与实现 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析 Web层接口通用鉴权注解实践(基于JDK8) Feign框架中一处编码不合理导致的异常 解决Dify的Ollama插件添加模型时保存成功但模型为空的问题 深入研究使用DozerMapper复制List<Ojbect>前后元素类型不一致的问题 mybatis-config的mapUnderscoreToCamelCase配置生效方式和基本原理 封装CompletionService的并发任务分发器(优化版) 深入理解Mybatis分库分表执行原理 写代码被大语言模型坑之使用LocalDateTime比较两个时间差了几天 系统设计:消灭慢接口 使用LinkedList实现队列和栈 Collectors.toMap的暗坑与避免方式 如丝般顺滑:DDD再实践之类目树管理 阿里云数仓Dataworks数据导出到文件step by step DDD实践反思 LeetCode组合总和I~IV和背包问题小结 Akka学习笔记
阿里云DTS按业务场景批量迁移RDS MySQL表实战(上):技术选...
五岳 · 2026-02-02 · via 博客园 - 五岳

背景

概况

公司某项业务使用三个分库存放该业务的分表。为了保持单表的查询性能,基于业务场景按照公司维度分表,目前每个库都有数量达到10W级的分表。过多的表已经影响了日常的运维,元数据相关的操作如搜索表名等在线操作速度极慢。随着业务的发展,分表数量还会增加。

现状

  • Springboot+阿里云RDS-MySQL8

  • 分库分表中间件:MybatisPlus+ShardingSphereDataSource

  • 分库方式,创建公司时使用公司id%3计算schemaId,创建完成后不变,各分表均有这一列

  • 分表方式,有三种,对应三种分表后缀:

    • 公司维度,table_companyId

    • 公司+年份维度,table_company_year

    • 业务id维度,table_bizId,bizId在前置业务处理时生成,一般一个公司一年只有一个bizId

  • 每个公司大概有15~50张分表,它们的结构不完全相同,但是对于前缀相同的表结构是相同的,比如table1_company_2024和table1_company_2025,或者table2_655和table2_656。

  • 不同的分表可能会做join查询

预期

申请更多的分库,将现有的表迁移至新的分库中,降低原有库的表数量。

迁移方案选型

纯Java实现

如果业务简单、数据量不多,只需要做一部分表的迁移,使用jdbc逐表复制创建对应的新表、复制数据,是完全够用的。但是在当前的业务场景下:

  • 至少有20种不同结构的分表,针对每种结构写对应的迁移代码,工作量不小

  • 难以维护:当分表结构发生调整、增加新的结构的分表时,迁移代码也需要修改,也就是说,其他项目引入的变更,还要来修改迁移的代码

  • 开发者要自己控制迁移过程,比如大数据量的分片迁移、迁移过程中的失败重试等

阿里云DTS

既然这部分业务跑在阿里云RDS上,使用现成的DTS中间件是更好的选择。虽然有一定的学习成本,但是它有两个明显优势:

  • 阿里云RDS内部通过DTS做数据迁移是不收费的:计费概述

  • 数据迁移,只要指定好源库、目标库、待迁移的表,DTS会自动创建新表结构和数据同步,并确保迁移高可用与数据准确性

在做了简单的调研(包括写一个简单的DTS数据迁移demo)、确认DTS可以满足迁库表的需求后,我选择了DTS的,通过接入DTS API完成库表迁移。

确认迁移场景满足DTS限制

源库的注意事项及限制

目标库的注意事项及限制

DTS实例的注意事项及限制

(以上三篇文档实际上是同一篇文档不同小结)

DTS准备

如果你也要通过demo的形式做前期验证,也需要先做准备工作。由于我使用的不是阿里云主账号而是RAM账号,这部分准备工作只知道个大概,你可以参考官方文档进行配置。

DTS API对接

SDK安装

我使用的是同步版JavaSDK,同步版和异步版在文档上不区分,应该是通用的。文档:数据传输_SDK中心-阿里云OpenAPI开发者门户

使用API

整个迁移过程可以简化为:

image

此处不贴详细的代码,可以参考官方文档。

官方数据同步demo

DTS SDK新版API同步任务创建示例_数据传输_示例中心-阿里云OpenAPI开发者门户

本例实例type是"SYNC",代表数据同步,我使用的是"MIGRATION",代表数据迁移。除了这个参数,其他参数设置基本一样。

创建实例

CreateDtsInstance_数据传输_API文档-阿里云OpenAPI开发者门户

配置任务

ConfigureDtsJob_数据传输_API文档-阿里云OpenAPI开发者门户

一个实例只能配置一个任务。

TableConfig配置

想要只迁移指定的库表,需要配置TableConfig参数,文档见迁移、同步或订阅对象说明。本次典型的单个DTS数据迁移任务的场景:

  • 单个库到单个库

  • 一次性多张表(建议不超过1000)

  • 配置字符串长度不超过1MB

{
    "待迁移的源库1的名称": {
        "name": "迁移、同步或订阅的库1在目标实例中的名称",
        "all": false(表示迁移、同步或订阅对象为非整库),
        "Table": {
            "待迁移的表A的名称": {
                "name": "迁移、同步或订阅的表A在目标实例中的名称",
                "all": true(表示迁移、同步或订阅对象为整表)
             }
        }
    }
}

Reserve配置

DTS可以通过ETL设置迁移后的表中某些列的值,即将旧的schemaId改成新库对应的值,在任务配置的Reserve参数中增加对应配置如下:

{
        "targetTableMode": "0",
        "etlOperatorCtl": "Y",
        "etlOperatorSetting": "e_set(schemaId, '%d', schema_id,'%d')"
}

ETL用法:在DTS迁移或同步任务中配置ETL

Reserve参数用法:Reserve参数说明

先购买后配置时autoStartModulesAfterConfig默认auto, 配置完任务会立即启动。

暂停DTS任务

SuspendDtsJob_数据传输_API文档-阿里云OpenAPI开发者门户

结束DTS任务

StopDtsJob_数据传输_API文档-阿里云OpenAPI开发者门户

查询单个DTS任务详情

DescribeDtsJobDetail_数据传输_API文档-阿里云OpenAPI开发者门户

补充工作

除了通过DTS迁移表本身外,还有一些工作需要关注:

  • 归档是阿里云RDS的一大功能。如果源表是归档的,迁移后的目标表也应该是归档的。如何判定表是否归档及变更归档状态参考数据归档功能

  • DTS的日志需要关注,如果有失败,任务本身不会停止。你也可以校验迁移前后表个数、各表数据量是否一致来判断迁移是否完全成功。

  • 重试迁移前,前次迁移创建的表需要手动删除

  • 校验源表、新表的字段、表名的大小写是否发生了改变。测试阶段确认一次即可。

在下一篇文章中,我会详细介绍迁移功能模块的设计和实现:阿里云DTS按业务场景批量迁移RDS MySQL表实战(下):迁移管理平台设计与实现