首页 技术 正文
技术 2022年11月11日
0 收藏 326 点赞 2,174 浏览 3161 个字

oracle 9i以前,当drop一个表时,到该表的所有引用都会从数据字典中删除。
oracle 10g及以后,当drop一个表时,数据库根本没有删除表,而只是重命名了并放入了回收站。即当发出drop命令时,其实数据库内部执行的是rename操作,此操作应用于index, trigger, constraint,forgein key除外。
既然是rename,就可以撤消删除——通过将表重命名为它原先的名称。但并不能保证总是成功的。因为表占用的空间可能被重用,或在此期间创建了另一个表,表名与被删除的表名相同。

本实验创建一个新的模式tough,并在该模式内创建一个表t,然后drop。之后使用flashback drop恢复它。

SQL> create user tough identified by tough;
SQL> grant create session, resource to tough;

//接下来以新创建的用户tough登录

SQL> create table t (id number, name varchar2(10));
SQL> create index t_idx on t(id);
SQL> alter table t add constraint t_uk unique(id);

SQL> insert into t values (1,’Tough1′);
SQL> insert into t values (2,’Tough1′);
SQL> commit;

//查看所创建的对象

SQL> select object_name, object_type from user_objects;
OBJECT_NAME               OBJECT_TYPE
————————- ——————-
T                         TABLE
T_IDX                     INDEX

//查看所创建的约束

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
——————  —————   ————
T_UK               U               T

SQL> drop table t;

//删除表后,表上的index,constraint也被删除。被删除的对象以新的名称放到了回收站中

SQL> select object_name,original_name,type from user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
—————————— ——————————– ——-
BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0 T                                TABLE
BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0 T_IDX                            INDEX

//此时仍然可以对drop掉的表t作查询,但需使用回收站中的表名

SQL> select * from “BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0”;
        ID NAME
———- ———-
         1 Tough1
         2 Tough1

//但无法对回收站中的对象执行 DDL/DML

SQL> insert into “BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0” values (1,’Tough’);
insert into “BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0” values (1,’Tough’)
ORA-38301: 无法对回收站中的对象执行 DDL/DML

//执行flashback table恢复删除掉的表

SQL> flashback table t to before drop;

或使用下面的方式作恢复

//这样做是有必要的,可以防止闪回期间创建了另一个与删除表重名的表

SQL> flashback table t to before drop rename to t_new;

//恢复后可以查看对象,但发现index,constraint使用的还是回收站中的名字

SQL> select object_name, object_type from user_objects;
OBJECT_NAME                        OBJECT_TYPE
———————————- ———–
T                                  TABLE
BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0     INDEX

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
—————————— ————— ———
BIN$L6IXINvgSs6FAWa2FNiVYw==$0 U               T

//我们可以对index,constraint重命名

SQL> alter index “BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0” rename to T_IDX;
SQL> alter table t rename constraint “BIN$L6IXINvgSs6FAWa2FNiVYw==$0” to T_UK;

//重命名后一切ok

SQL> select object_name, object_type from user_objects;
OBJECT_NAME               OBJECT_TYPE
————————- ——————-
T                         TABLE
T_IDX                     INDEX

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME    CONSTRAINT_TYPE TABLE_NAME
—————— ————— ————
T_UK               U               T

//查询之前删除的表t,数据都恢复回来了

SQL> select * from t;
        ID NAME
———- ———-
         1 Tough1
         2 Tough1

实验完毕。

关于闪回表,需要注意以下几点:
1. flashback drop只能执行drop命令后的恢复,而不能恢复truncate命令;
2. 如果删除了一个用户,不能闪回任何表。因为将模式删除,oracle无法维护对象(即使在回收站内),因为没有可供连接的用户;
3. 所有闪回操作出现在对象所属模式内;
4. 如果删除了表,然后创建了同名的表,接着删除了它。那么在回收站内将有两个表。它们具有不同的回收站名称,但原始名相同。默认情况下flashback drop总是闪回最新版本的表。若最新的表不是你想要的版本,你可以指定你希望恢复的版本的回收站名称,而不是原先的表名。
flashback “BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0” to before drop;
5. flashback不适用于system表空间;


相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295