17.5 闪回丢弃(Flashback Drop) 闪回丢弃是将被丢弃的数据库对象及其相依对象的复制保存在回收站中,以便在必要时能够及时恢复这些对象。在回收站被清空以前,被丢弃的对象并没有从数据库中删除。这就使数据库能够恢复被意外或者误操作而删除的表。 为了更好地理解闪回丢弃,需要理解回收站的工作细节,以及丢弃对象在回收站中的存储、查询与清除等,将在以下的小节中介绍。 17.5.1 回收站概念 回收站(Recycle Bin)是所有丢弃表及其相依对象的逻辑存储容器。当一个表被丢弃时(DROP), 回收站会将该表及其相依对象存储在回收站中。存储在回收站中的表的相依对象包括索引、约束、触发器、嵌套表、大的二进制对象(LOB)段和LOB索引段。 Oracle回收站将用户所进行的DROP语句的操作记录在一个系统表里,即将被删除的对象写到一个数据字典表中,确定是不再需要的被删除对象时,可以使用PURGE命令对回收站空间进行清除。 为了避免被删除表与同类对象名称的重复,被删除表(及相依对象)放到回收站中后,Oracle系统对被删除的对象名进行了转换。被删除对象(如表)的名字转换格式如下:BIN$globalUID$version globalUID是一个全局唯一的、24个字符长的标识对象,它是Oracle内部使用的标识,对于用户来说没有任何实际意义,因为这个标识与对象未删除前的名称没有关系。 $version 是Oracle数据库分配的版本号。 17.5.2 使用回收站 如果要对DROP过的表进行恢复操作,可以使用以下语句: SQL>FLASHBACK TABLE table_name TO BEFORE DROP 为了帮助读者理解回收站在使用中的操作过程,下面给出较详细的回收站操作步骤。 示例:本例给出数据准备、删除表、查询回收站信息、恢复及查询恢复后的情况。 (1)连接Oracle [oracle@localhost ~]$ sqlplus scott/tiger SQL*Plus: Release 11.1.0.6.0 - Production on Sat Oct 20 16:32:00 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> set line 120; SQL> set pagesize 50; SQL> show user; USER is "SCOTT" SQL> (2)准备数据 SQL> create table my_emp as select * from emp; Table created. SQL> select count(*) from my_emp; COUNT(*) ---------- 14 SQL> (3)删除表结构 SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE EMP TABLE EMP2 TABLE MY_EMP TABLE SALGRADE TABLE SYS_TEMP_FBT TABLE 7 rows selected. SQL> drop table my_emp; Table dropped. SQL> (4)删除(DROP)表后的数据字典 SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BIN$POiMOEfPgU3gQAB/AQASlg==$0 TABLE BONUS TABLE DEPT TABLE EMP TABLE EMP2 TABLE SALGRADE TABLE SYS_TEMP_FBT TABLE 7 rows selected. 需要说明的是,当MY_EMP表被删除以后,在数据库回收站里变成了BIN$POiMOEfPgU3gQAB/ AQASlg==$0,version是0。 (5)查看user_recyclebin回收站,可以看到删除的表对应的记录: SQL> col object_name for a30; SQL> col original_name for a20; SQL> select object_name,original_name from user_recyclebin; OBJECT_NAME ORIGINAL_NAME ------------------------------ -------------------- BIN$POiMOEfPgU3gQAB/AQASlg==$0 MY_EMP SQL> (6)利用user_recyclebin中的记录,使用FLASHBACK从回收站恢复表MY_EMP: SQL> flashback table my_emp to before drop; Flashback complete. SQL> select count(*) from my_emp; COUNT(*) ---------- 14 SQL> 以上是恢复完成后的查询结果。 17.5.3 回收站与空间利用 回收站是丢弃对象的逻辑存储容器,它以表空间中现有的已经分配的空间为基础,这意味着系统并没有给回收站预留空间。这使回收站空间依赖于现有表空间中的可用空间(也就是说丢弃表占据的空间仍然需要计入表空间配额)。因此并不能总是保证丢弃对象在回收站中的最小时间。 如果不对回收站进行清除操作,丢弃对象会一直保存在回收站内,一直到丢弃对象所属的表空间无法再分配新的存储区域,这种状态称之为空间压力。有时,用户的表空间限额也会导致空间压力状态的出现,即使表空间中仍然存在自由空间。 当空间压力出现时,Oracle会覆盖些回收站对象从而自动回收表空间。Oracle根据先进先出的原则来选择丢弃对象进行删除,所以最先被丢弃的对象也最先被清除。而对象的清除仅仅是为了解决产生的空间压力问题,所以会尽可能清除少的对象来满足空间压力的要求。这样处理,既最大限度地保证了对象在回收站中的可用时间,又减少了Oracle在事物处理时的性能影响。 DBA需要关注回收站的空间利用情况,掌握清除回收站对象从而释放空间的办法,这可用PURGE命令来完成。PURGE命令可从回收站中删除表或索引,并释放有关表和索引所占用的空间;用PURGE命令也可清除整个回收站或清除被删除的表空间的所有部分。 值得一提的是,当用PURGE命令清除掉被删除的对象后,该对象确实是被完全清除掉而不能再重建了。 要清除回收站中的对象,释放空间,有以下几种方式。 (1)使用PURGE TABLE original_table_name。 这里的original_table_name表示表在drop以前的名称(源名称),使用该操作可以从回收站中永久地删除对象并释放空间。 (2)使用PURGE TABLE recyclebin_object_name。 这里的recyclebin_object_name表示回收站中的对象名称,使用该操作可以从回收站中永久地删除对象并释放空间。 (3)使用PURGE TABLESPACE tablespace_name从回收站清除一个特定表空间的所有对象。 该命令从指定的表空间中清除所有的丢弃对象及相依对象。因为相依对象(比如LOB、嵌套表、索引和分区等)未必与基表存储在同一个表空间,该命令会将相依对象从其所在的表空间中进行清除。 (4)使用PURGE TABLESPACE tablespace_name USER user_name,会从回收站中清除属于某个特定用户的所有丢弃对象(当然也包括基表的相依对象)。 (5)使用命令DROP USER user_name CASCADE直接删除指定用户及其所属的全部对象。 也就是说DROP USER命令会绕过回收站直接进行删除。同时,如果回收站中也有该用户的所属对象, 则也会从回收站中清除掉。 (6)使用PURGE RECYCLEBIN 命令可以清除用户自己的回收站。 该命令从用户回收站中清除所有的对象并释放与这些对象关联的空间。 (7)PURGE DBA_RECYCLEBIN从所有用户的回收站清除所有对象。 该命令能高效地完全清空回收站,当然执行该命令必须具有SYSDBA系统管理权限才可以。 示例:查询当前用户回收站中的内容,再用PURGE清除。 SQL> show user; USER is "SCOTT" SQL> create table orcltest as select * from emp; Table created. SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE EMP TABLE EMP2 TABLE MY_EMP TABLE ORCLTEST TABLE SALGRADE TABLE SYS_TEMP_FBT TABLE 8 rows selected. SQL> drop table orcltest; Table dropped. SQL> select object_name,original_name from user_recyclebin; OBJECT_NAME ORIGINAL_NAME ------------------------------ -------------------- BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST SQL> SQL> show user; USER is "SCOTT" SQL> select object_name,original_name from user_recyclebin; OBJECT_NAME ORIGINAL_NAME ------------------------------ -------------------- BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST SQL> purge table orcltest; Table purged. SQL> select object_name,original_name from user_recyclebin; no rows selected SQL> |
|
来自: wghbeyond > 《oracle备份与恢复》