这是一篇Pentaho产品不相关的Oracle数据库操作记录。仅以此纪念半夜之辛劳。
一 字符集探查
查看dmp的字符集和要导入的oracle的字符集是否一致。
查看oracle的字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
-----------------------------------------------
SIMPLIFIED CHINESE_CHINA. ZHS16GBK
查看DMP文件字符集
使用UltraEdit打开,会看到字符集。
因DMP文件字符集(AL32UTF8)与Oracle数据库字符集(ZHS16GBK)不一致。导致通过IMP程序导入时报错:
IMP-00038: 无法转换为环境字符集句柄
IMP-00000: 未成功终止导入
二 Oracle数据库字符集更改
本次需更换的字符集.
AMERICAN_AMERICA.AL32UTF8
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
查看字符集命令
select * from v$nls_parameters;
select * from nls_database_parameters;
oracle数据库的字符集更改 步骤
SQL> conn / as sysdba --需要使用SYSDBA帐户
SQL> startup mount
SQL> shutdown immediate; --停止数据库
SQL> startup mount; --启动数据库到 mount 状态
SQL> alter session set sql_trace=true;
SQL> alter system enable restricted session;
SQL> alter system set job_queue_processes=0;
SQL> alter system set aq_tm_processes=0;
SQL> alter database open;
SQL>alter databasecharacter set INTERNAL_USE AL32UTF8; --修改字符集ZHS16GBK->AL32UTF8
SQL> shutdown immediate; --再次关闭数据库
SQL> STARTUP; --启动数据库
查询修改后的字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
三 导入DMP文件
1 实用程序IMP和IMPDP的区别
EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。
IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。
2 IMP实用程序导入DMP文件
由于不知此将导入的DMP文件是用exp实用程序导出还是用expdp实用程序导出。So,本次导入操作首先尝试使用exp实用程序对应的imp实用程序进行操作。
在CMD界面输入imp导入命令
C:\Users\Administrator>impdp scott/tiger file=c:\test1.dmp full=y ignore=y;
执行后依然报下述错误:
IMP-00038: 无法转换为环境字符集句柄
IMP-00000: 未成功终止导入
通过网络查找原因,造成此错误的疑是下述原因:
2.1 此DMP文件是采用expdp导出的数据文件,采用imp无法导入导致此错误。
解决方法:改用impdp实用程序执行导入操作。
2.2 由高版本数据库导出的数据文件,在低版本数据库无法正常导入。
解决方法:例如导出数据的服务器版本是11.2.0.1.0,导入的服务器版本为11.1.0.6.0导出语句末尾添加version=11.1.0.6.0。
Expdp 户名/密码 directory=目录名 dumpfile=备份文件名.dmp logfile=日志文件.log version= 11.1.0.6.0
3 IMPDP实用程序导入DMP文件
再次尝试使用impdp实用程序进行导入操作。结果是成功的。证明此DMP文件是由expdp实用程序导出。
在使用impdp实用程序导入操作过程中,因导入语句拼写错误导致多种导入错误产生,在此记述,以备后事之师。
3.1 导入目录缺失
导入命令:
C:\Users\Administrator>impdp scott/tiger@XKZENON directory='c:\' DUMPFILE=test1.
dmp full=y;
错误信息:
ORA-39002: 操作无效
ORA-39070: 无法打开日志文件。
ORA-39087: 目录名 C:\ 无效
解决办法:
创建导入逻辑目录,并给导入账号scott赋予指定目录的操作权限。
SQL> create or replace directory expdir as 'c:\';
目录已创建。
SQL> grant read,write on directory expdir to scott;
授权成功。
3.2 导入账号为授权
导入命令修改为:
C:\Users\Administrator>impdp scott/tiger@XKZENON directory=expdir DUMPFILE=test1
.dmp full=y remap_schema=EDBADM:scott;
错误信息:
ORA-31631: 需要权限
ORA-39122: 未授权的用户不能执行 REMAP_SCHEMA 重新映射。
解决办法:
当执行impdp操作指定remap_schema参数时,需要具备imp_full_database权限。为导入账号scott进行授权。
SQL> grant imp_full_database to scott;
授权成功。
3.3 导入表空间缺失
加remap_schema参数后,提示tablespace不存在。错误信息忘记截图了哈:)。
在impdp导入命令中添加下述参数:
REMAP_TABLESPACE=sourcespacename:targetspacename
添加remap_tablespace参数后,依然提示表空间不存在。错误如下:
ORA-39083: 对象类型 TABLE:"SCOTT"."TEST1" 创建失败, 出现错误:
ORA-00959: 表空间 'USERS;' 不存在
解决办法:
通过网络查找原因,给出如下两种方法:创建导出数据源表空间或者加入ignore = y 参数。
3.4 导入成功
通过加入ignore = y 参数。终于成功的将DMP数据文件导入到Oracle数据库中。执行过程记录如下。
C:\Users\Administrator>impdp scott/tiger@XKZENON directory=expdir DUMPFILE=test1
.dmp full=y remap_schema=EDBADM:scott REMAP_TABLESPACE=EDS_EQP_IDX_TBS:users ign
ore=y;
Import: Release 11.2.0.1.0 - Production on 星期二 1月 23 00:12:46 2018
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Produc
tion
With the Partitioning, OLAP, Data Mining and Real Application Testing options
由于以下参数, 旧有模式处于活动状态:
旧有模式参数: "ignore=TRUE" 位置: Command Line, 替换为: "table_exists_action=app
end"
已成功加载/卸载了主表 "SCOTT"."SYS_IMPORT_FULL_01"
启动 "SCOTT"."SYS_IMPORT_FULL_01": scott/********@XKZENON directory=expdir DUMP
FILE=test1.dmp full=y remap_schema=EDBADM:scott REMAP_TABLESPACE=EDS_EQP_IDX_TBS
:users table_exists_action=append
处理对象类型 TABLE_EXPORT/TABLE/TABLE
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入了 "SCOTT"."TEST1" 372.4 MB 2882820 行
作业 "SCOTT"."SYS_IMPORT_FULL_01" 已于 00:13:36 成功完成
领取专属 10元无门槛券
私享最新 技术干货