当前位置:文档之家› sqlserver到oracle数据无损迁移

sqlserver到oracle数据无损迁移

sqlserver到oracle数据无损迁移编者:liuli10@版本:V1.7最后修订日期:2015-11-21第一章简介1.1数据迁移随着时代发展数据越来越被重视,而很多时候,当系统需要更新换代的时候,升级后系统所是有的数据库与当前系统的数据库并不一致,此时不仅需要数据割接,最重要的是:如何能将老系统中的数据无损的割接到新系统、新数据库中。

因此,结合项目实战经验,针对从windows平台下数据库sqlserver到linux平台下oracle数据库的数据无损迁移进行总结。

1.2数据库简介一般此处会有很多数据库以及出品公司的历史以及发展历程,在编者看来然而并没有什么大用途,百度百科都可以搜索的到,因此本章结束,直接进入实战总结环节。

第二章sqlserver数据导出2.1sqlserver数据导出命令当然不可否认windows为sqlserver提供了强大的图形化平台,导出数据变得只需要点一点就能完成,然而这样的数据导出对于大批量有要求的操作,是极其劳神伤财的,因此,必须要通过命令行进行格式化导出,因此,这里介绍sqlserver 本机数据库导出命令。

2.1.1bcp命令以及参数介绍/liyanmingkong/article/details/6087674/uid-25472509-id-4304562.html/link?url=WV2JJM4JHxR7Qct8rr_-499zPc3aP_7E5rOt5l yEnG_Mj_tE9_-ZN1JPE2Vc2wRpkO8QkNGNLVznDfMgniCOnxXhK5jQppNpZk8 Jo1x8o23为了将文档尽可能精简,bcp命令的参数以及介绍请自行去以上任意网址查询。

或者自行baidu或者google搜索。

