数码工坊
白蓝主题五 · 清爽阅读
首页  > 数据备份

数据库迁移同步部署实战经验分享

迁移不是搬家,而是系统升级

公司换了新办公楼,不会把每张桌子、每把椅子原封不动搬过去,而是重新规划布局,让新环境更高效。数据迁移也一样,不是简单复制粘贴,而是一次结构优化和性能提升的机会。

为什么需要迁移同步部署

比如你原本用的是 MySQL 5.7,跑在本地服务器上,随着业务增长,响应开始变慢。这时候想迁到云上的 MySQL 8.0,还能自动扩容。但问题来了:数据不能丢,服务不能停太久,新旧系统还得保持一致。

这就需要用到“同步部署”——在迁移过程中,新库持续从旧库拉取变更,等数据追平了,再一键切换流量。用户几乎感觉不到中断。

常见的三种同步方式

第一种是基于日志的同步,比如 MySQL 的 binlog。旧库每改一条数据,都会记录操作日志,新库读取这些日志并重放。这种方式实时性强,对性能影响小。

CHANGE MASTER TO MASTER_HOST='old-db-host', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;

第二种是中间件同步,比如用 Maxwell 或 Debezium 捕获变更事件,发到 Kafka,再由消费者写入目标库。适合复杂架构,跨数据库类型也能做。

第三种是应用层双写。在代码里同时写两个库,等新库数据完整后切过去。虽然逻辑复杂些,但在无法访问底层日志时是个备选方案。

部署时的关键检查点

别以为数据一通就万事大吉。字段类型可能不兼容,比如旧库用 TEXT,新库用了 JSON;索引没建全,查询会变慢;自增主键冲突,插入直接报错。

建议上线前做一次全量比对。可以用 pt-table-checksum 这类工具扫描差异,发现问题提前处理。

真实场景:电商大促前的迁移

去年双十一前两周,我们把订单库从 IDC 迁到了阿里云 RDS。采用主从复制 + DTS 同步,先全量导入,再增量追平。切换前半小时停止旧库写入,等同步延迟归零,立刻切 DNS 和连接字符串。

整个过程只停服 4 分钟,用户下单几乎无感。要不是监控报警响了一下,连运维都没察觉已经换库了。

小技巧:别忽略字符集和时区

有一次迁移完发现用户名乱码,查了半天才发现旧库是 latin1,新库默认 utf8mb4。还有一次订单时间差了 8 小时,原来是时区没设成 Asia/Shanghai。这种细节一出问题就是线上事故。

现在我每次迁移都会加一步配置核对清单,包括字符集、时区、sql_mode、外键约束等等,确保两边一致。