数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Oracle 10G 中的"回收站"

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

Oracle 10G 中的"回收站"

by Fenng
http://www.DBAnotes.net


在Oracle 10G中,引入了一个回收站(Recycle Bin)的概念.

回收站,从原理上来说就是一个数据字典表,放置用户Drop掉的数据库对象信息.用户进行Drop操作的对象并没有被数据库删除,仍然会占用空间.除非是由于用户手工进行Purge或者因为存储空间不够而被数据库清掉.数据库有了这样的功能,能够减少很多不必要的麻烦.常常看到开发人员误把表删除,急急忙忙找DBA来想办法的情况,相信,随着10G的大范围应用,这种情形应该比较少见了.

DBA管理上的相关信息可以从USER_recyclebin(DBA_recyclebin)中获取.从现在的Beta版本来看,手册上所说的通过SQL*Plus的show recycle bin 命令查看还不可用.

为了便于测试,我们创建了一个表空间Foo,大小为1M,创建了一个用户Foo,默认的表空间为Foo.

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

SQL> CONNECT foo/foo
已连接。

SQL> SELECT table_name FROM user_tables;

未选定行

SQL> DESC user_recyclebin
名称 是否为空? 类型
----------------------------------------- -------- ----------------

......
......

user_recyclebin大多是自解释的,涵义比较容易理解.

SQL> SELECT object_name FROM user_recyclebin;

未选定行

SQL> CREATE TABLE foo AS SELECT * FROM DUAL;

表已创建。

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
FOO

SQL> DROP TABLE foo;

表已丢弃。

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
RB$$41888$TABLE$0

SQL>

SQL> SELECT object_name, original_name FROM user_recyclebin;

OBJECT_NAME ORIGINAL_NAME
-------------------- --------------------
RB$$41888$TABLE$0 FOO

SQL> DESC RB$$41888$TABLE$0
名称 是否为空? 类型
----------------------------------------- -------- -------------

DUMMY VARCHAR2(1)

当一个表被删除并移动到"回收站"中,它的名字要进行一些转换.这样的目的显而易见是为了避免同类对象名称的重复.(Windows上,经过了特殊的处理,回收站里的操作系统文件可以重名.)

转换后的名字格式如下:

RB$$objn$object_type$version

其中的RB,代表Recycle Bin. objn为表的目录对象号. object_type表示对象类型. version表示版本号.
由数据库指定。foo表被删除后,在数据库回收站里变成了RB$$41888$TABLE$0 。从名字可以看出,这个对象的类型是Table,Version是0.

SQL> CREATE TABLE foo AS SELECT * FROM DUAL;

表已创建。

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
FOO
RB$$41888$TABLE$0

SQL> DROP TABLE foo;

表已丢弃。

SQL> SELECT object_name, original_name FROM user_recyclebin;

OBJECT_NAME ORIGINAL_NAME
-------------------- --------------------
RB$$41889$TABLE$0 FOO
RB$$41888$TABLE$0 FOO

SQL>

能看出来,虽然源表名字相同,在回收站里的对象名字是不同的。

已经放到回收站里的表是不能用drop 命令删除的:

SQL> drop table RB$$41888$TABLE$0;
drop table RB$$41888$TABLE$0
*
ERROR 位于第 1 行:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin

如果要清掉改对象,使用purge命令:

SQL> PURGE table RB$$41888$TABLE$0;

Table purged.

SQL> SELECT object_name, original_name FROM user_recyclebin;

OBJECT_NAME ORIGINAL_NAME
-------------------- --------------------
RB$$41889$TABLE$0 FOO

对象已经清掉.

恢复表,使用Undrop命令.

SQL> undrop table RB$$41889$TABLE$0;

Table undropped.

SQL> SELECT object_name, original_name FROM user_recyclebin;

未选定行

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
RB$$41889$TABLE$0

SQL> desc foo;
ERROR:
ORA-04043: 对象 foo 不存在

恢复后的表的名字为RB$$41889$TABLE$0,如果指定名字,使用" as 表名字 "
如: undrop table RB$$41889$TABLE$0 as Foo这样的语句.更为详细的语法,请查阅10G的SQL参考手册.

SQL>
SQL> desc RB$$41889$TABLE$0;

名称 是否为空? 类型
----------------------------------------- -------- -------------

DUMMY VARCHAR2(1)

SQL> DROP TABLE RB$$41889$TABLE$0;

表已丢弃。

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
RB$$41889$TABLE$1

SQL>

如果我们这个时候再删除RB$$41889$TABLE$0,可观察到回收站里该表版本号的变化。

如果空间一直够用,回收站里的对象会一直保持(如果你不手工进行Purge的话)。如果空间不足,回收站里的对象会被清空。看我们下面这个例子:

让我们创建一个大一点的表:

SQL> select object_name from user_recyclebin;

OBJECT_NAME
------------------------------
RB$$41893$TABLE$0

SQL> CREATE TABLE foo_bigger AS SELECT * FROM all_objects WHERE ROWNUM<7980;

表已创建。

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
------------------------------
FOO_BIGGER

SQL> SELECT object_name, original_name FROM user_recyclebin;

未选定行

SQL>

哦,果真,回收站里的内容已经被删掉了。还要注意,在空间不足的时候Drop表,也是不能放到回收站里的。

 

参考文档:

Oracle10i Database Administrator’s Guide Release 1 (10.1) - BETA
Part No. B10739-01

Oracle10g的undrop功能一点实践 by Overmars


原文出处:
<a href="http://www.dbanotes.net/Oracle/Oracle-10G-RecycleBin.htm">http://www.dbanotes.net/Oracle/Oracle-10G-RecycleBin.htm</a>




相关文章

相关软件