2.Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)

转载自:https://blog.csdn.net/leshami/article/details/6105327

FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态。闪回删除并不是
真正的删除表,而是把该表重命名并放入回收站,类似于Windows的回收站一样。当某个活动对象需要使用该表所占用的空间时,该表才会被真
正删除。只要空间未被复用,该表即可恢复。本文主要讲述了FLASHBACK DROP特性以及闪回特性中回收站(RECYCLEBIN)的管理。

一、FLASHBACK DROP 的功能

将先前删除的表恢复到删除之前的状态
恢复该表的索引以及触发器,授权
恢复该表的约束,包括唯一约束、主键约束、非空约束。外键约束不可恢复
可以实现基于系统和基于会话的flash drop操作
    alter system set recyclebin = on | off;
    alter session set recyclebin = on | off;

drop table(oracle 10g)命令并不真正删除表,在内部被映射为rename命令,即是将其重命名之后放入回收站。

二、理解表重名的过程

[email protected]> create table tb_emp as select * from emp;      					--基于emp表来创建表tb_emp
[email protected]> alter table tb_emp add constraint empno_pk primary key(empno);  --添加主键约束,将产生主键索引
[email protected]> alter table tb_emp add constraint ename_uk unique(ename);    	--添加唯一约束,将产生唯一索引
[email protected]> alter table tb_emp add constraint sal_ck check(sal>0);     	 	--添加check约束
[email protected]> alter table tb_emp modify job constraint job_nn not null;  		--添加非空约束
[email protected]> alter table tb_emp add constraint dept_fk foreign key(deptno) references dept(deptno) on delete cascade;   --添加外键约束
[email protected]> select constraint_name,constraint_type from user_constraints where table_name=‘TB_EMP‘;                    --查看tb_emp表上的所有约束 

CONSTRAINT_NAME C
--------------- -
EMPNO_PK        P
ENAME_UK        U
SAL_CK          C
JOB_NN          C
DEPT_FK         R       

--下面查看表tb_emp所在文件的id,块的起始id,大小,以及该对象的对象id等
[email protected]> select file_id,block_id,bytes from dba_extents where segment_name=‘TB_EMP‘;

   FILE_ID   BLOCK_ID      BYTES
---------- ---------- ----------
         4        393      65536

[email protected]> select object_name,object_id from dba_objects  where object_name = ‘TB_EMP‘; --查看表tb_emp的对象ID

OBJECT_NAME           OBJECT_ID
-------------------- ----------
TB_EMP                    54493     

--对表进行重命名
[email protected]> alter table tb_emp rename to tb_employees;
[email protected]> select file_id,block_id,bytes from dba_extents  where segment_name=‘TB_EMPLOYEES‘; --重命名后所在文件的id,块的起始id,大小没有发生变化

   FILE_ID   BLOCK_ID      BYTES
---------- ---------- ----------
         4        393      65536

[email protected]> select object_name,object_id from dba_objects where object_name = ‘TB_EMPLOYEES‘; --重命名后对象ID没有发生变化

OBJECT_NAME           OBJECT_ID
-------------------- ----------
TB_EMPLOYEES              54493

[email protected]> select index_name,index_type              --重命名后索引和约束也没有发生变化
  2  from user_indexes where table_name=‘TB_EMPLOYEES‘
  3  union all
  4  select constraint_name,constraint_type
  5  from user_constraints where table_name=‘TB_EMPLOYEES‘;

INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
EMPNO_PK                       NORMAL
ENAME_UK                       NORMAL
EMPNO_PK                       P
ENAME_UK                       U
SAL_CK                         C
JOB_NN                         C
DEPT_FK                        R

从上面的演示可以看出对于表的重命名仅仅是修改了表名,而对于表对象的ID,以及表存放的位置,块的起始,大小等并未发生实质性的变化。

三、删除表并实施闪回

--1.删除表tb_employees并查看回收站的信息
[email protected]> drop table tb_employees;
[email protected]> select object_name,original_name,can_undrop,base_object from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    CAN BASE_OBJECT
------------------------------ -------------------------------- --- -----------
BIN$k1zC3yEiwZvgQAB/AQBRVw==$0 TB_EMPLOYEES                     YES 54493
BIN$k1zC3yEhwZvgQAB/AQBRVw==$0 ENAME_UK                         NO  54493
BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 EMPNO_PK                         NO  54493

[email protected]> select count(1) from "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0";  --可以使用回收站名来访问对象,但要对对象加双引号

  COUNT(1)
----------
        13

--2.实施闪回并查看闪回后的情况
[email protected]> flashback table tb_employees to before drop;   --进行闪回
Flashback complete.

[email protected]> select count(1) from tb_employees;             --闪回后表存在并且可以访问

  COUNT(1)
----------
        13

