零. 注意问题
在导入导出过程中, 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;