1:业务背景
第三方系统提供了一张oracle视图,该视图有六千多万条数据,后续每月会产生三百万条数据的数据。需要每天将数据定时同步到自己系统的mysql表中。
(注:我们系统与外界系统访问都要经过一个中间系统的跳转才行。流程如下: 我们系统A发起请求 ----> 进入网关系统跳转 --->获得第三方oracle的数据)。
2:解决思路
2.1:通过数据库管理软件先把历史数据导出为excel表格数据
2.2:通过代码层面采用odbc驱动进行每天的数据同步。
3:该方案遇见的问题
3.1:历史的数据处理中oracle与mysql通过sql导入导出不兼容。
解决方法:将数据导出为excel格式,然后通过excel导入数据到mysql)
3.2:新增大量数据通过代码每天同步时会不会导致内存溢出。
解决方法:采用分批同步数据来保证服务器内存不会溢出,先获取新增的数据总量,然后通过手动分页进行控制每次同步的数据量。
3.3:数据同步过程中会不会出现重复同步以及遗漏同步。
解决方法:应对重复数据可以采用给mysql表创建一个唯一索引来进行限制重复数据。应对遗漏的数据可以手写一个预留接口通过传递日期来进行随时同步遗漏数据的日期。也可以采用定时任务每天多次调用接口同步数据提高数据的准确性(因为有唯一索引所以多次同步 不会导致数据重复,但会消耗服务器资源)。
4:详细实现步骤
4.1导出历史数据
先通过数据库管理软件把oracle的数据全部查询出来。然后点击软件“导出结果”--->导出当前的结果。
此处我选择的导出数据为csv格式,该格式进行大数据处理相对速度要快一点。导出oracle历史数据后,把csv文件导入到mysql的数据表中。此时历史数据就解决了。
4.2:每天新增的几百万数据处理
1:通过定时任务注解@Scheduled实现自动调用同步接口。
2:通过http方法来同步调用网关系统获取第三方数据保证每次调用都是同步实现。
3:网关系统通过oracle.jdbc.driver.OracleDriver驱动远程调用第三方oracle数据。
4:同步数据时,先调用oracle来获取当天需要新增的数据总量,然后通过for循环+分页来批量同步数据防止内存溢出。同步过程出现异常可采取手动补救措施进行二次同步。或采用多次定时任务来保证数据准确性减少人为干预次数。
5:数据同步时,由于mysql对处理大数据量有瓶颈,所以建表时需要慎重考虑每个字段的存储类型来减少存储空间,对查询需求建立合理的索引来保证查询速度。
如何建立正确的索引可参考我的另一篇博客:
https://blog.csdn.net/wang5701071/article/details/108797859
此时oracle数据表定时同步到mysql表已经实现。但后续还引发了一些思考。
5:后续思考
1:目前数据量已经有近七千万条数据,按每月三百万的数据来处理。一年时间就将达到上亿的数据量,而mysql的单表数据到一亿就达到了处理瓶颈。所以该方案后续可能还要采用分表处理。按月或者按年来进行分表存储。
2:历史数据中如果出现了修改,此时该方案只能感知到未同步的数据,而无法感知已同步过的历史数据的变动。所以该方案并不适合历史数据频繁修改的场景。