ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用闪回拯救我们的数据(三)

利用闪回拯救我们的数据(三)

原创 Linux操作系统 作者:realkid4 时间:2011-01-29 19:17:13 0 删除 编辑

在上篇里,我们说明了闪回表的功能和使用。在本篇中,我们先来看一些闪回表的特点。之后一起来分析闪回表的原理。

 

 

SYS用户对象不能闪回

SYS用户是Oracle系统中的超级用户,肩负着执行数据库启动、关闭、备份等管理职责。在对象控制上,SYS用户可以访问所有对象和数据。所以,一般都建议不要直接使用SYS进行实际日常DBA工作。

 

在闪回这个问题上,SYS用户是受到限制的。下面我们使用SYS用户实验闪回特性。

 

 

SQL> conn / as sysdba;

已连接。

SQL> show user;

USER 为 "SYS" //确定是以sys用户登录的

SQL> create table t as select * from dba_objects;

 

表已创建。

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     50331

 

SQL> show parameter recyclebin; //当前开启的是闪回模式

 

NAME                      TYPE        VALUE

------------------------- ----------- -----------

recyclebin                string      on

SQL> drop table t;

 

表已删除。

 

SQL> show recyclebin; //没有闪回记录

SQL> select * from user_recyclebin;

 

未选定行

 

看来,当我们使用sys用户进行默认表空间(sys用户的默认表空间为system)数据表drop的时候,是不会被闪回的。Oracle内部也不支持这种操作。

 

那么,这种特点是针对SYS的呢?还是针对system表空间的呢?我们继续下面的实验,建立一张数据表在users表空间

 

-- Create table

create table t

(

  id number(10) not null

)

tablespace USERS

  storage

  (

    initial 64K

    minextents 1

    maxextents unlimited

  );

 

//准备数据

SQL> insert into t  select object_id from dba_objects;

 

50331 rows inserted

 

SQL> commit;

 

Commit complete

 

//确认数据表所在的表空间

SQL> select table_name,tablespace_name from all_tables where wner='SYS' and table_name='T';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

T                              USERS

 

//删除数据表

SQL> drop table t;

 

表已删除。

 

//显示回收站

SQL> show recyclebin;

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

T                BIN$kLlt43leRJGNWtQMB/yTaQ==$0 TABLE        2011-01-28:00:14:18

 

 

显然,闪回机制对system表空间数据表是不进行闪回的。

 

结论:使用sys用户的闪回要注意,当建立数据表是在system表空间下的时候,是不支持闪回特性的。

 

 

闪回表回收站——两个视图

 

使用方面,闪回特性还要关注两个回收站视图。all_recyclebin、dba_recyclebin。

 

all/user/dba三层结构,我们熟悉Oracle的朋友一定不会陌生。Oracle中大部分对象都提供了以这三个作为前缀的命名视图。三层的视图表示的都是一种类型对象,都是对元数据表的映射。

 

最低一个层次是user_视图,表示当前用户所属的schema下的对象。其次是all_视图是当前用户所能访问、具有访问权限的对象信息。对象的owner可能不是当前用户,但是因为具有访问权限,也是可能被访问到。最高的是dba_视图,通常只有DBA用户才能访问到该层面视图,常用来作为全局对象。

 

recyclebin系列视图也是类似的作用。视图中可以查询到回收站中的对象信息。

 

 

SQL> desc dba_recyclebin;

Name           Type         Nullable Default Comments                 

-------------- ------------ -------- ------- --------------------------------------------------------

OWNER          VARCHAR2(30)                  Name of the original owner of the object                

OBJECT_NAME    VARCHAR2(30)                  New name of the object   

ORIGINAL_NAME  VARCHAR2(32) Y                Original name of the object   OPERATION      VARCHAR2(9)  Y                Operation carried out on the object

TYPE           VARCHAR2(25) Y                Type of the object 

TS_NAME        VARCHAR2(30) Y        Tablespace Name to which object belongs

CREATETIME     VARCHAR2(19) Y            Timestamp for the creating of the object

DROPTIME       VARCHAR2(19) Y         Timestamp for the dropping of the object

DROPSCN        NUMBER       Y      SCN of the transaction which moved object to Recycle Bin

PARTITION_NAME VARCHAR2(32) Y                Partition Name which was dropped

CAN_UNDROP     VARCHAR2(3)  Y                User can undrop this object     

CAN_PURGE      VARCHAR2(3)  Y                User can purge this object     

RELATED        NUMBER                        Parent objects Obj#      

BASE_OBJECT    NUMBER                        Base objects Obj#        

PURGE_OBJECT   NUMBER                        Obj# for object which gets purged 

SPACE          NUMBER       Y                Number of blocks used by this object

 

 

 

注意其中几个字段:包括原对象名、现在对象名称、删除时间等。这些可以帮助我们了解到对象的回收机制。注意其中的canpurge和canundrop两个标志,表示当前这个回收站对象时候可以进行操作。

 

同时,我们注意到回收站视图中是没有all_视图的。这其实也比较好理解:回收站是属于对象所有者的回收站。建立回收站的目的是为了将删除的对象可以闪回,将对象闪回的权限,还是控制在对象原有所有者或者DBA用户手中比较好。

 

 

在回收站空间管理上,也要关注purge命令的使用。我们是可以直接对recyclebin使用purge命令的。相对于上面的命令格式,这种方式其实更加简单直接。

 

ü        purge user_recyclebin;

ü        purge dba_recyclebin;

 

SQL> select * from dba_recyclebin;

 

OBJECT_NAME                    ORIGINAL_NAME                   

------------------------------ ----------------

BIN$kLlt43leRJGNWtQMB/yTaQ==$0 T                               

 

(结果数据段有省略)

SQL> purge user_recyclebin;

 

Done

 

SQL> purge dba_recyclebin;

 

Done

 

SQL> select object_name, original_name from dba_recyclebin;

 

OBJECT_NAME     ORIGINAL_NAME

--------------- --------------------------------

//对象被清理

 

 

 

结论:使用dba_recyclebin和user_recyclebin可以比较容易的看到整个数据库和当前用户对象的回收站。

 

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

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7676881