【问题标题】:Dropped table became permanently deleted删除的表被永久删除
【发布时间】:2017-06-03 23:33:08
【问题描述】:

我是这个 Oracle 数据库的新手。今天我跑了DROP TABLE table1; 并试图闪回它。但是脚本输出返回了这个:

闪回表 TABLE1 下降前
错误报告 -
ORA-38305: 对象不在回收站中
38305. 00000 - “对象不在回收站中”
*原因:试图闪回丢弃不在回收站中的对象。
*操作:只有 RecycleBin 中的对象可以被闪回删除。

我认为回收站以某种方式被禁用。所以我打开了另一个连接并输入了这个命令:

ALTER SESSION SET recyclebin = ON;

再重复一遍,结果还是一样。当我运行SELECT * FROM RECYCLEBIN;时,回收站中没有任何内容@

我是不是无意中搞砸了什么?

【问题讨论】:

  • 你重复了哪个过程?
  • 你打开回收站后有没有重新创建table1

标签: sql oracle


【解决方案1】:

您使用的技术是 Oracle Flashback Drop。满足以下三个条件时启用:

  1. 参数RECYCLEBIN='on'
  2. 数据未存储在 SYSTEM 表空间中
  3. 数据必须存储在本地管理的表空间中

我邀请您在 SYS 用户(具有默认表空间 SYSTEM)下模拟您的示例,导致您根本无法回退。 我确实尝试以 SYS 用户身份登录并模拟一个小例子作为你的,并得到与你相同的错误输出。

在另一个默认表空间不是 SYSTEM 的用户下尝试您的实验室。 您可以通过检查来验证条件:

  1. Recleclebin='on' with SQL*PLUS SQL> SHOW PARAMETER RECYCLEBIN;
  2. 默认表空间不是带有 SQL 的 SYSTEM> 选择 default_tablespace 从 dba_users where username='input_username';
  3. 表空间数据文件使用 SQL 进行本地管理>select 来自 dba_tablespaces 的 extent_management 其中 tablespace_name='input_tablespace_name';

【讨论】:

    【解决方案2】:

    你没有用命令ALTER SESSION SET recyclebin = ON; 搞砸任何事情,但调用该命令已经晚了。我认为您的问题是由于您的默认表空间是表的SYSTEM

    【讨论】:

      【解决方案3】:

      Oracle Flashback Drop 反转了DROP TABLE 操作的效果。它可用于在表意外删除后进行恢复。 Flashback Drop 比在这种情况下可以使用的其他恢复机制(例如时间点恢复)要快得多,并且不会导致最近的事务丢失或停机。

      表及其相关对象将保留在回收站中,直到它们从回收站中清除。您可以使用以下命令显式清除回收站中的表或其他对象:

      DROP TABLE some_table PURGE;
      

      被丢弃的对象被保存在回收站中,直到在不增加表空间的情况下,对象所属的表空间中不能分配新的扩展区。这种情况称为空间压力。由于为特定表空间定义的用户配额,也会产生空间压力。一个表空间可能有空闲空间,但用户可能已经用尽了他或她的配额。

      当出现空间压力时,数据库会从回收站中选择要自动清除的对象。以先进先出的方式选择对象进行清除,即最先删除的对象是第一个选择进行清除的对象。

      没有为回收站预先分配的固定空间量。因此,没有保证丢弃的对象将保留在回收站中的最短时间。

      要仅查看回收站中的对象,请使用 USER_RECYCLEBINDBA_RECYCLEBIN 视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2013-06-19
        • 2021-03-15
        • 2013-06-20
        • 1970-01-01
        相关资源
        最近更新 更多