龙空技术网

Oracle=>Sqlserver迁移:大数据量表移行时间太长,怎么办?

思忖小下 312

前言:

此时咱们对“oracle数据库计算日期差”大致比较讲究,看官们都需要知道一些“oracle数据库计算日期差”的相关文章。那么小编在网上网罗了一些关于“oracle数据库计算日期差””的相关内容,希望大家能喜欢,我们一起来学习一下吧!

背景:

数据量600多万件,占内存3G多的操作log表,移行需要32H,这个时间我们是无法接受的。

原因:

我分析是oracle和sqlserver之间的数据类型转化占用的大量的时间。

分析:

我们如何能避免类型数据的转化?你如果使用了sqlserver的provider创建dblink来查询,这个无法避免。所以开始考虑,将oracle数据的导出,和sqlserver数据的导入分开处理,中间用文件作为介质。通过bulk insert,将文件导入到sqlserver,这个我们已经验证了,速度很快。那么问题就是在oracle有没有一个能将数据快速导出为文件的工具。答案是有的,那就是sqluldr2。具体的用法就不在这里说了,有不明白的可以给我发信息。我们主要说明解决案。

实现:

环境:sqlserver和oracle是2个服务器,在sqlserver服务器,安装了oracle的客户端,Oracle的provider要有,在sqlserver上执行移行的工具

Oracle的provider

实现流程:

移行实现流程

1.将oracle端的表数据导出到文件exp_LDBTLOGT.txt中

sqluldr.exe user=OracleUser/OraclePass@OracleSID query="SELECT * FROM LDBTLOGT" field=0x09 record=0x0a charset=AL32UTF8 file=E:\YiXing\exp_LDBTLOGT.txt

简单说明sqluldr.exe的语法,有问题联系。

field=0x09按照tab分割各个字段数据,如果你字段中的数据有tab键,就会有问题。它也支持自定义,例如:field='0x09|YYYY|'

record=0x0a 行数据回车,

charset=AL32UTF8 我是日文系统,数据库的字符集是AL32UTF8,字符集需要找特殊数据尝试,例如我遇到TiO₂=>TiO?,字符集不对就会出现这样的问题

2.将导出的文件数据,插入到sqlserver

BULK INSERT V_LDBTLOGT FROM N'E:\YiXing\exp_LDBTLOGT.txt' WITH ( CODEPAGE=65001,ROWTERMINATOR='0x0A')

同样,BULK INSERT的使用也有很多注意的情况,它要和文件格式对应设置。

例如:CODEPAGE=65001,ROWTERMINATOR='0x0A',不同的格式应该加哪些设置,我这边也基本测试了一遍,有需要可以联系

V_LDBTLOGT是一个自己创建的view,而不是表,对于移行的两个表字段不是完全匹配时,可以通过创建一个view,来实现表的自定义移行

3.blob字段的移行

Oracle的blob类型字段移行到sqlserver的varbinary类型。发现通过sqluldr.exe,无法将blob字段的内容保存到文件,所以对于有blob字段的几个表,单独通过DBlink,insert ... select方法移行。这几个表的数据量不大,所以这样移行没有问题。

时间统计

这个表移行,整体用了不要3个小时,大幅度的缩减了。工具整体移行4个多小时就搞定了。基本上和oracle往oracle移行的时间差不多。执行时间问题基本就解决了。

反思

通过我们上面的实践,可以得出结论,Oracle往Sqlserver移行,时间太长的原因就是数据类型转化占用的大量的时间。

整个解决案,有几个瑕疵,首先sqlserver端要安装oracle客户端,其次使用sqluldr.exe,blob字段数据无法保存到文件。

接下来,我们要实现,sqlserver上不需要安装oracle客户端也可以正常移行。oracle端导出文件=》拷贝到sqlserver=》sqlerver端文件插入。那么使用了dblink的blob关联表的移行,首先就需要解决。blob数据如何保存成文件,如何更新到sqlserver呢,敬请期待吧。

标签: #oracle数据库计算日期差