[email protected]> select index_name,index_type                   --查看闪回后索引,约束的情况,发现其名称仍然为BIN$名称
  2  from user_indexes where table_name=‘TB_EMPLOYEES‘
  3  union all
  4  select constraint_name,constraint_type
  5  from user_constraints where table_name=‘TB_EMPLOYEES‘;

INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 NORMAL
BIN$k1zC3yEhwZvgQAB/AQBRVw==$0 NORMAL
BIN$k1zC3yEcwZvgQAB/AQBRVw==$0 P
BIN$k1zC3yEdwZvgQAB/AQBRVw==$0 U
BIN$k1zC3yEewZvgQAB/AQBRVw==$0 C
BIN$k1zC3yEfwZvgQAB/AQBRVw==$0 C        

从上面的查询可以看出闪回之后索引约束的名字还是使用了以BIN开头,由系统生成的名字,可以将其改回,但外键约束已经不存在了。

--3.尝试对表DML操作
[email protected]> insert into tb_employees(empno,ename,job,sal,deptno) select 9999,‘Robinson‘,‘DBA‘,3000,50 from dual;
1 row created.      --可以成功插入,deptno列的外键约束已经被删除,故deptno为号成功插入

[email protected]> alter index "BIN$k1zC3yEgwZvgQAB/AQBRVw==$0" rename to EMPNO_PK;
Index altered.      --将BIN开头的索引改回原来的名字,其余的约束名修改在此省略

