文章《【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 --
oracle 路径冲突,【DIRECTORY】确保DIRECTORY对应路径书写正确以避免遭遇ORA-29913和ORA-29400错误...
最新推荐文章于 2021-04-16 02:33:48 发布