2.2实战语句解析实战语句为:bcp"select*from gwbnboss.dbo.ACCOUNT_BUSINESS"queryout "C:\Users\liuli9\Desktop\sqlserverdata_mov\textfile\ACCOUNT_BUSINESS.txt"-c -r"{#$&}"-t"{@#$}"-S"127.0.0.1"-U"数据库用户名"-P"密码"最终导出的结果存在于C:\Users\liuli9\Desktop\sqlserverdata_mov\textfile\ACCOUNT_BUSINESS.txt 文件中,当出现“{#$&}”时表示接下来是下一行数据,出现“{@#$}”时表示接下来是下一列数据。

将查询结果集完整导出,不对数据做任何格式化或者修改操作,保证数据的原生无损。

bcp"sql语句"queryout"绝对路径\导出数据的文件名.txt"-c-r"行终止符,出现该字符,表示一行数据已完整"-t"列终止符,表示列终止出现时,列数据已完整"-S"可以是ip可以使可以被解析的地址"-U"数据库用户名"-P"密码"2.3实战分析在不指定行分隔符时,默认导出时的行终止符是回车符,然而从实战中的出来的经验是:无法保证客户所提供的数据中有奇葩数据,数据中存在回车符,如果一旦出现回车符,那么将会使导出的数据在导入时,出现错误,数据完整无损无法被保证。

因此行列分隔符一定要单独以极特殊字符进行指定,并在导入时进行指定。

最大限度保证数据的完整无损。

第三章oracle数据导入3.1导入须知一般在使用oracle数据库时会使用linux或者solaris进行搭建,而此时跨平台的数据文件传输,以及文件内容格式的完整不变,成为一个需要考虑的点,但是由于在数据导出时进行特殊字符指定行列分割,因此在这里出现数据乱码或者回车符不兼容的可能性被降到了最低。

导入使用sqlldr命令,具体参数以及使用方法请自行查询学习。

此为oracle 自带工具。

3.2导入3.2.1导入准备以及导入【1】在做数据导入之前,首先要将sqlserver中表的表结构进行转换到oracle,方法有两种:1、通过手动建表。

2、通过工具进行转换。

不管哪一种方法,需要注意的是:【2】在表创建完成之后需要对表结构进行一定的扩张改造:1、所有表字段中的最大长度,修改到尽可能长,因为你无法确定客户在第一次到第二次数据给你的期间有没有对表结构进行过调整。

因此给数据一个足够大的桶。

2、去除所有约束条件,如果手动建表可以在建表之初将所有限制条件去掉,因为你无法确定客户的数据是在加了限制条件前加入还是之后,并且有一些特殊字符在不通编码格式下也许会被认为成一致,因此,保证数据无损统一,去除所有约束条件。

3、分析源表,有一些可能为空的字段,分析是否需要对其进行数据初始化,进行初始化函数的编写,因为你无法确定老系统给出的数据可以为空的字段在新系统中是否可以无影响,【这一步并非必须但如果要做一定需要割接组同事参与】【3】导入主机oracle客户端安装并配置tnsnames,并配置环境变量1、理论上是要求所有命令在使用时不需要进行绝对路径的添加的,因此对于PATH以及相关环境变量需要进行配置。

2、由于在导入语句中为保证导入不出错需要对连接串进行指定解析,因此客户端的tnsnames需要进行配置。

【4】在导出、建表、表改造、环境配置准备完成之后,需要进行ctl文件生成,此处不做赘述,具体编写规则请自行查询学习,此处只针对实战中的ctl进行分析(ACCOUNT_BUSINESS.ctl):OPTIONS(skip=0,rows=300000)LOAD DATAinfile ACCOUNT_BUSINESS.txt"str'{#$&}'"TRUNCATEINTO TABLE ACCOUNT_BUSINESSFields terminated by'{@#$}'trailing nullcols(RECORDID"to_number(:RECORDID)",SUBBOOK CHAR(1000),SUBCLASS CHAR(1000),RECORDTIME"is_date(substr(:RECORDTIME,1,19),'yyyy-mm-dd hh24:mi:ss')",RECORDTYPE"to_number(:RECORDTYPE)",MONEY"to_number(:MONEY)",MONEYTYPE CHAR(1000),RECORDDESC CHAR(1000),XID CHAR(1000),NOTE CHAR(4000),RECORDPOINT CHAR(1000),RECORDPERSON CHAR(1000),AUDITING_LEVEL"to_number(:AUDITING_LEVEL)",AUDITINGXID CHAR(1000),BUSINESSDATE"is_date(substr(:BUSINESSDATE,1,19),'yyyy-mm-dd hh24:mi:ss')",ACCOUNTDATE"is_date(substr(:ACCOUNTDATE,1,19),'yyyy-mm-dd hh24:mi:ss')",OPLOG CHAR(4000),XIDBAK CHAR(1000),UPDATETIME"is_date(substr(:UPDATETIME,1,19),'yyyy-mm-dd hh24:mi:ss')")从ctl文件中可以看到:1、对于时间类需要初始化,并格式化,不管其传过来的数据是否完整、是否为空,为空的不可以进行格式化在自写函数is_date中进行判断并赋值。

2、对于数字类列需要进行to_number,不会影响数据,但是为了将string的数据专为number进行存储,数据不会被影响。

3、Char类型数据,不论数据长度为多少,将列容器调大之后在导入时将长度调到最大,保证不会漏或者错读数据。

4、文件最前头需要对数据文件、行列分割、导入前动作、行数、导入到那个表提交等进行参数设定,本ctl文件中的参数经过匹配已经将参数调节的比较优化,从最初版本导入需要两个小时变成了导入需要20分钟。

【5】导入,在准备好了数据、表、控制文件以及环境之后,最终需要使用导入语句进行将这些进行串接,命令为sqlldr,有很多参数,但并不进行一一讲解,只讲实战操作以及注意事项。

sqlldr userid=要导入的用户名/密码@连接串解析名control=ACCOUNT_BUSINESS.ctl direct=true此语句中的direct参数需要说明一下,此参数的值应该是true或者false而并非y或者n,给错值,此参数并不会生效。

此参数为控制文件中的rows提交行数参数是否生效的凭证。

如果给错或者不给,rows参数不会生效,即:数据全部读取完成之后一起进行commit。

生效时,每当rows条提交一次,后者效率更高。

另外:表中有clob字段时该参数不生效并且在导入语句执行时会进行提示,导入时间会因此较长,并且其中没有日志打出,一定要耐心等待。

【6】数据校验数据无损迁移的工作到此结束,为了确保导出结果无误,要进行数据检验检测。

首先要在执行目录下查看是否存在.bad文件,此文件记录导入失败的数据,如果出现此文件证明有数据导入出错。

其次需要让数据的使用者,一般是割接组进行数据基础校验,因为他们对于老系统的数据十分熟悉,数据也是他们使用所以更为专业化。

第四章后话本文旨在将从sqlserver数据迁移到oracle的一些工作经验进行总结,其中所使用到的数据以及语句已经将敏感信息屏蔽,也将一些基础类的学习分到了自学上,使得文档可以更加的精短有力,突出重点。

在项目中真实实践的结果是成功的,总迁移的数据量初步估算突破一亿条,出错数量仅为初期调优时测试的几十条,后续实际生产数据迁移时错误率为0,因此将此方法进行总结成文,希望可以对以后的工作学习有所帮助,如果不妥还请指正。

相关主题