(1)从数据库类型上看,源数据库为古老的SyBase,可参考的经验有限;目标数据库为Oracle;
(2)从系统划分上看,源数据库隶属于系统A,目标数据库隶属于系统B,两系统相互隔离;
(3)从数据内容上看,源数据库和目标数据库的表结构不同,数据需加工后方可进行迁移。
第一步是源数据的导出。Sybase是一种关系型数据库系统,虽然没有oracle、db2名气响,但是国内许多大企业都使用它,尤其是金融企业。
SyBase数据导出,我们首先想到的是BCP,BCP命令可以高效地将SyBase中的数据文件按照用户制定的格式导出(实测生产环境最高可达15W条/秒),首先配置SyBase环境变量,然后找到sql.ini文件,指定ServerName、IP和端口号:
完成环境变量的配置,在执行BCP命令之前,我们先将数据导入到一个新建的视图中,避免直接影响生产数据库的读写。
测试环境造了3000w条数据,走起:
差不多18分钟过后,3000w数据全部导出,生成data.txt文件,大概3.85G。下一步就是看如何将这3000w的数据导入系统B了。由于系统B对数据内容有定制化要求,并且要将这3000w数据分别导入两个不同结构的表中。于是先通过sqlldr脚本,将3.85G的数据文件导入新建的oracle表,这个表跟A系统源数据库的表结构一模一样,同时额外增加了索引(源数据库的索引无法满足数据处理要求),它存在的目的是为了按照系统B的要求对数据进行再加工。
接下来,sqlldr开始,考虑到性能,我们选择每30000条数据提交一次、每2G内存占满提交一次。
sqlldr的效率简直是惊人的快,3.85G的文件,用了不到一首歌的时间,就全部成功导入。接下来,就轮到navicat自带的【数据传输】功能出场了。
其实本来不打算用这个,原计划是将数据按照要求插入到系统A两张新建的oracle表中,然后通过sqlldr导出,再导入系统B的目标数据库。但是意外发现了navicat的数据传输功能可以进行跨系统的数据传输,前提是需要保证系统A的数据表和系统B的数据表数据结构和字段名称必须完全一致,如下图所示:
这个的效率必然没有sqlldr那么高,但是它最大的特点就是操作简单,安全可靠。为了安全,牺牲点性能也是没问题的,考虑到这批数据导过去并不是直接面客,所以时间紧迫性不高。
测试环境导数据大概花了四个小时,两张表,总计6000w的数据。不过这里还是有一些坑:navicat的数据传输功能,会将系统A源数据库的表结构、字段长度和索引覆盖掉系统B目标数据库。因此,在源数据库新建这两张表时,必须保证结构与目标数据库一致!
最后感谢yf同学和yj同学提供技术支持