ITPub博客

【DIRECTORY】确保DIRECTORY对应路径书写正确以避免遭遇ORA-29913和ORA-29400错误

原创 Linux操作系统 作者:secooler 时间:2012-03-12 21:28:46 0 删除 编辑
  文章《【DIRECTORY】普通用户创建Oracle DIRECTORY数据库对象的权限需求及探索》(http://space.itpub.net/519536/viewspace-691051)中谈到过关于DIRECTORY数据库对象的创建特点。

  这里,提醒大家在创建DIRECTORY对象时,目录路径一定要书写正确,不要出现不必要的空格或者回车,否则将会遭遇ORA-29913和ORA-29400错误。

1.故障再现及分析过程
1)调整为英文显示环境
$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

2)创建测试用户SECOOLER并授权
$ sqlplus / as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Mar 12 20:07:16 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@ora11g> drop user secooler cascade;

User dropped.

SYS@ora11g> create user secooler identified by secooler;

User created.

SYS@ora11g> grant dba to secooler;

Grant succeeded.

2)创建DIRECTORY对象
  注意这里创建的是一个错误路径,因为这里在路径的结尾处出现了一个多余的回车换行。但是在查询DIR_DUMP执行路径是显示的内容并没有显示出结尾处的回车。
SECOOLER@ora11g> create directory dir_dump as 'c:\
  2  ';

Directory created.

SECOOLER@ora11g> col OWNER for a5
SECOOLER@ora11g> col DIRECTORY_NAME for a15
SECOOLER@ora11g> col DIRECTORY_PATH for a15
SECOOLER@ora11g> select * from dba_directories where directory_name = 'DIR_DUMP';

OWNER DIRECTORY_NAME  DIRECTORY_PATH
----- --------------- ---------------
SYS   DIR_DUMP        c:\

3)以外部表卸载数据方式测试DIRECTORY是否可用
SECOOLER@ora11g> create table t1
  2  organization external
  3  ( type oracle_datapump
  4  default directory dir_dump
  5  location ('t1_part1.dat','t1_part2.dat')
  6  )
  7  PARALLEL 2
  8  as
  9  select owner,table_name,tablespace_name from all_tables where wner='SYSTEM';
create table t1
*
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
error opening file c:\
\T1_6648_11956.log

  可见,这里的报错与DIRECTORY创建时出现的那个回车换行有直接的关系(重点关注最后两行提示信息)。

4)与之对应的中文报错内容如下
$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
$ sqlplus / as sysdba

SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 3月 12 20:20:44 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@ora11g> create table t1
  2  organization external
  3  ( type oracle_datapump
  4  default directory dir_dump
  5  location ('t1_part1.dat','t1_part2.dat')
  6  )
  7  PARALLEL 2
  8  as
  9  select owner,table_name,tablespace_name from all_tables where wner='SYSTEM';
create table t1
*
第 1 行出现错误:
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误error opening file c:\
\T1_6648_4104.log

5)测试由于多余空格导致报错过程
(1)重建DIRECTORY
SECOOLER@ora11g> drop directory dir_dump;

目录已删除。

SECOOLER@ora11g> create directory dir_dump as 'c :\';

目录已创建。

(2)使用DIRECTORY卸载数据
SECOOLER@ora11g> create table t1
  2  organization external
  3  ( type oracle_datapump
  4  default directory dir_dump
  5  location ('t1_part1.dat','t1_part2.dat')
  6  )
  7  PARALLEL 2
  8  as
  9  select owner,table_name,tablespace_name from all_tables where wner='SYSTEM';
create table t1
*
第 1 行出现错误:
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误error opening file c :\T1_6648_6560.log

  报错内容很显然,c与后面的冒号之间的空格是导致错误的根本原因。

2.故障处理方法
  问题的原因是由于创建DIRECTORY时指定的路径中出现多余的空格或者回车导致的,换一种说法便是,当我们指定的路径不存在时就会报错。
  我们的处理方法便是给出DIRECTORY正确的路径。
1)重建directory执行正确的路径
SECOOLER@ora11g> drop directory dir_dump;

目录已删除。

SECOOLER@ora11g> create directory dir_dump as 'c:\';

目录已创建。

2)重新测试数据卸载
SECOOLER@ora11g> create table t1
  2  organization external
  3  ( type oracle_datapump
  4  default directory dir_dump
  5  location ('t1_part1.dat','t1_part2.dat')
  6  )
  7  PARALLEL 2
  8  as
  9  select owner,table_name,tablespace_name from all_tables where wner='SYSTEM';

表已创建。

  创建成功,表明DIRECTORY此时已经正确可用。

3.小结
  ORA-29913和ORA-29400错误背后的根本原因是在创建DIRECTORY数据库对象时对应的路径不存在。在创建DIRECTORY时Oracle数据库并不会到操作系统上检验路径的存在性,只有在使用时才会校验,因此在创建DIRECTORY时谨记对应的路径的真实存在性。

Good luck.

secooler
12.03.12

-- The End --

请登录后发表评论 登录
全部评论
Oracle ACE 总监,OCM联盟(ocmu.org)创始人,恩墨学院(enmoedu.com)创始人,ITPUB Oracle专题深入讨论版版主,资深Oracle数据库专家,北京大学理学硕士,获Oracle OCM 10g 11g认证,ACOUG核心成员,DATAGURU专家团成员,Blogger。Good luck.

注册时间:2008-03-16

  • 博文量
    797
  • 访问量
    7853055