零. 注意问题

    在导入导出过程中, ORACLE的表名, 列名, 用户名, 密码等要统统大写, 否则出错.
   
    在用DTS时, 依次优先选用Microsoft ODBC for Oracle  /  Oracle Provider for OLE DB  /  Microsoft OLE DB Provider for Oracle 类型的DSN


一.真实环境

源操作系统:linux, IP: 10.*.*.101, sql server 2k ,简称R机

目的操作系统:linux, IP: 10.*.*.202, oracle 10g,简称D机


二.模拟环境

在本地机10.*.*.244 简称L机, 安装sql server 2k 和 oracle 10g.

三.备份,  把R机SQL SERVER导入L机SQL SERVER

在L机安装sql server2k 之后, 打开企业管理器,在SQL SERVER组新建一个SQL SERVER注册, 输入R机IP地址/登录帐号/密码进行注册, 当注册完后登录到R机, 找到要移植的数据表.

右键-->所有任务-->导出数据-->下一步-->选择数据源(用于SQL SERVER的Microsoft OLE DB提供程序)/服务器(默认远程R机)/登录帐号/密码/源数据库

                             下一步-->选择目的(用于SQL SERVER的Microsoft OLE DB提供程序)/服务器local(L机)/使用window身份验证/目的数据库用户帐号/目的
         
                                      数据库用户密码/数据库

                             下一步-->选择用一条指定要传输的数据(只传数据,不传视图)
                             
                             下一步-->输入SELECT * FROM DEPT_TEST;

                             下一步-->勾选"源", 将目的修改成大写的相应表名. 点击"转换"进行细节处理.
                            
                             下一步-->下一步>...完成.
备份完毕.

同时用数据泵expdp把远程D机的oracle导出到L机. 以防不测.

四. 把R机SQL SERVER导入本地L机ORACLE

登录到R机, 找到要移植的数据表.

右键-->所有任务-->导出数据-->下一步-->选择数据源(用于SQL SERVER的Microsoft OLE DB提供程序)/服务器(默认远程R机)/登录帐号/密码/目的数据库

                            
                             下一步-->选择目的(Oracle in OraDb10g_home1)/DNS(无则创建Oracle in OraDb10g_home1, 有则选择)/目的数据库用户帐号/目的

                                      数据库用户密码

                             下一步-->选择用一条指定要传输的数据(只传数据,不传视图)

                             下一步-->输入SELECT * FROM DEPT_TEST;

                             下一步-->勾选"源", 将目的修改成大写的相应表名. 点击"转换"进行细节处理.
                            
                             下一步-->  编辑 SQL(S), 修改表结构, 即把相应字段修改为ORACLE的正确字段类型, 如碰sqlserver的大字段, 默认转为ORACLE的LONG类型, 但实际上要修改成CLOB.

                             下一步>...完成.
                             
结果大失所望, 由于遇到ORACLE的clob类型字段. 因些导入数据失败, 庆幸的是表已创建了.

五. 寻找另外的方法--Excel, Access
   
    有上述同样的方法从R机导入L机, 以Excel, Access方式保存.

    用PL/SQL Develper的ODBC Importer / Toad的Import table data导入, 结果显示导完10W条记录之后, 再查DEPT_TEST数目, 竟然是0.
 
    我快晕了. 好在Toad还比较有良心, 在导到8W条时, 提示出错. 回头查下L机ORACLE的相应表空间, 原来1G空间还不够用呢. 把表空间改为3G. 再导, 一切正常了.


六. 抽取数据
   
    由于D机上已有数据, 并且源数据表与目的数据表为异构表, 因此必须从源数据表抽取数据追加到目的数据表中.

    1)由于之前目的表的表结构已经导入L机Oracle, 这里就不用再定义表了.
    
    2)创建序列, 原因是数据追加.

     --如果原表已经有数据, 则用max(**id)取得最大id值, 并以该值+1作为基值: start with max(**id+1)

     create sequence dept_seq minvalue 1 maxvalue 1000 start with 1 increment by 1 nocache; 

    3)创建触发器
      create or replace trigger dept_trig

      before insert on dept_test for each row

      begin

       select dept_seq.nextval into :new.deptno from dual;

      end;

    4)抽取并插入数据

    insert into dept_test(title) select dname from scott.dept; --这时, 每插入一条数据id都会自动补上.

终于模拟成功.

七.  在本地用数据泵expdp导出数据

    1). 创建逻辑目录, 该命令不会在操作系统创建真正的目录, 需另外手工创建.

    create directory dpdata1 as 'd:\test\dump';

    2). 查看管理理员目录(同时查看操作系统是否存在, 因为Oracle并不关心该目录是否存在, 如果不存在, 则出错.)

    select * from dba_directories;

    3). 给scott用户赋予在指定目录的操作权限

    grant read, write on directory dpdata1 to scott;

    4)按表名导出数据

    host expdp scott/tiger@orcl TABLES=dept_test dumpfile=expdp.dmp DIRECTORY=dpdata1;


八. copy L机的empdp.dmp到远程D机oracle上,用数据泵impdp导入数据, 导入方式为追加模式.

    1). 创建逻辑目录, 该命令不会在操作系统创建真正的目录,  需另外手工创建.

    create directory dpdata2 as 'home\dirc\dump';

    2). 查看管理理员目录(同时查看操作系统是否存在, 因为Oracle并不关心该目录是否存在, 如果不存在, 则出错.)

    select * from dba_directories;

    3). 给scott用户赋予在指定目录的操作权限

    grant read, write on directory dpdata2 to scott;

    4)追加数据

    host impdp system/manager DIRECTORY=dpdata2 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION=append;