数据库迁移方法
数据库迁移按实现分几类:停机导出导入、逻辑复制(binlog / CDC 增量同步)、物理备份恢复、应用双写切换。选型由三个约束共同决定——数据量、可接受的停机窗口,以及对一致性的要求;同一项目里不同库也常常用不同方法。
基本信息
| 导出导入 | 实现最简单,停机窗口与数据量成正比 |
|---|---|
| 逻辑复制 | 全量 + 增量 CDC,割接只停一小段时间 |
| 物理备份恢复 | 同版本大库搬得快,跨版本通常不适用 |
| 双写切换 | 需要应用改造,切换代价最小 |
| 一致性校验 | 行数、校验值与业务对账三件套 |
| 回退手段 | 切换后源库保留只读一段时间,问题出现可切回 |
方法对比
| 方法 | 停机窗口 | 适用与代价 |
|---|---|---|
| 导出导入 | 与数据量成正比 | 中小库、可停机业务;大库耗时超窗口 |
| 逻辑复制 | 割接时间段 | 持续变更的生产库;需盯住复制延迟 |
| 物理备份恢复 | 恢复耗时窗口 | 同版本大库快速搬迁;跨版本不适用 |
| 双写切换 | 切换瞬间 | 改造余地大的核心系统;要定义以哪边为准 |
| 版本约束 | 视方法而定 | 跨大版本迁移需先确认兼容性 |
典型使用场景
- 中小库、可安排停机窗口:直接导出导入最省事
- 生产库持续写入、窗口只有几分钟:用逻辑复制做增量
- 同版本大库整体搬迁:物理备份恢复更快
- 核心系统有改造能力:双写加灰度切换风险最小
- 跨云或异构数据库:用厂商的数据传输服务做全量加增量
导出导入的基础命令
导出导入的基础命令
mysqldump --single-transaction --routines --triggers \
--set-gtid-purged=OFF mydb > mydb.sql # 一致性快照导出,尽量选低峰执行
mysql -h <目标> -u user -p mydb < mydb.sql # 导入到目标库
mysqldump --single-transaction --databases a b --result-file=dump.sql # 一次导出多个库
mysqladmin -h <目标> status # 导入后看写入与连接是否正常
# 增量阶段用 binlog 或 CDC 工具追平,切换前核对延迟与位点--single-transaction 只对支持事务的引擎(如 InnoDB)给出一致性快照,非事务引擎仍会锁表;导出期间应避免长事务与 DDL,否则快照点会被拖后。
逻辑复制最关键的动作是盯延迟:增量追不平就不要切。切换完成后保留源库只读一段时间作为回退通道,别在切换当天就回收源库。