首先我们需要知道一个基本的数据迁移的方案:
- 创建一个目标表
- 使用源表的数据去初始化目标表
- 执行一次校验, 此时使用源表数据去修复目标表数据
- 双写, 业务开启双写, 读写源表, 写目标表
- 开启增量校验和数据修复, 保持一段时间
- 切换双写顺序, 此时读写目标表, 数据以目标表为准
- 继续保持增量校验
1. 首先创建一个目标表:
CREATE TABLE target_table LIKE source_table; -- 复制表结构
ALTER TABLE target_table ADD COLUMN new_column VARCHAR(255); -- 可选扩展
2. 数据迁移
将原来的表的数据给迁移过去, 这一步我们可以借助 mysqldump 这种工具, 直接把数据迁移过去, 下面一部就是执行一次校验。
mysqldump -h source_host db source_table | mysql -h target_host db target_table
3. 数据校验
第一次校验的方式主要有两种,
- 第一种就是全量校验, 全量校验主要指的是, 详细的对比两个表的字段时候想等, 如果不相等那么我们就要判断它的不一致的位置, 然后进行修复
- 第二种方式就是增量校验, 增量校验主要指的是按照 uptime 这个字段, 来修复, 主要指的是如果时间晚于导出数据的那个时间点, 那么我们就更新对应的数据
开启双写:
这个东西, 主要利用一些工具, 比如 gorm 的 conn pool 这种工具, 利用这种装饰器模式封装两个数据源, 每次执行语句的时候, 根据标记位来执行对应的双写逻辑。
if flag == "双写以源表为准" {
// 执行相关操作
}
if flag == "双写以目标表为准" {
// 执行写操作
}
双写校验+ 增量校验: 也就是一边进行双写, 然后一边进行增量校验, 主要还是根据对应的 uptime 来做这个件事情
双写+目标表+ 原表, 之所以这样干的目的就是可以当出错的时候, 我们可以立刻去回滚对应的数据