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

文章《【DIRECTORY】普通用户创建Oracle DIRECTORY数据库对象的权限需求及探索》(http://space.itpub.net/519536/viewspace-691051)中谈到过关于DIRECTORY数据库对象的创建特点。这里,提醒大家在创建DIRECTORY对象时,目录路径一定要书写正确,不要出现不必要的空格或者回车,否则将会遭遇ORA-29913和ORA-29400错误。1.故障再现及分析过程1)调整为英文显示环境$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK2)创建测试用户SECOOLER并授权$ sqlplus / as sysdbaSQL*Plus: Release 11.1.0.6.0 - Production on Mon Mar 12 20:07:16 2012Copyright (c) 1982, 2007, Oracle.  All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@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 a5SECOOLER@ora11g> col DIRECTORY_NAME for a15SECOOLER@ora11g> col DIRECTORY_PATH for a15SECOOLER@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 t12  organization external3  ( type oracle_datapump4  default directory dir_dump5  location ('t1_part1.dat','t1_part2.dat')6  )7  PARALLEL 28  as9  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 calloutORA-29400: data cartridge errorerror opening file c:\\T1_6648_11956.log可见,这里的报错与DIRECTORY创建时出现的那个回车换行有直接的关系(重点关注最后两行提示信息)。4)与之对应的中文报错内容如下$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"$ sqlplus / as sysdbaSQL*Plus: Release 11.1.0.6.0 - Production on 星期一 3月 12 20:20:44 2012Copyright (c) 1982, 2007, Oracle.  All rights reserved.连接到:Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@ora11g> create table t12  organization external3  ( type oracle_datapump4  default directory dir_dump5  location ('t1_part1.dat','t1_part2.dat')6  )7  PARALLEL 28  as9  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.log5)测试由于多余空格导致报错过程(1)重建DIRECTORYSECOOLER@ora11g> drop directory dir_dump;目录已删除。SECOOLER@ora11g> create directory dir_dump as 'c :\';目录已创建。(2)使用DIRECTORY卸载数据SECOOLER@ora11g> create table t12  organization external3  ( type oracle_datapump4  default directory dir_dump5  location ('t1_part1.dat','t1_part2.dat')6  )7  PARALLEL 28  as9  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 t12  organization external3  ( type oracle_datapump4  default directory dir_dump5  location ('t1_part1.dat','t1_part2.dat')6  )7  PARALLEL 28  as9  select owner,table_name,tablespace_name from all_tables where wner='SYSTEM';表已创建。创建成功,表明DIRECTORY此时已经正确可用。3.小结ORA-29913和ORA-29400错误背后的根本原因是在创建DIRECTORY数据库对象时对应的路径不存在。在创建DIRECTORY时Oracle数据库并不会到操作系统上检验路径的存在性,只有在使用时才会校验,因此在创建DIRECTORY时谨记对应的路径的真实存在性。Good luck.secooler12.03.12-- The End --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值