一、先算账:自建 MySQL 到底在替你省什么、又在替你花什么
很多团队的第一台数据库,都是在一台 ECS 上 yum install mysql-server 装出来的。它跑得挺好,直到某天凌晨三点你被电话叫醒——磁盘满了、主从延迟了、或者干脆连不上了。
自建不是不能用,问题在于你买的其实是"运维责任"。把它的隐性成本摊开看:
| 维度 | 自建 MySQL(ECS 上) | RDS MySQL 托管实例 |
|---|---|---|
| 装机与调参 | 自己选版本、自己改 my.cnf、自己试参数 |
控制台选规格,参数模板内置 |
| 主备与切换 | 自己搭 MHA/MGR,切换靠脚本和运气 | 高可用系列一主一备,秒级自动切换 |
| 备份 | 自己写 crontab 跑 mysqldump,自己传到别处 |
自动备份 + 日志备份,支持按时间点恢复 |
| 恢复演练 | 导出文件能不能还原,没人敢试 | 恢复到临时实例验证后再切回 |
| 磁盘扩容 | 停机改云盘、重建分区、导数据 | 控制台在线扩容(部分场景需短时只读) |
| 安全 | 打补丁、改口令、开防火墙,全靠人盯 | 白名单 + SSL + TDE,内网隔离默认生效 |
| 出问题找谁 | 自己的群里 @ 全体 | 工单 + 专属技术支持 |
| 成本 | 只付 ECS + 云盘 | 有溢价,换来上述全部能力 |
一句话结论:自建的省,省在账单;RDS 的贵,贵在 SLA。你真正要判断的不是"哪个便宜",而是"这台库挂了,业务能停多久"。停得起,自建没问题;停不起,托管该买。
二、托管实例的产品系列:先别急着看价格
RDS MySQL 分三个系列,选错了后面全白搭。官方定位如下:
| 系列 | 架构 | 水平扩展 | 故障切换 | 读写分离 | 数据一致性 | SLA |
|---|---|---|---|---|---|---|
| 基础系列 | 单节点,计算与存储分离 | 不支持 | 不支持 | 不支持 | 弱 | 99.50% |
| 高可用系列 | 一主一备,备节点不可访问 | 备节点不可扩展,可加只读实例 | 自动切换 | 支持 | 强 | 最高 99.99% |
| 集群系列 | 一主一备/一主多备,备节点可访问 | 备节点可扩展至 8 个 | 自动切换 | 支持 | 更强(组复制 RPO=0) | 最高 99.99% |
三条实用判断:
- 基础系列只能用在"错了就重来"的场景——个人学习、公司内部测试、微型网站。它的 SLA 是 99.50%,且不支持只读实例。
- 高可用系列覆盖 80% 以上的生产场景。一主一备跑在双可用区,主实例故障时自动切换,对应用透明。这也是多数中型业务的正解。
- 集群系列是给"读多到扛不住"的业务准备的,它把备份节点直接变成可读节点,不用另外买只读实例集群。
系列只能单向升:基础系列可升高可用/集群系列,高可用可升集群系列。反过来不支持直接降级——想降只能新建实例、迁移数据。所以一开始别为了省钱选基础系列,除非你确定这库一辈子不上生产。
三、迁移路线对比:DTS、mysqldump、备份恢复,怎么选
迁移是最容易出事的一步。三条常见路线:
| 路线 | 停机时间 | 数据一致性 | 费用 | 适用 |
|---|---|---|---|---|
| DTS 结构 + 全量 + 增量 | 接近零 | 迁移完成后一致(迁移期间可继续写) | 增量迁移计费,结构与全量免费 | 生产环境,要求不停服 |
| DTS 结构 + 全量 | 全量迁移耗时 | 源库只读才一致 | 免费 | 测试环境,可接受停机 |
| mysqldump 逻辑导出导入 | 较长(看数据量) | 导出期间需停写 | 免费 | 数据量小、允许长时间停机 |
| 全量备份 → OSS → 恢复 | 长 | 取决于停写窗口 | 有 OSS 存储费 | 数据量大,希望先落地备份再迁移 |
生产环境就用 DTS 三件套,理由是它的增量迁移靠读源库 binlog 持续同步,全量跑完后才开始切换,业务写请求几乎无感。代价是增量迁移按运行时长计费,所以切换完成后要记得手动结束任务——DTS 会自动恢复失败任务,任务没结束就切业务,源库数据可能反过来覆盖目标实例。
用增量迁移前,源库必须满足几个硬条件:
binlog_format = row
binlog_row_image = full
binlog 本地保留 >= 7 天
慢一条都不行。另外待迁移的表必须有主键或唯一约束,否则目标库会出现重复数据;迁移期间不要做 DDL,结构变更会让任务直接失败。
四、迁移实操:DTS 配置的关键步骤
下面是 ECS 自建 MySQL → RDS MySQL 的完整流程。
第 1 步:准备目标实例。 先在 RDS 控制台创建实例,存储空间要大于源库已占用空间,并建好数据库和账号。
第 2 步:源库准备。 建一个迁移专用账号,权限按迁移类型给:
-- 结构迁移 + 全量迁移
GRANT SELECT ON *.* TO 'dts_user'@'%';
-- 增量迁移需要额外权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SHOW VIEW ON *.* TO 'dts_user'@'%';
FLUSH PRIVILEGES;
第 3 步:进 DTS 控制台创建任务。 路径:数据管理 DMS → Data + AI → 数据传输(DTS)→ 数据迁移 → 创建任务。顶部看不到菜单栏时,先退出极简模式。
第 4 步:填源库与目标库信息。 源库接入方式按实际选(ECS 自建 / 有公网 IP 的自建库 / 专线 VPN 接入),目标库选"云实例"并选到具体 RDS 实例 ID。填完点测试连接,两边都通才继续。
第 5 步:选迁移类型。 生产环境三个都勾上——库表结构迁移、全量数据迁移、增量数据迁移。只勾前两个的话,迁移期间源库必须停写。
第 6 步:跑预检查并启动。 预检查不过会给出具体项,修完重新检查。启动前会弹购买配置确认,选链路规格并勾选服务条款。
第 7 步:等增量进入"无延迟"状态后切换。 这是最关键的一步,顺序不能乱:
- 观察任务进度变成"增量迁移"且显示无延迟;
- 停写源库几分钟,等增量再次追上、恢复无延迟;
- 手动结束迁移任务(不结束时 DTS 可能自动恢复任务,反向覆盖目标库);
- 修改应用连接地址,指向 RDS 的内网地址;
- 观察业务,确认无异常后再下掉源库。
五、连接方式:内网、外网与代理地址
RDS 默认提供内网地址和外网地址:
- 内网地址:同一 VPC 下的 ECS 走内网访问,延迟低、无公网流量费。生产环境一律走内网。
- 外网地址:需要手动申请,暴露在公网,必须配合白名单严控来源 IP。除非临时排障,不建议常开。
白名单是访问控制的第一道门。 只有白名单里的 IP 能连上实例。常见误区有两个:一是为了图省事填 0.0.0.0/0,等于把门拆了;二是 ECS 换 IP 后忘了更新白名单,人被自己关在门外。DTS 任务会自动把 DTS 服务的 IP 段加进去,任务结束后应及时回收。
读写分离要靠数据库代理。需要先建只读实例,再开通代理——通用型代理免费,开通大约 1~2 分钟。开通后应用连接代理地址,写请求走主实例、读请求按权重分发到只读实例:
- 读写属性:选"读写(读写分离)"才能接受写请求;选"只读"则完全不能写。
- 延迟阈值:只读实例与主实例的同步延迟超过阈值,它会被自动摘除,避免读到旧数据。范围 0~3600 秒。
- 连接池:业务是短连接、连接数大,选事务级连接池;业务已用 Druid/HikariCP 这类客户端连接池,就关掉代理连接池,避免双重池化。
注意:高可用系列的备节点本身不可访问,必须额外建只读实例才能真正读写分离——这一点和集群系列不同,集群系列的备份节点天然可读。
六、备份与恢复:托管真正值钱的地方
自建的备份是"我写了个脚本,但愿它能用";托管的备份是"我随时可以恢复到任意时间点"。差别在恢复那一刻才体现。
RDS MySQL 的备份分两种:
- 数据备份:默认开启,无法关闭,只能调整频率。云盘实例保留范围 7~730 天,默认 7 天;本地盘实例默认 7 天。备份周期每周至少 2 天,时间建议放在业务低峰期。
- 日志备份:可选,默认开启。开启后本地 Binlog 实时上传,实现按时间点恢复(PITR)。保留天数可设 7~730 天,但不能大于数据备份保留天数。5.7 基础系列固定 7 天,改不了。
两条必须知道的坑:
- 关闭日志备份后,系统会在 1~3 分钟内自动删除已有日志备份集,且不可恢复。 手滑关掉就真没了。
- 自动备份的数据在控制台不能被手动删除(删除按钮是灰的),只能靠调整保留策略等它自动过期。别指望手工清理省存储费。
恢复的正确姿势是:恢复到临时实例验证数据无误,再迁移回主实例。直接往主实例上恢复,等于把生产库当成试验田。
想留长期备份,有两个办法:把保留天数调到 30 天甚至更久(存储费随之上浮);或者设置实例释放后备份保留策略,实例释放后 7 天内免费,超过 7 天按量计费。
七、上云后能省掉的具体工作
清单列一下,都是迁移后不用再干的活:
- 不用再半夜手动拉起挂掉的主库,高可用系列秒级自动切换;
- 不用再写 crontab 备份脚本和异地传输脚本,自动备份 + 跨地域备份是配置项;
- 不用再为"磁盘快满了"停机改分区,云盘支持在线扩容;
- 不用再手动打安全补丁,内核小版本由平台维护;
- 不用再自建慢日志分析平台,SQL 洞察和性能监控在控制台里;
- 不用再自己搭只读实例集群做读写分离,加只读实例 + 开代理即可。
省下来的不是钱,是人。这部分往往比账单差价大得多。
八、避坑清单
- 别用基础系列跑生产:单节点、无自动切换、SLA 只有 99.50%。
- 别忽略主键要求:待迁移表没有主键或唯一约束,目标库会出现重复数据。
- 迁移期间别做 DDL:结构和全量迁移阶段一旦检测到结构变更,任务直接失败。
- 增量迁移必须开对 Binlog:
row+full+ 保留 7 天以上,缺一不可。 - 业务切换前务必结束 DTS 任务:DTS 会自动恢复失败任务,未结束的任务可能反向覆盖目标库。
- 日志备份别随手关:关闭后 1~3 分钟内历史日志备份集自动删除,不可恢复。
- 白名单别写
0.0.0.0/0:等于把数据库暴露给整个公网。 - 生产环境别用外网地址:内网同 VPC 访问延迟更低、也更安全。
- 高可用系列的备节点不能读:想读写分离必须另建只读实例(集群系列才天然可读)。
- 规格、价格与促销随时调整:具体档位与费用以官方页面实时展示为准,下单前再核一遍。
结语
自建迁移到托管,技术上没有想象中复杂,DTS 三个迁移类型组合就能做到近乎不停服。真正要花心思的是三件事:系列选对(别用基础系列上生产)、迁移类型选全(结构 + 全量 + 增量)、切换顺序别乱(停写 → 追平 → 结束任务 → 改连接)。
准备动手前,建议先对着官方页面的实时规格与价格把目标实例的配置和费用确认一遍:云数据库 RDS 产品页。