在每一次drop 表之后,这个视图会多出一条数据, 而且无法删除。 这是 oracle 的闪回技术, 意思是:
闪回技术有闪回表、闪回删除、闪回查询、闪回事务查询、闪回事务、闪回数据库、闪回数据归档。其中,闪回查询、闪回事务查询用来“观察”过去;闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口;闪回表、闪回删表能够以表为单位“回到”过去;闪回事务能够以事务为单位“回到”过去;闪回数据库能够以数据库为单位“回到”过去。
一、 闪回表(Flashback Table)
闪回表是利用UNDO表空间的撤销数据,所以能把表闪回到多久之前受到undo_retention,UNDO表空间的数据文件是否启动自动增长功能,是否设置guarantee等三种因素的影响。
1. 闪回到具体时间
SQL> flashback table scott.emp to timestamp to_timestamp('2014-09-16 04:32:00','yyyy-mm-dd hh24:mi:ss');
2. 闪回到10分钟之前
SQL> flashback table scott.emp to timestamp(systimestamp-interval '10' minute);
3. 将scott.emp闪回到SCN为1086000的时候
SQL> flashback table scott.emp to scn 1086000;
--关于SCN与时间戳间如何转换可参看Oracle碎碎念第31条
4. 将scott.emp和scott.dept两张表同时闪回到SCN为1086000的时候(主要用于有外键约束的表)
SQL> flashback table scott.emp,scott.dept to scn 1086000;
使用闪回表注意如下事项:
(1)被闪回的表必须启用行移动功能
SQL> alter table dept enable row movement;
(2)“FLASHBACK TABLE”命令的执行者必须有“FLASHBACK ANY TABLE”系统权限或者在被闪回的表上具有“FLASHBACK”对象权限。
(3)“FLASHBACK TABLE”属于DDL命令,隐式提交。
(4)SYS用户的任何表无法使用此功能。
二、 闪回删表(Flashback Drop)
闪回删表指的是撤销“DROP TABLE”的效果。
1. 闪回被删掉的scott.emp表
SQL> flashback table scott.emp to before drop;
2. 表被删掉后,又新建了一个同名表,如果试图用上述命令闪回原表,则会报ORA-38312: original name is used by an existing object错误,可重新命名。
SQL> flashback table test to before drop rename to test1;
3. 如果表名重复,则闪回时遵循后入先出的原则。
4. 闪回时可指明被恢复的回收站对象
SQL> flashback table "BIN$AyId7ZbBjWngUKjADQIIuA==$0" to before drop;
闪回删表的工作原理是:当“drop table”命令执行时,表及其索引并没有被真正删除,其所占空间只是分配给了另一个数据库对象:回收站对象,本质上相当于重命名。注意:表空间在自动增长的压力下会按照先入先出的规则将回收站对象的空间分配给需要空间的段,在将回收站对象耗尽之前数据文件是不会自动增长的。
5. 可禁用回收站功能
SQL> alter system set recyclebin='OFF' scope=spfile;
6. 删除当前用户回收站的所有对象
SQL> purge recyclebin;
闪回技术?(flashback)
只能通过备份文件来恢复。oracle10g开始为了解决误删除表的时候不是立刻删除,而是将表暂时放到回收站。
解决办法就是: 可直接在plsql执行
查看有什么表在回收站
select object_name, original_name from recyclebin
把误删的表恢复
flashback table myemp to before drop;
select * from myemp
这样才真的删除表
drop table myemp purge
在回收站里删除表
purge table empbb
清空回收站:
purge recyclebin
参考:
https://www.cnblogs.com/ivictor/p/3975339.html
https://www.cnblogs.com/zttjava/articles/5057222.html