问题描述
现有ORACLE数据库里的A表,数据量20亿,无修改权限,主要字段有:
- 省份ID
- 物资类型
- 更新日期
- 其他字段若干
现在需要数据移植到新数据库的B表,B表数据模型与A表差异巨大,需要A表数据进行复杂计算处理才能入B表。
计划开发移植程序,基于JAVA技术栈。
每次移植都按照省份ID和物资类型进行移植。
单省份+单物资类型数据量从10w到2000w不等。
各位大佬,怎样才能较快速的完成移植?(单省份+单物资类型在6个小时内处理完毕)
补充1:JDBC流式读取应该可以解决数据量太大OOM的问题。
但是还有个问题,一旦处理过程异常,比如线程挂了,甚至进程挂了。怎么能做到断点续处理:)
问题:是否需要考虑线上迁移还是离线迁移,就是迁移的过程中需要考虑线上业务吗?
如果不考虑线上业务,可以考虑多线程处理:
1.先统计m个省份,n个物资类型
2.如果n>m,则可以考虑循环n次,每个循环中间开启m个线程.就是每个线程处理单省份+单物资类型.
3.单个线程内部,每次读取省份+物资类型过滤数据,单次读取500条(数据条数可以调整).循环处理这一批数据,然后批量写入B表. 如果可以,可以考虑把b表的索引全部去掉,提升b表的写入速度.如果遇到异常数据,需要记录下数据的ID,最后对异常数据做统一处理
4.迁移完成之后再给b表添加索引.
其中步骤3可以添加机器,比如说5台机器,每台机器处理固定的省份,处理完之后下掉机器就行了.
处理方案的瓶颈在于对A表数据进行复杂计算的效率(1秒1条还是1秒100条),如果效率跟的上,整体效率应该可以满足迁移要求(平均 单省份+单物资类型的处理时间小于6小时).
如果可以通过备份A表到A1,然后拥有A1的修改权限,可以考虑sql搞定迁移.