首页 > Linux操作系统 > Linux操作系统 > 10g删除表没有进入回收站(一)
今天在删除一个表的时候以外发现被删除的表没有进入回收站。
在删除一个表的时候,由于忘记了加PURGE语句,随后准备将这个表PURGE掉,但是发现这个表并没有被放到回收站中:
SQL> DROP TABLE T_PARTITION;
表已删除。
SQL> PURGE TABLE T_PARTITION;
PURGE TABLE T_PARTITION
*
第 1 行出现错误:
ORA-38307: 对象不在回收站中
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T_LOGMNR TABLE
TEST_LOB TABLE
T2 TABLE
T1 TABLE
T TABLE
难道是我记错了,连接到了一个9i的数据库:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
尝试重现问题:
SQL> CREATE TABLE T_PARTITION (ID NUMBER, NAME VARCHAR2(30))
2 PARTITION BY RANGE(ID)
3 (PARTITION P1 VALUES LESS THAN (100) TABLESPACE YANGTK,
4 PARTITION P2 VALUES LESS THAN (200) TABLESPACE YANGTK);
表已创建。
SQL> DROP TABLE T_PARTITION;
表已删除。
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T_LOGMNR TABLE
TEST_LOB TABLE
T2 TABLE
T1 TABLE
T TABLE
BIN$mSf8xKbZTP2wa74Y3EFVRg==$0 TABLE
已选择6行。
SQL> PURGE TABLE T_PARTITION;
表已清除。
无法重现问题,看来和表本身有关,检查这个表是如何建立的,发现这个表和普通的表果然有不同之处。
这张表的由来可以参考:EXP转化表空间(二):http://yangtingkun.itpub.net/post/468/456284
这张表是从9204导出的分区表,然后通过10g导入数据库中,且在导入之前,修改了表空间的名称,在导入结束后,又将表空间的名称改了回来。
下面仿照这篇文章的过程,看看能否重现问题:
在9204上建立一个表空间,并建立分区表:
SQL> CREATE TABLESPACE TEST DATAFILE 'F:\ORACLE\ORADATA\TEST1\TEST01.DBF' SIZE 10M;
表空间已创建。
SQL> CREATE TABLE T_PARTITION (ID NUMBER, NAME VARCHAR2(30))
2 PARTITION BY RANGE (ID)
3 (PARTITION P1 VALUES LESS THAN (100) TABLESPACE TEST,
4 PARTITION P2 VALUES LESS THAN (200) TABLESPACE TEST);
表已创建。
下面要将T_PARTITION迁移到另外一个数据库中,但是目标数据库中不存在TEST表空间:
F:\>exp test/test@test1 file=t_partition.dmp tables=t_partition
Export: Release 9.2.0.4.0 - Production on 星期日 3月 2 16:55:34 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining option
s
JServer Release 9.2.0.4.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 T_PARTITION
. . 正在导出分区 P1 0 行被导出
. . 正在导出分区 P2 0 行被导出
在没有警告的情况下成功终止导出。
在10g中进行下面的操作:
SQL> CONN YANGTK/YANGTK@YTK102
已连接。
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
YANGTK
LOB_SPACE
已选择8行。
SQL> ALTER TABLESPACE YANGTK RENAME TO TEST;
表空间已更改。
将表导入:
E:\>imp yangtk/yangtk@ytk102 file=t_partition.dmp tables=t_partition
Import: Release 10.2.0.1.0 - Production on 星期日 3月 2 17:11:55 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V09.02.00 创建的导出文件
警告: 这些对象由 TEST 导出, 而不是当前用户
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 TEST 的对象导入到 YANGTK
. 正在将 TEST 的对象导入到 YANGTK
. . 正在导入分区 "T_PARTITION":"P1"导入了 0 行
. . 正在导入分区 "T_PARTITION":"P2"导入了 0 行
成功终止导入, 没有出现警告。
导入后通过修改表空间名称的方法将表空间名称修改会原来的名称:
SQL> ALTER TABLESPACE TEST RENAME TO YANGTK;
表空间已更改。
下面就是验证问题是否重现的关键之处了:
SQL> DESC T_PARTITION
名称 是否为空? 类型
----------------------------------------- -------- -----------------
ID NUMBER
NAME VARCHAR2(30)
SQL> DROP TABLE T_PARTITION;
表已删除。
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T_LOGMNR TABLE
TEST_LOB TABLE
T2 TABLE
T1 TABLE
T TABLE
SQL> PURGE TABLE T_PARTITION;
PURGE TABLE T_PARTITION
*
第 1 行出现错误:
ORA-38307: 对象不在回收站中
问题重现了,解决这个问题必须先要重现问题,否则无法找到问题的真正原因,下面就可以通过各种方法寻找这个问题的真正原因。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-211566/ ,如需转载,请注明出处,否则将追究法律责任。