ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10g删除表没有进入回收站(一)

10g删除表没有进入回收站(一)

原创 Linux操作系统 作者:yangtingkun 时间:2008-03-18 20:25:33 0 删除 编辑

今天在删除一个表的时候以外发现被删除的表没有进入回收站。

 

 

在删除一个表的时候,由于忘记了加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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-211566/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10488832