使用闪回删除和管理回收站

      当你删除一个表时,数据库不会立即删除与该表相关的空间。数据库重命名表,并把它与任何相关联的对象放进回收站,这样,万一表被错误删除,它可以在晚些时候进行恢复。此功能称为闪回删除,通过使用 FLASHBACK TABLE 语句用来恢复表。在讨论使用闪回 TABLE 语句之前,了解回收站的工作原理是很重要的,以及如何管理它的内容。

什么是回收站?
       
回收站实际上是一个包含了删除对象信息的数据字典表。删除的表和任何相关的对象,如索引,约束,嵌套表等,不会被删除,并且仍然占用空间。它们继续计入用户空间配额,直至从回收站删除或由于超过表空间大小限制而被数据库删除等不希望出现的情况。。
       
每个用户都可以看作是有他自己的回收站,因为,除非用户有 SYSDBA 权限,否则用户只能访问到回收站中属于自己的对象。用户可以使用下面的语句查看回收站中属于他的所有对象:


点击(此处)折叠或打开

  1. SELECT * FROM RECYCLEBIN;
       当你删除表空间,包括它的内容,表空间中的对象不放在回收站;并且,数据库会清除回收站中所有位于该表空间对象的所有条目。当你删除表空间,不包括它的内容时,数据库仍会清除所有该表空间对象相关的回收站条目,否则该表空间为空。同样地:


当你删除一个用户,属于用户的所有对象都没有放在回收站,并且回收站的任何所有将被清除。

当你删除一个簇,它的成员表不放在回收站,并且回收站任何成员表被清除。

当你删掉一个类型,所有依赖的对象,如子类型不放在回收站和回收站前的任何依赖的对象被清除。

回收站中的对象命名

 

当一个被删除的表移动到回收站,该表及其相关对象会被赋予系统生成的名称。这样可以避免由多表重名引发的名称冲突。这可能发生在下列情况下:


  • 用户删除表,使用相同的名称重新创建它,然后再次删除。
  • 两个用户都拥有相同名称的表,并且两个用户都删除各自的表。


重命名惯例如下:


点击(此处)折叠或打开

  1. BIN$unique_id$version

其中:

unique_id是26个字符的全局唯一标识符对象,这使得所有回收站对象的名字的在数据库中是唯一的。

version是由数据库分配的版本号

启用和禁用回收站

       
当启用回收站时,删除的表及其相关对象保存在回收站中。当回收站被禁用时,删除的表及其相关对象不放在回收站;他们只是被删除,你必须使用其他手段来恢复它们(如从备份中恢复)。
       
禁用回收站不清除或以其他方式影响回收站中的已有对象。回收站默认情况下是启用的。
       
你可以通过修改回收站初始化参数来启用、禁用回收站。该参数不是动态的,因此当你使用ALTER SYSTEM语句更改参数时,需要重启数据库才能生效。
       禁用回收站
       1.执行以下语句之一:

点击(此处)折叠或打开

  1. ALTER SESSION SET recyclebin = OFF;

  2. ALTER SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
       2.如果执行 ALTER  SYSTEM ,重启数据库。
       启用回收站
       1.执行以下语句之一:

点击(此处)折叠或打开

  1. ALTER SESSION SET recyclebin = ON;

  2. ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
       2.如果执行 ALTER  SYSTEM ,重启数据库。

在回收站中查看和查询对象


Oracle数据库提供了两种视图,以获得关于回收站中的对象的信息:

视图 描述
USER_RECYCLEBIN
该视图可以被用户看到回收站自己删除的对象。它有一个同义词RECYCLEBIN,以方便使用。
DBA_RECYCLEBIN
该视图使管理员能看到在回收站中所有被删除的对象


这些视图的其中一个作用是识别数据库分配给删除对象的名称,如下面的例子:

点击(此处)折叠或打开

  1. SELECT object_name, original_name FROM dba_recyclebin
  2.    WHERE owner = \'HR\';

  3. OBJECT_NAME ORIGINAL_NAME
  4. ------------------------------ --------------------------------
  5. BIN$yrMKlZaLMhfgNAgAIMenRA==$0 EMPLOYEES
您还可以通过使用SQL* Plus命令SHOW RECYCLEBIN来查看回收站中的内容。

点击(此处)折叠或打开

  1. SQL> show recyclebin

  2. ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
  3. ---------------- ------------------------------ ------------ -------------------
  4. EMPLOYEES BIN$yrMKlZaVMhfgNAgAIMenRA==$0 TABLE 2003-10-27:14:00:19
可以查询在回收站中的对象,就像你查询其他对象一样。但是,你必须指定它在回收站中标识的对象的名称。例如:

点击(此处)折叠或打开

  1. SELECT * FROM \"BIN$yrMKlZaVMhfgNAgAIMenRA==$0\";

清除回收站中的对象

       
如果你决定,你永远不会从回收站还原项目,您可以使用 PURGE 语句从回收站中移除项目及其关联的对象并释放他们的存储空间。执行该操作,您需要与删除项目相同的权限。
       
当您使用 PURGE 语句来清除表时,您可以使用该表的回收站名称或表的原始名称。回收站名称可以通过查询 DBA_ USER_RECYCLEBIN 视图来获取。下面假设的例子清除表 hr.int_admin_emp ,当它被放置在回收站时被改名为 BIN$ jsleilx392mk2=293$0

