Sybase数据库迁移数据到Oracle(未改进)

本文主要讲述如何将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](服务器名)
master=TCP,192.168.44.22,4100(数据库主机地址192.168.44.22以及端口4100)
query=TCP,192.168.44.22,4100

                1.3、使用DBArtisan连接Sybase数据库:Datasource->Register Datasource,在弹出的窗口中

                         1.3.1、选择Sybase Adaptive Serve,下一步

                

Sybase数据库迁移数据到Oracle(未改进)_第1张图片 连接Sybase数据库

                     

                        1.3.2、填入数据源的主机地址以及ip端口

Sybase数据库迁移数据到Oracle(未改进)_第2张图片

                        1.3.3、填入用户名以及密码,然后测试连接,如果连接通过,那就点击下一步

                        

Sybase数据库迁移数据到Oracle(未改进)_第3张图片 标题

                       1.3.4、然后点击完成,配置数据源就成功了

                1.4、上面的步骤完成后,可视化工具会显示刚才自己配的数据源,双击,填写用户名和密码,登录

                 

Sybase数据库迁移数据到Oracle(未改进)_第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、执行上面的语句后,会生成如下结果:

     

Sybase数据库迁移数据到Oracle(未改进)_第5张图片 导出数据到txt的bcp命令

       上面的bcp命令的意思就是:将emulator这个数据库中的account、relation、banker等表中的数据导出到

       d:\temp\XX.txt文件中

       -S:表示数据库所在的服务器名,在上面的sql.ini文件有配置;

       -U:表示数据库的用户名

       -P:表示数据库用户密码

       -t"!|":表示在导出数据的时候,每个字段都用!|分隔开

2.3、创建一个.bat文件,并将上面的bcp命令都复制到bat文件中,然后双击执行这个bat批命令,没有报错后,就

         可以在d:\temp这个目录下导出数据了

Sybase数据库迁移数据到Oracle(未改进)_第6张图片 导出数据后生成的txt文件

三、将txt文件中的数据导入到Oracle中:

下面以导入relationt表为例:

3.1、打开Sybase可视化工具DBArtisan,选中relation表,然后点击Extract

Sybase数据库迁移数据到Oracle(未改进)_第7张图片 导出relation表结构

                   这个步骤的作用就是查看relation表结构:

Sybase数据库迁移数据到Oracle(未改进)_第8张图片 relation表结构

3.2、Oracle建表

   因为Sybase的数据类型datetime和Oracle的数据类型不一样,Oracle的类型是date,所以不能直接将txt直接

   导入到Oracle中,首先需要在Oracle建立临时表,并且临时表所有的时间类型都用varchar表示:

Oracle临时表:
CREATE TABLE relation1
(
    fundacc    char(30) NOT NULL,
    mnytype    char(4)  NOT NULL,
    banker     char(8)  NOT NULL,
    bankacc    char(30) NOT NULL,
    acctype    char(4)  NOT NULL,
    openmode   char(2)  NOT NULL,
    b_branch   char(8)  NOT NULL,
    b_deptid   char(8)  NOT NULL,
    userid     char(8)  NOT NULL,
    status     char(2)  NOT NULL,
    settime1    varchar(30) NOT NULL,(时间类型统一用varchar)
    updatetime1 varchar(30) NOT NULL,
    CONSTRAINT pk_relation1
    PRIMARY KEY(fundacc,mnytype,banker,bankacc)
);
commit;

Oracle正式表:
CREATE TABLE relation
(
    fundacc    char(30) NOT NULL,
    mnytype    char(4)  NOT NULL,
    banker     char(8)  NOT NULL,
    bankacc    char(30) NOT NULL,
    acctype    char(4)  NOT NULL,
    openmode   char(2)  NOT NULL,
    b_branch   char(8)  NOT NULL,
    b_deptid   char(8)  NOT NULL,
    userid     char(8)  NOT NULL,
    status     char(2)  NOT NULL,
    settime    date NOT NULL,
    updatetime date NOT NULL,
    CONSTRAINT pk_relation
    PRIMARY KEY(fundacc,mnytype,banker,bankacc)
);
commit;

在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类型的数据
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

 

删除临时表:

drop table relation1;

purge table relation1;

最后使用select * from relation,查看表中数据是否有问题,到此表数据由Sybase迁移到Oracle就完成了

 

四、结束语:

因为本人对Sybase不熟悉,所以以上工作仅限Sybase表中数据迁移,不设计存储过程等其他的,如有问题欢迎大家指点

改进。

 

 

 

 

 

 

你可能感兴趣的:(数据库)