标题有点长,不过即使这样也没有完全说清楚。详细的描述是:RAC环境中,如果一个实例删除了表,将表至于回收站中,在另外的实例尝试删除同名的表会报错。
错误信息为:ORA-38301: 无法对回收站中的对象执行 DDL/DML
查询10g的ERROR MESSAGE文档,会发现这个错误信息是找不到的。
将错误简单重现一下:
SQL> conn test/test@testrac1已连接。
SQL> create table t (id number);
表已创建。
SQL> conn test/test@testrac2已连接。
SQL> drop table t;
表已删除。
SQL> conn test/test@testrac1已连接。
SQL> drop table t;
drop table t
*第 1 行出现错误:
ORA-38301: 无法对回收站中的对象执行 DDL/DML
首先登陆实例1,然后创建测试表,登陆实例2,删除测试表,将其置于回收站。如果DROP的同时进行PURGE的话,不会碰到这个问题。最后再次登陆实例1,尝试删除表的时候报错。
这个错误是Oracle Rac环境下的bug。对T表的其他操作则报错ORA-942:表和视图不存在,显然Oracle在RAC环境下DROP表的时候没有进行必要的检查。
SQL> insert into t values (1);
insert into t values (1)
*第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> drop table t;
drop table t
*第 1 行出现错误:
ORA-38301: 无法对回收站中的对象执行 DDL/DML
SQL> truncate table t;
truncate table t
*第 1 行出现错误:
ORA-00942: 表或视图不存在
详细的bug信息和错误描述可以参考metalink,bug:4760728和Doc ID: Note:352842.1。
IXDBA.NET技术社区目前有些平台的某些版本已经有对应的patch了,这个bug的fixed要等到11g了。