Oracle Recycle bin 回收站详解
闪回删除和回收站
在 Oracle 数据库的早期版本中,如果错误地删除了表,则必须将数据库恢复到以前的时 间以恢复删除的表。此过程通常非常耗时,并且会导致丢失其它事务处理的工作。 Oracle Database 10g 引入了闪回删除功能,您可以使用此功能还原 DROP TABLE 语句的 结果,而不必使用时间点恢复。 注:初始化参数 RECYCLEBIN 用于控制闪回删除功能是打开 (ON) 还是关闭 (OFF)。如果 将该参数设置为 OFF,则删除的表不会进入回收站。如果将该参数设置为 ON,则删除的 表将进入回收站,并且可以进行恢复。默认情况下,将 RECYCLEBIN 设置为 ON。
回收站
如果不启用回收站,则删除表时,与该表及其相关对象关联的空间会立即变为可回收 (也就是说,该空间可用于其它对象)。 如果启用了回收站,则删除表时,则与该表及其相关对象关联的空间不会立即变为可回收, 即使该空间确实显示在 DBA_FREE_SPACE 中。相反,会将删除的对象临时放在回收站中, 这些对象仍属于其各自的所有者。在空间不紧张时,绝不会自动回收回收站对象使用的空 间。这样,便可以在尽可能长的期限内恢复回收站对象。 将删除的表移动到回收站时,将使用系统生成的名称对该表及其关联对象和约束条件 进行重命名。该操作非常有必要,因为这可以避免以后使用相同名称创建新对象时发生 名称冲突。 回收站本身是一个数据词典表,用于维护已删除对象的原始名称与各自系统生成名称之间 的关系。可以使用 DBA_RECYCLEBIN 视图查询回收站的内容。
幻灯片中的图表说明了这种新的行为:
1. 在表空间中创建了名为 EMPLOYEES 的表。
2. 删除 EMPLOYEES 表。
3. 此时,EMPLOYEES 占用的区被视为可用空间。
4. 将 EMPLOYEES 重命名并插入到回收站中。
从回收站还原表
还原删除的表和相关对象。
如果多个回收站条目具有相同原始名称,则:
– 使用系统生成的唯一名称来还原特定版本
– 使用原始名称时,还原的表遵循后进先出 (LIFO) 的规则
重命名原始名称(如果当前正在使用该名称)。
使用 FLASHBACK TABLE … TO BEFORE DROP 命令从回收站恢复表及其所有可能的 相关对象。可以指定表的原始名称或删除对象时分配给对象的系统生成名称。
如果指定原始名称,且回收站包含多个具有该名称的对象,则最先恢复最晚移动到回收站 的对象(LIFO:后进先出)。如果需要检索表的较早版本,则可以指定要检索的表的系 统生成名称,或发出其它 FLASHBACK TABLE … TO BEFORE DROP 语句,直到检索 到所需的表。
如果自删除原始表后已经在同一方案中创建了名称相同的新表,则系统会返回一个错误, 除非您同时指定了 RENAME TO 子句。
注:闪回删除的表时,恢复的索引、触发器和约束条件将保留各自的回收站名称。因此, 建议在闪回删除的表前查询回收站和 DBA_CONSTRAINTS。使用这种方法,可以将恢复 的索引、触发器和约束条件重命名为更实用的名称。
回收站:自动回收空间
只要回收站对象使用的空间没有被回收,就可以使用闪回删除功能恢复这些对象。下面 是回收站对象回收策略:
明确发出 PURGE 命令时手动进行清除
在空间紧张时自动进行清除:对象处于回收站中时,DBA_FREE_SPACE 也会报告 其对应空间,因为可以自动回收这些空间。然后按以下顺序使用特定表空间中的 空闲空间:
- 与回收站对象不对应的空闲空间。
- 与回收站对象对应的空闲空间。在这种情况下,将使用先进先出 (FIFO) 算法 自动将回收站对象从回收站中清除。
- 自动分配的可用空间(如果表空间是可以自动扩展的)。
假定在 TBS1 表空间内创建一个新表。如果向此表空间分配了与回收站对象不对应的可用 空间,则首先使用此可用空间。如果该空间不够,则使用与 TBS1 内驻留的回收站对象对 应的可用空间。如果使用了某些回收站对象的可用空间,则会从回收站中自动清除这些对 象。此时,将无法再使用闪回删除功能恢复这些对象。如果仍未满足空间需求,则作为最 后的方法,会在可能的情况下扩展 TBS1 表空间。
回收站:手动回收空间
PURGE {TABLE |INDEX }
PURGE TABLESPACE [USER ]
PURGE [USER_|DBA_]RECYCLEBIN
回收站:手动回收空间
使用 PURGE 命令可从回收站中永久地删除对象。从回收站中清除某个对象时,会从数据 库中永久地删除该对象及其相关对象。因此,将无法再使用闪回删除功能恢复从回收站中 清除的对象。下面是可能使用的一些 PURGE 命令:
PURGE TABLE 清除指定表
PURGE INDEX 清除指定索引。
PURGE TABLESPACE 清除驻留在指定表空间内的所有对象。此外,也可能清除相 关的、驻留在其它表空间中的对象。此外,还可以指定 USER 子句,以仅清除属于 指定用户的那些对象,这些对象对于指定表空间运行于较低的磁盘限额上。
PURGE RECYCLEBIN 清除属于当前用户的所有对象。RECYCLEBIN 与 USER_RECYCLEBIN 功能相同。
PURGE DBA_RECYCLEBIN 清除所有对象。要发出此命令,必须具有足够的系统权 限或 SYSDBA 系统权限。
注:对于 PURGE TABLE 和 PURGE INDEX 命令,如果指定原始名称且 回收站包含多个具有该名称的对象,则首先清除位于回收站中时间最长的对象 (FIFO)。
不使用回收站
不使用回收站
- DROP TABLE [PURGE]
- DROP TABLESPACE [INCLUDING CONTENTS] ;
- DROP USER [CASCADE] ;
可以使用 DROP TABLE PURGE 命令从数据库中永久地删除表及其相关对象。使用此命 令时,对应的对象不会移到回收站中。此命令的功能与 DROP TABLE 在先前版本中提供 的功能相同。
发出 DROP TABLESPACE …INCLUDING CONTENTS 命令后,表空间中的对象不会移 到回收站中。而且,回收站中属于该表空间的对象也会被清除。发出没有 INCLUDING CONTENTS 子句的相同命令时,要使命令能够成功地得以执行,表空间必须是空的。但回 收站中可以有属于该表空间的对象。这种情况下,会清除这些对象。
发出 DROP USER …CASCADE 命令后,将从数据库中永久地删除该用户及其拥有的所 有对象。回收站中属于已删除用户的所有对象都将被清除。
查询回收站
SELECT owner, original_name, object_name, type, ts_name, droptime, related, space FROM dba_recyclebin WHERE can_undrop = ‘YES’;
SELECT original_name, object_name, type, ts_name, droptime, related, space FROM user_recyclebin WHERE can_undrop = ‘YES’;
SQL> SHOW RECYCLEBIN
可以通过查询 user_recyclebin 或 RECYCLEBIN 查看已经删除的所有对象。 dba_recyclebin 显示所有用户已删除的以及仍驻留在回收站中的所有对象。 还可以使用 SQL*Plus SHOW RECYCLEBIN 命令。此命令只显示可“取消删除”的那些 对象。
以下示例显示了如何从回收站中提取重要信息:
- original_name 是对象删除前的名称。
- object_name 是对象删除后的系统生成名称。
- type 是对象的类型。
- ts_name 是对象所属的表空间的名称。
- droptime 是删除对象的日期。
- related 是已删除对象的对象标识符。
- space 是对象当前使用的块数。
还可以使用 DNT 查看回收站的内容。
查询已删除的表中的数据
删除了表后,表会移动到回收站中,其原始名称将更改为唯一的系统生成名称。因为仍 拥有已删除的表,所以仍可以通过 DBA_TABLES、DBA_OBJECTS、DBA_SEGMENTS 等各种字典视图查看该表的特性。为了区分在回收站中的表与不在回收站中的表, DBA_TABLES 视图包含名为 DROPPED 的新列,对于已删除但仍驻留在回收站中的表, 该列设置为 YES。
因此,只要系统生成的表名称位于回收站中,就可以对其使用 SELECT 语句以及闪回 查询。 但是,不能对驻留在回收站中的对象发出任何 DML 或 DDL 语句。