--4.下面演示表空间不足时无法闪回表删除的问题
[email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘
  2  from dba_free_space where tablespace_name=‘TBS1‘
  3  group by tablespace_name;     --表空间tbs1的可用空间为M

TABLESPACE_NAME                SUM(BYTES/1024/1024)||‘M‘
------------------------------ ---------------------------------
TBS1                           .9375 M  

[email protected]> create table tb1 tablespace tbs1 as select * from dba_objects where rownum < 6000;

[email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘
  2  from dba_free_space where tablespace_name=‘TBS1‘
  3  group by tablespace_name;  --在该表空间创建表tb1之后,可用空间为.25M

TABLESPACE_NAME                SUM(BYTES/1024/1024)||‘M‘
------------------------------ ---------------------------------
TBS1                           .25 M

[email protected]> drop table tb1;   --将表tb1删除

[email protected]> show recyclebin;  --删除后的对象位于回收站中
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TB1              BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TABLE        2010-10-25:12:05:18    

[email protected]> select object_name,original_name,can_undrop, base_object from user_recyclebin;

OBJECT_NAME                    ORIGINAL_N CAN BASE_OBJECT
------------------------------ ---------- --- -----------
BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TB1        YES       54531

[email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘
  2   from dba_free_space where tablespace_name=‘TBS1‘
  3   group by tablespace_name;   --表空间tbs1显示的可用空间已返还为1M
                                  --但并不是真正为M,在需要表空间时,将自动清除回收站最老的对象,以满足当前空间需求
TABLESPACE_NAME                SUM(BYTES/1024/1024)||‘M‘
------------------------------ -------------------------------
TBS1                           .9375 M

[email protected]> select tablespace_name,autoextensible   --这个查询可以看出表空间tbs1不能自动扩展
  2  from dba_data_files where tablespace_name =‘TBS1‘;

TABLESPACE_NAME AUT
--------------- ---
TBS1            NO

[email protected]> create table tb2 tablespace tbs1 as select * from dba_objects  --再次在表空间创建新表tb2
  2  where rownum < 6000;   

[email protected]> show recyclebin;  --此时回收站中原来的表tb1记录被自动清除

[email protected]> select object_name,original_name,can_undrop,
  2  base_object from user_recyclebin;

no rows selected

[email protected]> flashback table tb1 to before drop;  --此时表tb1不能被闪回
flashback table tb1 to before drop
*
ERROR at line 1:
ORA-38305: object not in RECYCLE BIN

四、回收站的管理

每个用户都拥有自己的回收站,且可以查看在自己模式中删除的表
使用purge命令可以永久删除对象,回收空间
purge命令的几种常用形式
    drop table tbname purge    --直接删除表,而不置于回收站
    purge table tbname         --清除回收站中的tbname表
    purge index idx_name       --清除回收站中的索引idx_name
    purge tablespace tablespace_name   --清除该表空间中所有已删除的对象
    purge tablespace tablespace_name user user_name  --清除表空间中指定用户删除的对象
    purge user_recyclebin      --清除指定用户已删除的所有对象
    purge dba_recyclebin       --清除所有已删除的对象

五、总结

通过对上述表的删除及空间分配情况,总结如下:
1.表的删除被映射为将表的重命名,然后将其置于回收站
2.表的索引,触发器,授权闪回后将不受到影响.索引,触发器名字可以根据需要进行更改回原来名称
3.对于约束,如果是外键约束,表删除之后将不可恢复,其余的约束不受影响
4.如果要查询回收站中的对象,建议将对象名使用双引号括起来
5.闪回的实质并不能撤销已提交的事务,而是构造倒退原有事务影响的另一个事务
6.对于已经删除的表如果在所在的表空间新增对象由于空间不足的压力而被重用将导致闪回失败
7.对于表空间不足时,系统会自动清除回收站中最老的对象,以满足当前需求,即采用FIFO原则
8.闪回表的常用方法
    flashback table tbname to before drop ;
    flashback table tbname to before drop rename to newtbname;
    第二条语句用于被删除的表名已经被再次重用,故闪回之前必须将其改名为新表名,schema不变化
9.如回收站中存在两个相同的原表名,则闪回时总是闪回最近的版本,如果闪回特定的表,需要指定
    该表在回收站中的名称。如
    flashback table "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0" to before drop;
10.flashback drop 不能闪回truncate命令截断的表,而是只能恢复drop 之后的表
11.flashback drop 不能闪回drop user scott cascade删除方案的操作,此只能用flashback database
12.在system表空间中存储的表无法启用flashback drop,且这些表会被立即删除

与回收站相关两个重要的视图:
	dba_recyclebin
	user_recyclebin

原文地址:https://www.cnblogs.com/llill/p/8623900.html

时间: 2024-10-17 14:16:43

2.Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)的相关文章

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --===================================== 闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数据被DML的

4. Oracle 闪回特性(Flashback Version、Flashback Transaction)

转载自:https://blog.csdn.net/leshami/article/details/6112981 Oracle闪回特性为数据的快速回复某一对象的特定数据提供了更多的便利.前面介绍了闪回的几种特性,包括flashback database,flashback drop ,flashback query ,flashback table .接下来本文将介绍Flashback Version与Flashback Transaction. 一.Flashback Version Que

专题实验 oracle 闪回特性

在 oracle 9i 之前的版本中, 如果用户因为误操作 delete 或 update 并提交了, 那么恢复这些用户的操作错误是极其低效的. 为此, oracle 提供了闪回功能, 通过回退, 我们可以找回正确的数据. oracle 闪回查询特性 通过闪回查询我们可以按照时间戳或SCN来向前查询, 获取修改之前的数据镜像, 再通过insert等操作就可以恢复数据. 闪回查询一来于回滚段中存储的数据前镜像, 在oracle9i以前的版本中, 通常只要事务提交后, 前镜像数据就可以被覆盖, 空间

PLSQL_闪回删除FlashBack Drop表误删除如何进行恢复(案例)

2014-06-25 BaoXinjian 一.摘要 在PLSQL开发时,有时候会遇到对表的误删除,其实遇到这种情况不需要紧张,如果问题较大,请DBA帮忙,如果只是小问题,只需自己处理,利用flashback闪回操作即可,可将表进行恢复 在删除表时,系统一般都是表放入回收站中,并没有完全进行删除,因此,只需从回收站中进行恢复就可以了,原理和Window中的回收站一样,但是一旦将回收站中的资料再进行删除,这个就很难恢复了,只能向DBA求救 1. 回收站的概念 回收站,是一个虚拟的容器,用于存放所有

oracle闪回(flashback)的部分实用操作(彻底删除的除外)

一.数据delete并且commit提交之后的闪回 (一):根据时间来恢复:1.查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;2.查询删除数据时间点之前的数据select * from 表名 as of timestamp to_timestamp('2018-08-11 16:12:11','yyyy-mm-dd hh2

Oracle闪回技术(Flashback)

闪回技术有闪回表.闪回删除.闪回查询.闪回事务查询.闪回事务.闪回数据库.闪回数据归档.其中,闪回查询.闪回事务查询用来“观察”过去:闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口:闪回表.闪回删表能够以表为单位“回到”过去:闪回事务能够以事务为单位“回到”过去:闪回数据库能够以数据库为单位“回到”过去. 一. 闪回表(Flashback Table) 闪回表是利用UNDO表空间的撤销数据,所以能把表闪回到多久之前受到undo_retention,UNDO表空间的数据文件是否启

Oracle 闪回 flashback

闪回:修复逻辑错误,从当前的点往回退 1.闪回有专门的闪回日志,存放在FIA中,但是只有闪回数据库会用到 2.如果做全数据库的闪回,相当于一次不完全恢复 基于时间点的闪回 SQL> flashback table t_wh_prodlib to timestamp to_timestamp('2015-03-03 12:10:07', 'yyyy-mm-dd hh24:mi:ss'); 将数据库闪回到20150303 12:10:07 如果基于时间点的闪回报错 ERROR at line 1:

Oracle 闪回

Oracle闪回技术 1.Flashback Database 2.Flashback Drop 3.Flashback Table 4.Flashback Query 1.Flashback Database(利用闪回日志恢复) 描述:Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN.闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,如ctrl+Z操作,可以不利用备份就快速的

Oracle闪回技术详解

概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEGMENT) 在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段.因为大部分闪回技术