点击(此处)折叠或打开

  1. PURGE TABLE \"BIN$jsleilx392mk2=293$0\";
        您也可以使用下述语句获得同样的效果:

点击(此处)折叠或打开

  1. PURGE TABLE int_admin_emp;
        在使用PURGE语句来清除回收站时,可以指定表空间或用户,如下所示:

点击(此处)折叠或打开

  1. PURGE TABLESPACE example;
  2. PURGE TABLESPACE example USER oe;
        用户可以清除自己对象的回收站并释放空间,使用下面的语句:

点击(此处)折叠或打开

  1. PURGE RECYCLEBIN;
       如果你有SYSDBA权限,那么你可以通过 在上述 的语句中使用DBA_RECYCLEBIN来代替 RECYCLEBIN,来清除整个数据库回收站。
       您还可以使用PURGE语句从回收站中清除索引或从回收站清除 指定表空间的所有对象。

从回收站还原表
        使用FLASHBACK  TABLE  ... TO  BEFORE  DROP语句从回收站中恢复对象。你可以指定表在回收站的名称或原始表名。一个可选的重命名为子句允许你恢复它并重新命名表。回收站的名称可以通过查询DBA_或USER_RECYCLEBIN视图来得到。使用FLASHBACK  TABLE  ... TO  BEFORE  DROP语句,你需要删除该表所需要的相同的权限。
       下面的示例恢复int_admin_emp表,并分配给它一个新的名字:

点击(此处)折叠或打开

  1. FLASHBACK TABLE int_admin_emp TO BEFORE DROP
  2.    RENAME TO int2_admin_emp;
        如果你已经多次删除表,那么系统生成的回收站名字是非常有用的。例如,假设 在回收站中你有三个版本的int2_admin_emp表,并要恢复第二个版本。您可以通过发出两个FLASHBACK TABLE语句做到这一点,或者您可以查询回收站,然后闪到相应的回收站名称表,如下面的例子。 在查询中包括创建时间可以帮您确认您要还原正确的表。

点击(此处)折叠或打开

  1. SELECT object_name, original_name, createtime FROM recyclebin;

  2. OBJECT_NAME ORIGINAL_NAME CREATETIME
  3. ------------------------------ --------------- -------------------
  4. BIN$yrMKlZaLMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:21:05:52
  5. BIN$yrMKlZaVMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:21:25:13
  6. BIN$yrMKlZaQMhfgNAgAIMenRA==$0 INT2_ADMIN_EMP 2006-02-05:22:05:53

  7. FLASHBACK TABLE \"BIN$yrMKlZaVMhfgNAgAIMenRA==$0\" TO BEFORE DROP;

恢复相关对象
        当你从回收站恢复表,相关对象,如索引没有恢复到他们的原始名称;他们保留的是系统生成的回收站名字。您必须手动重命名相关对象,以恢复原来的名称。如果您打算为相关对象手动恢复原来的名称,请确保在你恢复表之前,记下每个相关对象的系统生成的回收站名字。
        以下是恢复的某些被删除表JOB_HISTORY的索引的原始名称,是HR示例模式的一个例子。该示例假设您登录的HR用户。
       1.删除JOB_HISTORY之后,从回收站恢复它之前,运行以下查询:

点击(此处)折叠或打开

  1. SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;

  2. OBJECT_NAME ORIGINAL_NAME TYPE
  3. ------------------------------ ------------------------- --------
  4. BIN$DBo9UChtZSbgQFeMiAdCcQ==$0 JHIST_JOB_IX INDEX
  5. BIN$DBo9UChuZSbgQFeMiAdCcQ==$0 JHIST_EMPLOYEE_IX INDEX
  6. BIN$DBo9UChvZSbgQFeMiAdCcQ==$0 JHIST_DEPARTMENT_IX INDEX
  7. BIN$DBo9UChwZSbgQFeMiAdCcQ==$0 JHIST_EMP_ID_ST_DATE_PK INDEX
  8. BIN$DBo9UChxZSbgQFeMiAdCcQ==$0 JOB_HISTORY TABLE
       2.使用以下命令恢复 JOB_HISTORY表:

点击( 此处 )折叠或打开
  1. FLASHBACK TABLE JOB_HISTORY TO BEFORE DROP;
        3.运行下面的查询来验证所有JOB_HISTORY索引保留了系统生成的回收站名字:

点击(此处)折叠或打开

  1. SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = \'JOB_HISTORY\';
  2.  
  3. INDEX_NAME
  4. ------------------------------
  5. BIN$DBo9UChwZSbgQFeMiAdCcQ==$0
  6. BIN$DBo9UChtZSbgQFeMiAdCcQ==$0
  7. BIN$DBo9UChuZSbgQFeMiAdCcQ==$0
  8. BIN$DBo9UChvZSbgQFeMiAdCcQ==$0
        4.以下语句是恢复前两个索引的原始名称,需要注意的是,系统生成的名称需要用双引号(区分大小写)

点击(此处)折叠或打开

  1. ALTER INDEX \"BIN$DBo9UChtZSbgQFeMiAdCcQ==$0\" RENAME TO JHIST_JOB_IX;
  2. ALTER INDEX \"BIN$DBo9UChuZSbgQFeMiAdCcQ==$0\" RENAME TO JHIST_EMPLOYEE_IX;


hoegh
15.05.05
-- The End --








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-1624816/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30162081/viewspace-1624816/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值