数据库 频道

谈一谈古老的数据迁移问题

上周有人问我如果要从DB2迁移到Oracle怎么做能快点?首先必须承认银行中还是有DB2的,这个数据库也不错。但是现在可能没什么声音了。找工作有Oracle的岗位、MySQL的岗位、PG的岗位,然而几乎没怎么听到招聘DB2的岗位。以至于没人说去DB2(因为本来也没占领太多的市场)没办法遇到了还是要处理。

几年前有过一些迁移或者导入的教训。有的开发人员使用PLSQL工具在里面贴EXCEL的(如果是在数据库同网段操作可能1秒处理完毕,但是跨网段开发反馈执行了快一个小时还没成功)。也有人在PLSQL的command中执行@文件路径的办法,同样由于是跨网段。一个1G的SQL文件,执行了3个小时没有完成。

数据导入的教训是不要跨网络(数据库和导入的文件跨网络执行)。一般都是本地导入或者同网段导入。导入时候注意操作系统和数据库的字符集问题。

以上是为今天说的这个古老迁移做铺垫。为什么说是古老的数据迁移。因为首先DB2的使用者少,其次我考虑到异构数据库的迁移,最好的方式可能就是导出一种每个数据库都支持的数据格式导入。一般来说只有TXT或者CSV这种格式是各个数据库都通用的。所以说信息化最大的障碍就是excel。

于是就建议实施人员使用SQLLOAD去做,不想实施人员遇到了各种各样的问题,无法导入。这个是基本的数据导入功能。在Oracle和MySQL的OCP中都有涉及,不过的确多年不做这个了,像从网上找个案例,居然在国内的网站上几乎找不到一个完整的示例。只能自己做了,其实这个功能不难,但是还真的没有找到较好的博客。

首先在Oracle数据库上创建一个待导入的表:create table imptable (id int,a int,name varchar2(20),b number(10,4),time date);这个表包括了数值型,字符型,时间类型。这个导入的关键是数据类型的处理。

其次编辑一个init.ctl文件,这个是初始化的ctl。第一行是关键字 load data。第二行是待加载文件的绝对路径。第三行是指明insert的初始化动作。第四行是数据与数据的分隔符。当然最后一行也是最关键的,要与表的列一一对应,尤其可以看到时间类型的处理不一样。

然后再次编辑一个continue.ctl文件,这个是追加数据。这个文件和上述文件区别就在第三行,从insert变成了append。

最后从最终的实验看:8每秒导入10万行。这是在一个虚拟机的环境下做。每秒也有1万多的数据。正式环境的效果应该远好于这个。

其实MySQL的做法比Oracle简单。因为没有时间的特殊处理。但是就是这样的简单的Oracle处理导入,居然没有太好的参考,写在这个供大家参考吧。

0
相关文章