因项目发展需要,原有的数据库不满足业务发展及日益增加的数据量,故决定将informix数据库迁移至oracle;以下为迁移的过程:
背景技术说明:原informix数据库采用的hibernate做为数据持久层框架,新的oracle库将使用mybatis做为数据持久层,另外oracle使数据库使用的是rac架构
1:由于之前的informix数据表存在很多字段设计、字段命名不规范的地方,故先全盘梳理informix所有数据表,使用Power Designer软件,在上面按照新的规范重新建表,并梳理出表的逻辑关联关系,各张表目前的数据量,数据日增长量等
2:新建一个数据库分支,在项目中引入mybatis框架、oracle数据库,简单建张临时表做实验,测试curd是否可行
3:根据新的表结构,在oracle测试库中建表、建索引
4:使用mybatis-generator生成器,自动生成实体类、mapper接口类、mapper.xml等,自己手动建表对应的service接口,实现类
5:先将建完表及mapper文件后的应用跑起来,确保此时应用无问题,此时可将数据库分支合并入开发分支,发一个版本至生产环境运行一段时间
6:将数据表按照重要程度、数据量、关联关系进行划分,分为不同阶段:
6-1:先将一半表进行双写(一边写informix,一边写oracle),先在测试环境运行,然后发到生产环境,运行后,核对双写时期,informix和oracle写入的数据量是否一致,根据实际情况及时调整
try {
vrbtRingService.save(vrbtRing);
}catch (Exception e){
error(e, "oracle:双写:同步铃音失败:ringId:" + ringId, e.getMessage());
}
protected void error(Throwable e, String msg, String... params) {
logger.error("{}{}", msg, getParamStr(params), e);
}
6-2:通过脚本,可将informix测试库的数据同步至oraclece测试库,另外,生产库的数据,计划1千万以下的由脚本同步,千万级以上的数据,由开发人家写规范,由数据库DBA在晚上同步
6-3:双写正常后,先将一张数据量较小且数据变动不大的表的业务操作全部改为oracle实现,在此之前,需将此表数据由informix同步至oracle生产库;经测试环境测试无误后,发一个版本至生产环境验证
6-4:第一张表在生产OK后,再改2-3张小表的业务操作全部指向oracle,经测试环境发生产环境
6-5:以此类推,后面根据不同阶段上不同的表,直至所有表的业务操作全部指向oracle数据库,运行一段时间后,再废弃informix数据库
迁移过程中注意的点:
1:数据表的阶段划分原则:先小后大,先易后难,有关联关系的表应在一个阶段,不可操之过急
2:双写的时候,日志一定要全,将写表的主要信息,异常等打印出来,便于排查问题
3:上一个版本的一定要准备好,随时准备切回去,以保证系统运行正常
4:同步informix数据至oracle可按照两种方式进行:
①:同步双写之前的全部数据,保证总的数据量需一致
②:在应用发布停应用时,将oracle生产库的表数据全部删除,直接同步informix所有的数据至oracle库
5:针对一些大表建表的时候会建好分区,本应用主要是根据时间分区
--创建分区(10天建一个分区)
PARTITION BY RANGE (op_time) INTERVAL (NUMTODSINTERVAL(10, 'DAY'))
(partition p210201 values less than(to_date('2021-03-01', 'yyyy-mm-dd')))
;
在实际中遇到的问题:
1、前期规划的表字段与实际的并不完全一致,建议表字段长度等前期可略微设大一点,后期跟进系统运行情况实际调整
2:双写的时候数据不一致,且日志并未按照log写的打印,可全局搜Error关键字,查找oracle的异常