FLASHBACK TABLE table_name TO BEFORE DROP引发的猜想

ORACLE 10G新增了FLASHBACK特性,其中FLASHBACK TABLE用来对误删的表进行修复。

复制代码
SQL> CONNECT SYSDBA/***** AS SYSDBA
已连接。

SQL
> CREATE TABLE TEST (T VARCHAR2(10) ) ;

表已创建。

SQL
> DROP TABLE TEST;

表已删除。

SQL
> FLASHBACK TABLE TEST TO BEFORE DROP;
FLASHBACK 
TABLE TEST TO BEFORE DROP
*
第 
1 行出现错误:

ORA-38305: 对象不在回收站中  

复制代码

出现ORA-38305错误,起初我以为是回收站机制参数OFF引起的,Oracle10g起,引入了回收站的机制,将drop掉的数据表保存在回收站中。当发现误删除的时候,可以通过回收站回收数据表。回收站机制类似于我们在Windows系统上的回收站。在Windows中,当我们选择删除一个文件时,本质上并没有将文件从硬盘上删除,只是将文件以一种形式改名,这样就能从回收站中看到。于是我查看了RECYCLEBIN参数

 

奇怪的是回收站参数是开启的,SQL> SHOW RECYCLEBIN; 也看不到删除的表。这到底是咋回事呢?折腾了很久。后来修改了创建表的表空间,竟然一切都OK

复制代码
SQL> CREATE TABLE TEST(T VARCHAR2(10)) TABLESPACE USERS;

表已创建。

SQL
> DROP TABLE TEST;

表已删除。

SQL
> SHOW RECYCLEBIN;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  
DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$gVtRcd2NTqihW6yM4vs0Hw==$0 TABLE        2011-07-24:12:40:42
SQL
> FLASHBACK TABLE TEST TO BEFORE DROP;

闪回完成。

SQL
> SELECT * FROM TEST;

未选定行

复制代码

如果不指定创建表的表空间,那么它会使用默认的表空间SYSTEM,你可以通过SELECT TABLESPACE_NAME FROM USER_TABLES WHERE TABLE_NAME='TEST'查看。后来我有多次重复了这个实验,结果都是如此,在表空间SYSTEM下是无法使用FLASHBACK TABLE特性的

官方文档解释:

You cannot 'flashback table to before drop' a table which has been created in the SYSTEM tablespace. The table is sent to the recyclebin only if it existed in some other tablespace other than SYSTEM tablespace and that tablespace must be locally managed.

ORACLE限制了在表空间SYSTEM下使用回收站机制,这也是为什么不推荐用SYS用户创建数据库对象。

原文链接:http://www.cnblogs.com/kerrycode/archive/2011/07/24/2115332.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值