--==============================================
-- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
--==============================================
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命令,即是将其重命名之后放入回收站。
二、理解表重名的过程
scott@ORCL> create table tb_emp as select * from emp; --基于emp表来创建表tb_emp
scott@ORCL> alter table tb_emp add constraint empno_pk --添加主键约束,将产生主键索引
2 primary key(empno);
scott@ORCL> alter table tb_emp add constraint ename_uk --添加唯一约束,将产生唯一索引
2 unique(ename);
scott@ORCL> alter table tb_emp add constraint sal_ck check(sal>0); --添加check约束
scott@ORCL> alter table tb_emp modify job constraint job_nn not null; --添加非空约束
scott@ORCL> alter table tb_emp add constraint dept_fk --添加外键约束
2 foreign key(deptno) references dept(deptno) on delete cascade;
scott@ORCL> select constraint_name,constraint_type --查看tb_emp表上的所有约束
2 from user_constraints where table_name='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等
sys@ORCL> select file_id,block_id,bytes from dba_extents where segment_name='TB_EMP';
FILE_ID BLOCK_ID BYTES
---------- ---------- ----------
4 393 65536
sys@ORCL> select object_name,object_id from dba_objects --查看表tb_emp的对象ID
2 where object_name = 'TB_EMP';
OBJECT_NAME OBJECT_ID
-------------------- ----------
TB_EMP 54493
--对表进行重命名
scott@ORCL> alter table tb_emp rename to tb_employees;
sys@ORCL> select file_id,block_id,bytes from dba_extents --重命名后所在文件的id,块的起始id,大小没有发生变化
2 where segment_name='TB_EMPLOYEES';
FILE_ID BLOCK_ID BYTES
---------- ---------- ----------
4 393 65536
sys@ORCL> select object_name,object_id from dba_objects --重命名后对象ID没有发生变化
2 where object_name = 'TB_EMPLOYEES';
OBJECT_NAME OBJECT_ID
-------------------- ----------
TB_EMPLOYEES 54493
scott@ORCL> 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并查看回收站的信息
scott@ORCL> drop table tb_employees;
scott@ORCL> select object_name,original_name,can_undrop,
2 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
scott@ORCL> select count(1) from "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0"; --可以使用回收站名来访问对象,但要对对象加双引号
COUNT(1)
----------
13
2.实施闪回并查看闪回后的情况
scott@ORCL> flashback table tb_employees to before drop; --进行闪回
Flashback complete.
scott@ORCL> select count(1) from tb_employees; --闪回后表存在并且可以访问
COUNT(1)
----------
13
scott@ORCL> 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操作
scott@ORCL> insert into tb_employees(empno,ename,job,sal,deptno)
2 select 9999,'Robinson','DBA',3000,50 from dual;
1 row created. --可以成功插入,deptno列的外键约束已经被删除,故deptno为号成功插入
scott@ORCL> alter index "BIN$k1zC3yEgwZvgQAB/AQBRVw==$0" rename to EMPNO_PK;
Index altered. --将BIN开头的索引改回原来的名字,其余的约束名修改在此省略
4.下面演示表空间不足时无法闪回表删除的问题
sys@ORCL> 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
flasher@ORCL> create table tb1 tablespace tbs1 as select * from dba_objects
2 where rownum < 6000;
sys@ORCL> 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
flasher@ORCL> drop table tb1; --将表tb1删除
flasher@ORCL> show recyclebin; --删除后的对象位于回收站中
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TB1 BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TABLE 2010-10-25:12:05:18
flasher@ORCL> select object_name,original_name,can_undrop,
2 base_object from user_recyclebin;
OBJECT_NAME ORIGINAL_N CAN BASE_OBJECT
------------------------------ ---------- --- -----------
BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TB1 YES 54531
sys@ORCL> 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
sys@ORCL> select tablespace_name,autoextensible --这个查询可以看出表空间tbs1不能自动扩展
2 from dba_data_files where tablespace_name ='TBS1';
TABLESPACE_NAME AUT
--------------- ---
TBS1 NO
flasher@ORCL> create table tb2 tablespace tbs1 as select * from dba_objects --再次在表空间创建新表tb2
2 where rownum < 6000;
flasher@ORCL> show recyclebin; --此时回收站中原来的表tb1记录被自动清除
flasher@ORCL> select object_name,original_name,can_undrop,
2 base_object from user_recyclebin;
no rows selected
flasher@ORCL> 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
六、更多参考
有关基于用户管理的备份和备份恢复的概念请参考:
Oracle 冷备份
Oracle 热备份
Oracle 备份恢复概念
Oracle 实例恢复
Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
有关RMAN的恢复与管理请参考:
RMAN 概述及其体系结构
RMAN 配置、监控与管理
RMAN 备份详解
RMAN 还原与恢复
有关Oracle体系结构请参考:
Oracle 实例和Oracle数据库(Oracle体系结构)
Oracle 表空间与数据文件
Oracle 密码文件
Oracle 参数文件
Oracle 数据库实例启动关闭过程
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 控制文件(CONTROLFILE)
Oracle 归档日志
分享到:
相关推荐
Oracle 闪回特性 FLASHBACK & RECYCLEBIN Flashback 系列是 Oracle 数据库中的一组功能强大且实用的闪回机制,旨在帮助数据库管理员和开发者快速恢复数据库中的各种对象,包括表、数据、事务等。Flashback 系列的...
flashback drop是指Oracle提供的闪回技术中的一种,它允许用户通过闪回查询功能将被删除的对象从回收站中恢复。这个功能使得在误删除对象后能够迅速而准确地恢复数据,缩短了数据恢复的时间,减少了数据丢失的风险...
3. **闪回表(Flashback Table)**:在Oracle 10g及更高版本中,扩展了闪回特性,支持闪回表操作。如果用户误删除了一个表,可以使用`FLASHBACK TABLE`命令将表恢复到删除之前的状态。例如,使用`FLASHBACK TABLE ...
Oracle闪回技术是一项强大的特性,能够在无需借助传统的备份和恢复流程的情况下,帮助用户恢复丢失或损坏的数据。本文将涵盖闪回删除表、闪回删除、闪回查询等多种闪回类型,并通过具体的实例加深理解。 #### ...
Oracle 闪回技术是Oracle数据库提供的一种强大的数据恢复机制,它允许用户恢复到数据库的某个历史状态,而无需依赖传统的备份和恢复过程。这一技术基于Oracle的多版本并发控制(MVCC)机制,使得数据库能够记录和...
- **Oracle 10g**:增强了闪回功能,加入了闪回表(Flashback Table)特性,使得恢复被删除的表变得非常简单。 ##### 2. **Flashback 表的工作原理** 当表被删除时,Oracle 10g 并不会立即将表彻底删除,而是将其...
### Oracle 闪回已删除的表 在Oracle数据库管理中,**闪回删除的表**是一项非常实用的功能,它允许数据库管理员(DBA)恢复被误删的表及其所有数据。这一特性最早出现在Oracle 9i版本中,但在Oracle Database 10g中...
Oracle闪回技术是Oracle数据库中一项非常重要的特性,它主要用于逻辑错误的恢复,而非物理损坏的修复。这项技术可以帮助数据库管理员在遇到逻辑错误的情况下,比如误删数据或者更新错误等,能够迅速地恢复到错误发生...
Oracle Flashback技术是数据库管理系统中的一种高级特性,它允许用户恢复到数据库的某个历史状态,无需进行复杂的备份和恢复操作。这项技术主要基于事务日志和快照来实现,为数据库管理员提供了极大的便利,尤其在...
值得注意的是,闪回操作依赖于数据库的闪回日志(Flashback Log)和事务日志,因此必须确保这些日志文件有足够的空间以支持闪回操作。此外,闪回功能可能会受制于数据库的闪回区大小和回收站策略,过度依赖闪回可能...
在使用闪回技术时,确保已启用闪回日志(Flashback Log)并合理设置回收站(Recyclebin),这是闪回操作的基础。同时,了解并实施适当的权限和安全策略,以防止未授权的闪回操作。 总之,Oracle的闪回技术为数据库...
在Oracle数据库中,闪回功能是一组强大的特性集合,允许数据库管理员或用户在发生数据丢失或错误更改时,能够恢复到之前的某个状态。这些特性包括但不限于闪回表、闪回删除、闪回版本查询以及闪回事务查询等。下面将...
根据提供的文件信息,本文将详细解释Oracle数据库中的闪回功能,包括闪回查询、闪回删除等关键概念及其应用场景。 ### Oracle数据库闪回 #### 一、闪回的基础概念 Oracle数据库的闪回功能允许用户恢复到过去某个...
- 插入数据 `INSERT INTO test (a) VALUES ('测试flashbackdrop')`; - 提交 `COMMIT`; - 错误地删除表 `DROP TABLE test`; - 使用 Flashback Drop 恢复表 `FLASHBACK TABLE test TO BEFORE DROP`; ##### 5. ...
本文将围绕“恢复drop的表和记录”这一主题,深入探讨如何利用Oracle数据库的闪回技术来恢复被DROP的表,以及在实际操作中需要注意的关键点。 ### Oracle闪回技术简介 Oracle数据库的闪回技术是一种非常强大的数据...
6. **闪回DROP**:如果误删表,可通过回收站(Recyclebin)进行恢复。 二、Oracle闪回使用详解 1. **开启闪回** - **开启归档日志**:首先确保数据库处于归档模式,可以使用`archive log list`命令检查,若未...
根据提供的文件信息,本文将详细解释Oracle数据库中的闪回功能及其三种主要操作模式:使用回退段闪回到不同版本、使用回收站闪回已被删除的表以及利用快速恢复区进行闪回。 ### 一、使用回退段闪回到不同版本 在...
闪回技术是Oracle数据库的一个关键特性,它允许用户“时光倒流”,回溯到数据库的某个历史状态,以便进行错误修复或者数据分析。以下是针对每个视频的详细知识点: 1. **其他闪回技术** - 闪回查询(Flashback ...