db2 导入数据_一次使用bcp和sqlldr的数据迁移实践

eb9fb5929a5f921405480e551e27cda3.png

近期由于系统升级改造,需要做一次数据迁移,整体背景如下:

(1)从数据库类型上看,源数据库为古老的SyBase,可参考的经验有限;目标数据库为Oracle;

(2)从系统划分上看,源数据库隶属于系统A,目标数据库隶属于系统B,两系统相互隔离;

(3)从数据内容上看,源数据库和目标数据库的表结构不同,数据需加工后方可进行迁移。

5b2ba766a4413e457826059c29a83dd1.png

第一步是源数据的导出。Sybase是一种关系型数据库系统,虽然没有oracle、db2名气响,但是国内许多大企业都使用它,尤其是金融企业。

SyBase数据导出,我们首先想到的是BCP,BCP命令可以高效地将SyBase中的数据文件按照用户制定的格式导出(实测生产环境最高可达15W条/秒),首先配置SyBase环境变量,然后找到sql.ini文件,指定ServerName、IP和端口号:

e7026bb8517cfb21d6ebd4a0d73aa718.png

完成环境变量的配置,在执行BCP命令之前,我们先将数据导入到一个新建的视图中,避免直接影响生产数据库的读写。

测试环境造了3000w条数据,走起:

9c3457bcd980f460c251bcd7b05aad43.png

差不多18分钟过后,3000w数据全部导出,生成data.txt文件,大概3.85G。下一步就是看如何将这3000w的数据导入系统B了。由于系统B对数据内容有定制化要求,并且要将这3000w数据分别导入两个不同结构的表中。于是先通过sqlldr脚本,将3.85G的数据文件导入新建的oracle表,这个表跟A系统源数据库的表结构一模一样,同时额外增加了索引(源数据库的索引无法满足数据处理要求),它存在的目的是为了按照系统B的要求对数据进行再加工。

接下来,sqlldr开始,考虑到性能,我们选择每30000条数据提交一次、每2G内存占满提交一次。

2dad7fa307fd8bc07261bd765c6984a3.png

sqlldr的效率简直是惊人的快,3.85G的文件,用了不到一首歌的时间,就全部成功导入。接下来,就轮到navicat自带的【数据传输】功能出场了。

其实本来不打算用这个,原计划是将数据按照要求插入到系统A两张新建的oracle表中,然后通过sqlldr导出,再导入系统B的目标数据库。但是意外发现了navicat的数据传输功能可以进行跨系统的数据传输,前提是需要保证系统A的数据表和系统B的数据表数据结构和字段名称必须完全一致,如下图所示:

e8beded7b87866e9c11df0b72c6a2284.png

这个的效率必然没有sqlldr那么高,但是它最大的特点就是操作简单,安全可靠。为了安全,牺牲点性能也是没问题的,考虑到这批数据导过去并不是直接面客,所以时间紧迫性不高。

测试环境导数据大概花了四个小时,两张表,总计6000w的数据。不过这里还是有一些坑:navicat的数据传输功能,会将系统A源数据库的表结构、字段长度和索引覆盖掉系统B目标数据库。因此,在源数据库新建这两张表时,必须保证结构与目标数据库一致!

最后感谢yf同学和yj同学提供技术支持d9a87a08a5abfd67efb8e72938460ca1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值