本文主要讲述如何将Sybase数据库的数据迁移至Oracle中,因为我对Sybase不熟悉,所有本文讲述的只是完成Sybase数据表中的数据迁移到Oracle的一个过程
一、Sybase以及Oracle数据库配置
1、连接Sybase数据库
1.1、首先安装Sybase数据库以及Sybase数据库的可视化工具DBArtisan8.6.1
1.2、到Sybase数据库安装路径中(我的安装路径是:C:\SAP)找到ini文件夹下的sql.ini配置文件
(我的路径位置是 C:\SAP\ini),这个文件的功能就是配置数据库的数据源(包含数据库的主机地址
,端口,以及服务器名称
[dev](服务器名) |
1.3、使用DBArtisan连接Sybase数据库:Datasource->Register Datasource,在弹出的窗口中
1.3.1、选择Sybase Adaptive Serve,下一步
1.3.2、填入数据源的主机地址以及ip端口
1.3.3、填入用户名以及密码,然后测试连接,如果连接通过,那就点击下一步
1.3.4、然后点击完成,配置数据源就成功了
1.4、上面的步骤完成后,可视化工具会显示刚才自己配的数据源,双击,填写用户名和密码,登录
2、连接Oracle数据库(不作详述)
二、将Sybase数据库中的数据导出到txt文件中
2.1、在Sybase可视化工具DBArtisan打开sql编辑窗口,执行下列语句:
set nocount on use emulator(数据库名) go select 'bcp emulator.dbo(所有者).' + name + ' out d:\temp\' + name + '.txt -Sdev(dev为数据库服务器名) -Ucontrol(control为用户名) -Pcontrol(control为密码) -t"!|"(表示每个字段数据用!|分隔) -r"\n" -c' from sysobjects where type='U' go |
这个语句的作用就是生成所有表的bcp导出命令,这个bcp命令就是用来导出表的数据到txt文件中
2.2、执行上面的语句后,会生成如下结果:
上面的bcp命令的意思就是:将emulator这个数据库中的account、relation、banker等表中的数据导出到
d:\temp\XX.txt文件中
-S:表示数据库所在的服务器名,在上面的sql.ini文件有配置;
-U:表示数据库的用户名
-P:表示数据库用户密码
-t"!|":表示在导出数据的时候,每个字段都用!|分隔开
2.3、创建一个.bat文件,并将上面的bcp命令都复制到bat文件中,然后双击执行这个bat批命令,没有报错后,就
可以在d:\temp这个目录下导出数据了
三、将txt文件中的数据导入到Oracle中:
下面以导入relationt表为例:
3.1、打开Sybase可视化工具DBArtisan,选中relation表,然后点击Extract
这个步骤的作用就是查看relation表结构:
3.2、Oracle建表
因为Sybase的数据类型datetime和Oracle的数据类型不一样,Oracle的类型是date,所以不能直接将txt直接
导入到Oracle中,首先需要在Oracle建立临时表,并且临时表所有的时间类型都用varchar表示:
Oracle临时表: Oracle正式表: |
在Oracle执行上面建表语句
3.3、生成ctl脚本:
Oracle有一个叫sqlldr的工具,可以用来将txt数据导入到数据表中,建立一个后缀名为ctl的脚本,脚本命名
为relation.ctl。将以下内容写进脚本中:
load data infile 'D:\temp\relation.txt'(Sybase导出的txt数据) append into table relation1(表示将txt的数据导入到relationX1表中) fields terminated by "!|" (读取txt数据时,以!|终止,每一个!|分隔的数据就表示一个字段的数据) OPTIONALLY ENCLOSED BY '"' trailing nullcols(表示允许字段数据为null)(下面对应relation表的字段名称) ( fundacc, mnytype, banker, bankacc "nvl(:bankacc,' ')",(读取txt文件时,如果该字段数据为null,那么给一个空格作为默认值,因为有些表设计的时候,字段不能为null,所以给一个空格) acctype "nvl(:acctype,' ')", openmode "nvl(:openmode,' ')", b_branch "nvl(:b_branch,' ')", b_deptid "nvl(:b_deptid,' ')", userid "nvl(:userid,' ')", status, settime1, updatetime1 ) |
3.4、编写sqlldr命令,并放到命令行执行:
sqlldr test/[email protected]:1521/goldpre control=D:\relation.ctl log=D:\SybaseToOracle_Log\relation.log |
test/[email protected]:1521/goldpre 是Oracle数据源,127.0.0.1:1521是数据源主机地址以及端口,goldpre是
数据源服务器名
D:\relation.ctl表示ctl脚本的位置;
log=D:\SybaseToOracle_Log\relation.log:执行ctl后生成的日志文件
上面命令执行后,查看日志文件,没报错的话,就继续下面步骤
3.5、将临时表的数据转换迁移到正式表中
下面这条sql是将临时表relation1的数据复制插入到正式表relation中 insert into relation select fundacc,mnytype,banker,bankacc,acctype,openmode,b_branch,b_deptid,userid,status,to_date(substr(settime1,1,length(settime1)-6)||substr(settime1,length(settime1)-1,2),'Mon DD YYYY HH:MI:SSPM','NLS_DATE_LANGUAGE = American') settime,to_date(substr(updatetime1,1,length(updatetime1)-6)||substr(updatetime1,length(updatetime1)-1,2),'Mon DD YYYY HH:MI:SSPM','NLS_DATE_LANGUAGE = American') updatetime from relation1
下面这段函数就是讲varchar类型的日期数据(Dec 14 2004 7:26:23:390PM)转换成date类型的数据
删除临时表: drop table relation1; purge table relation1; |
最后使用select * from relation,查看表中数据是否有问题,到此表数据由Sybase迁移到Oracle就完成了
四、结束语:
因为本人对Sybase不熟悉,所以以上工作仅限Sybase表中数据迁移,不设计存储过程等其他的,如有问题欢迎大家指点
改进。