数据库迁移实践

1: 背景

公司之前有一个非常老的系统,需要进行重构,包括代码的重构,还有数据库的迁移,目前难点就是在于数据库的数据迁移了,因为当前app一直有用户使用的,如果停机的话,会严重影响用户体验,停机方案是直接被否决的,本次使用的是不停机的数据库迁移。

2:迁移的方案

不停机的数据库迁移方案,主要包括以下步骤

1: 先利用myqsldump文件,把之前的数据全部迁移过来

2: 通过update_time字段,把迁移过程中的新增的数据迁移过来

3: 开启双写, 先写源表数据,再写目标表数据

4:数据库的增量数据的对比和校验,以源表为准

5: 稳定一段时间后,切换写数据顺序,先写目标表,再写源表

6:数据库的增量数据的对比和校验,以目标表为准

7: 稳定一段时间后,读写完全用目标表,源表下线,完成迁移

3: 迁移的问题

3.1: 怎么提高mysqldump的导入数据?

1:设置写binlog的参数为0,即每次提交数据不写binlog, 等系统自己刷新binlog

2: 设置写redlog的参数为0, 即每次提交数据不写redlog, 等系统自己刷新redlog

3.2: 双写怎么实现?

1: 第一种方案,在每一处调用update和insert的地方,加上双写逻辑,这样的实现方式最简单,但是怕改漏

2: 第二种方案,Aop方案,在表的写逻辑处使用AOP,AOP内部的逻辑就是双写,改造的范围小,不怕漏

3.3: 如果源表写入成功,但是写目标表失败呢?

没有关系,后续有检验增量定时任务,会补全的,这种当初设计的时候,也是新增了日志告警,可以及时发现写入目标表失败的细节,后面人工注意观察

3.4: 目标表的主键怎么设计的?

目标表主键是同步源表的,先写源表,写入成功了,源表会返回主键,后续写目标表的直接用该主键就可以了,这样可以防止数据不一致的问题

3.5: 定时任务检验增量数据是怎么做的?

1:第一种方案是最简单的,我们表有update_time字段,通过update_time查询出某一段时间的数据,去对比源表和目标表关键性字段,如果不一致就更新。

2:第二种方案,也是我们采用的方案,通过消费源表的binlog,当源表binlog是写数据的时候,我们会通过binlog的信息查询源表和目标表数据,进行对比。

3.6: 对比数据是查询从库还是主库?

为了缓解主库的压力,其实我们查询的是从库,但是从库可能会有主库延迟的问题,所以当查询源表和目标数据不一致的时候,我们才再去查主库,其实不一致的情况不多,这样就能解决主库压力过大的问题。

相关推荐
weixin1997010801639 分钟前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
自己的九又四分之三站台2 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vueOA工程项目管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
爱上妖精的尾巴3 小时前
7-3 WPS JS宏 keys、values、entries、JSON.stringify 循环对象中的属性
后端·restful·wps·jsa
JIngJaneIL4 小时前
基于java+ vue学生成绩管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
LucianaiB5 小时前
历史十大帝王拉到一个群聊会发生什么事?朱元璋直接开喷
后端
苏三的开发日记6 小时前
flink集群服务搭建
后端
程序帝国6 小时前
SpringBoot整合RediSearch(完整,详细,连接池版本)
java·spring boot·redis·后端·redisearch
源码获取_wx:Fegn08956 小时前
基于springboot + vueOA工程项目管理系统
java·vue.js·spring boot·后端·spring
小哀26 小时前
2025年总结: 我还在往前走
前端·后端·全栈