新旧项目升级下的数据库数据迁移问题

发布时间:2024-12-20 14:07

使用Airtable进行项目数据库管理 #生活技巧# #工作学习技巧# #项目管理工具#

新旧项目升级下的数据库数据迁移问题

qq_27233977 已于 2023-04-10 16:24:54 修改

于 2023-04-10 16:20:29 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

提示:源码地址:https://gitee.com/yzq010/data_sync.git

文章目录 前言一、场景重现二、使用步骤1. 先看效果2. 实现步骤:2.1 配置如下2.2 代码目录2.3 代码原理详解 三、问答式解惑总结

前言

本文背景:
老项目的重构改造往往会涉及到数据库表结构的变动,当数据迁移时,由于旧数据库表结构与新数据库库表结构不一致, 单纯的依靠各类工具无法再迁移数据。
需要代码完成新老数据的处理转换,才能完成数据库数据迁移
需要简化开发人员开发难度,使普通开发人员的工作集中在新老数据的转换上。

提示:以下是本篇文章正文内容,下面案例可供参考

一、场景重现

假设老项目A有一张表 t_integral 积分表 类似下图
在这里插入图片描述

新项目B改造后的积分表 t_integral 如下图:
在这里插入图片描述

可以看到项目升级前后积分表因为业务升级产生了变化,两个比较明显的地方是:新项目按照积分类型规范了原来的表结构;另一个不同点老项目的创建时间是时间戳,而新项目的创建时间是datetime。

当新项目想把老项目的数据迁移过来时,发现表结构变化,不能借助navicat数据传输等类似功能完成数据迁移,这个时候就不得不借助代码来完成数据迁移,本文所介绍的开源代码就是在此背景下产生的。

二、使用步骤

1. 先看效果

原来的数据:
在这里插入图片描述
转换后的数据:

在这里插入图片描述

2. 实现步骤:

2.1 配置如下

spring: datasource: dynamic: primary: master_1 #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 hikari: min-idle: 10 max-pool-size: 100 connection-timeout: 100000 datasource: # 新项目 master_1: url: jdbc:mysql://127.0.0.1:3306/write?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username: user password: pwd driverClassName: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 #旧项目 master_2: url: jdbc:mysql://127.0.0.1:3306/read?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username: user password: pwd # 视情况选择合适的数据库驱动 driverClassName: com.mysql.jdbc.Driver # 其他库 # master_3: # url: jdbc:mysql://127.0.0.1:3306/other-datebase?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 # username: user # password: pwd # driverClassName: com.mysql.jdbc.Driver # oracle1: # url: jdbc:oracle:thin:@127.0.0.1:1521:orcl # username: user # password: pwd # driverClassName: oracle.jdbc.driver.OracleDriver redis: host: 127.0.0.1 port: 6379 database: 10 ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" xxl: job: admin: addresses: http://127.0.0.1:6767/xxl-job-admin ### xxl-job, access token accessToken: default_token ### xxl-job executor appname executor: appname: datebase-sync ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null address: ### xxl-job executor server-info ip: port: 7777 ### xxl-job executor log-path logpath: /data/applogs/xxl-job/jobhandler ### xxl-job executor log-retention-days logretentiondays: 30 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 2.2 代码目录

按照开发习惯,分别为新旧表创建service\mapper\entity,同时在service里创建translationservice,这个类就是完成数据装换和提供定时任务入口的类,稍后会详解,这个类是核心:

在这里插入图片描述

2.3 代码原理详解

控制这个项目模板类CommonService

template()方法:
(1) 获取分页
PageInfo pageInfo = getPageInfo();
这个方法是需要子类实现的,分页数、每页条数等信息视数据库表而定;但是必须先读redis里分页信息,如果没有,说明数据转换没有开始,去数据库获取数据信息,填充到redis;
(2)读取到分页信息,记入redis(不管是从redis读取到的,还是从数据库读取数据量再计入redis,这个步骤就是检查redis数据);
(3)根据获取到的分页信息取旧的表里取数据;
(4) 数据转换和存储;
translate(T t);
(5)检查数据是否同步完成,如果完成,redis的PageInfo里将currentpageNum=pageNum+1,表示这个表已经完成所有数据转换了,即使定时任务还在运行,也不会有任何数据处理了;

translationservice转换类
这个接口的实现类要实现模板的分步操作,提供适合当前表的数据处理,同时提供一个方法给定时任务,以调用模板流程,这里采用的思路是适配器模式,参考代码示例可以很容易看出来;

定时任务
采用xxl-job控制流程,也就是translationservice提供的适配方法;可以参看TestJob类;

三、问答式解惑

为什么使用redis?
答: redis可以有效记录数据转换分页信息,设想一下:如果由于数据问题或者某些异常导致只完成了一部分数据转换,总不能从头再重新来过吧,redis存的的分页信息记录了出现问题的分页,可以有效排查问题数据,处理完后定时任务会接着从这个分页继续处理。,利用redismanager看一下redis信息,可以看到哪些表完成了,,哪些表出问题了。为什么分页?
答:几百万数据,你敢一个事务处理吗?为什么用xxl-job?
答:每个表都是一个定时任务,随时停止随时启动,借助xxl-job的管理页面,可以更快分析问题;自己随便写个数据转换存储的代码不也能实现,为什么要用这个框架?
答: 每个开发人员都要从数据获取到数据存储自己写,五花八门的谁来分析问题?当采用这个框架,所有开发都可以专注于数据差异的处理,规范易排错;还有一个重要的地方,当项目升级的时候可不是一两个表结构变动,不管是项目管理人员还是技术管理人员都很难给数据迁移留出时间,尤其还需要代码去实现转换的表。不用mysql,数据库用其他的,这个框架可以用吗?
答:可以,oracle也行、mongodb也可以,重点是思路,这个模板流程控制的是数据处理,不是数据库连接,可以灵活选择。

总结

项目不在于有多花里胡哨,而在于有效。

源码地址:https://gitee.com/yzq010/data_sync.git

如果对你有帮助,还请点亮git的小星星,感谢!

网址:新旧项目升级下的数据库数据迁移问题 https://www.yuejiaxmz.com/news/view/526209

相关内容

DM达梦数据库的使用以及数据迁移工具的使用
达梦数据库
云原生 DaaS 服务:实现数据驱动的创新和价值(数据库、缓存、大数据等)
UniApp开发中的数据库操作指南 (uniapp 数据库)
Sqoop 数据迁移工具
Oracle数据库数据安全面面观
换机指南:如何将旧手机的数据迁移到新手机上?如何防止旧手机泄露隐私?
如何高效整理数据库
第二单元 项目四 认识智能停车场中的数据处理——体验数据处理的方法和工具 教案
食谱、菜谱大全数据库(数据集)

随便看看