最近需要从A库将数据导到B库,A库使用的是Oracle 10g,B库使用的是Oracle 11g,本地未安装数据库服务。
【EXP导出失败】
最开始想使用EXP导出数据,结果在使用11g导出10g数据时会报错“EXP-00008: 遇到 ORACLE 错误 904”。错误原因是,Oracle只向下兼容,也就是必须使用10g及以前版本才能导出。为导数据,将本地数据库更换或在其他电脑新装10g的时间成本较高,且可能有未知困难(WIN7操作系统和Oracle 10g数据库之间不兼容),故只能采取其他手段来实现数据迁移。扩展阅读:Oracle数据库导入导出逻辑备份方法总结
【PLSQL功能Oracle Export导出失败】
使用本地电脑PL/SQL导出数据,Tools=>Export Tables=>Oracle Export。结果发现无论如何右下角的Export都是灰色的,无法导出!查找原因,发现PL/SQL虽有Export功能,但该功能是基于EXP的,本地电脑未安装Oracle服务也就没有EXP工具,故该功能是无法使用的。
【PLSQL功能PL/SQL Developer导出成功】
更换导出方式为,Tools=>Export Tables=>PL/SQL Developer(不使用SQL Inserts是因为该选项导出数据量小没问题,但数据量大时效率非常低,尤其是在B库上导入时,耗时更久,而且容易卡死)。结果发现在编译过程中也报错了“stream read error”,查找原因发现是因为导出的部分表中有大字段(CLOB或BLOB),而PL/SQL Developer并不支持大字段数据类型。所以,必须先把含有大字段的表找出来,可使用系统表ALL_TAB_COLUMNS,SQL如下:
注意,USER_NAME是导出用户的用户名,需要更改。
若需要导出的表较少,有大字段的表也不多,则可以手工按shift配合ctrl来选择要导出的不带大字段的表。若要导出的表多,且有大字段的表也多,用手工选择表的方式就比较麻烦了,可以使用PL/SQL自带的Object Selection功能。
1)使用SQL语句拼出Load Object Selection所需文件内容,SQL如下:
注意,USER_NAME是导出用户的用户名,需要更改。
2)编辑osf文件,在Tools=>Export Tables=>PL/SQL Developer的选择框里随便选择一个表,右键=>Save Object Selection,选择文件存放位置,然后生成文件。
使用文本编辑工具(如UltraEdit)打开osf文件,将上面SQL语句的结果粘贴进文件,然后保存。osf文件内容样式如下:
PL/SQL Developer Object Selection File
1
TABLE "SCOTT"."EMP"
TABLE "SCOTT"."DEPT"
3)在选择框里,右键=>Load Object Selection,然后选择上面做成的osf文件,然后就会发现,想要导出的且不包含大字段的表已经被选中了,然后在右下Export前选择导出文件的位置及命名文件,然后点Export就可以等待文件导出了。若导出的表较多,该步可能耗时较长。
【PL/SQL功能Export User Objects导出非表数据】
Export Tables导出的只有表及表数据,但还有些其他数据是我们所需要的,比如序列、视图、存储过程和触发器等,这就需要用到Tools=>Export User Objects功能了。
【PLSQL功能PL/SQL Developer导入表】
A库导出的数据,要导入B库。因环境原因,需要将数据同样导入B库的相同User下。故,需要先在B库建立相同用户及表空间表(若用户已存在则不需要建,但若表空间不同需要新建同名表空间并更改用户的默认表空间)。具体SQL如下:
使用Tools=>Import Tables功能导入数据,选择文件,导入。
然而,若两库之间字符集不一样,可能会报错“ORA-12899”,这是因为中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,A库字符集是ZHS16GBK而B库字符集为UTF-8的库里,所以会出现值长度超过最大长度的问题,从而报错“ORA-12899”。
解决方法1:要么修改B库相应表字段的最大长度,然后将未导入的数据手工导入。
解决方法2:删除已经导入的数据,并重启修改B库字符集
/*单步按顺序执行下列语句,若有不懂去网上查,此处不详解*/
执行SQL文件导入非表数据:
在PL/SQL新建Command Window,直接在SQL后执行SQL文件,样式如下:
SQL>@ ‘D:\data\scott.sql’
注意:不要漏掉两个单引号。