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 owner='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命令的。相对于上面的命令格式,这种方式其实更加简单直接。
I purge user_recyclebin;
II 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可以比较容易的看到整个数据库和当前用户对象的回收站。
1.在oracle中查看回收站内容
SQL>show recyclebin
2.清空回收站内容
SQL>purge recyclebin