参考资料:Using Oracle Flashback Technologylinux
Oracle 11g的新特性闪回操做程序员
闪回查询数据库
闪回数据segmentfault
下面会分别介绍这些操做。在介绍这些操做以前先看下闪回特性是否开启。架构
<!--more-->oracle
参考资料:app
Configuring Your Database for Oracle Flashback Technologyide
确认数据库闪回特性已经启用:v$database测试
SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO
若是闪回特性没有启用,则须要先启用闪回。
打开闪回的步骤:
SQL> shutdown immediate; SQL> startup mount; SQL> alter database flashback on; SQL> alter database open;
打开以后可再次检查闪回特性是否打开。只要打开了闪回特性,就能够进行闪回操做。
参考资料:Using Oracle Flashback Query (SELECT AS OF)
查询某一个历史时间点的数据。
查询某个时间点表中的数据——某个时间点表中快照的数据。
SQL> create table t(x int , y int); 表已建立。 SQL> insert into t values(1,2); 已建立 1 行。 SQL> insert into t values(2,3); 已建立 1 行。 SQL> SQL> commit; 提交完成。 SQL> select * from t; X Y ---------- ---------- 1 2 2 3 SQL> set time on 21:11:45 SQL> delete from t where x=1; 已删除 1 行。 21:12:11 SQL> commit; 提交完成。 21:12:18 SQL> select * from t; X Y ---------- ---------- 2 3 21:12:21 SQL> select * from t as of timestamp to_timestamp('2016-03-21 21:11:45' ,'yyyy-mm-dd hh24-mi-ss'); X Y ---------- ---------- 1 2 2 3
可见删除的数据已经提交,可是仍是能够闪回查询到以前时间的数据。其中hh24表示能够用24小时制,不然只能小时不能超过12。至于为何分钟用mi而不用mm,那是由于规定的格式就是mi,换成mm会显示和以前的月份mm冲突,换成其余的会显示日期格式没法识别。
基于SCN的闪回查询
若是有修改时候的SCN,那么就能够基于SCN进行闪回查询
21:18:34 SQL> select * from t; X Y ---------- ---------- 2 3 21:20:36 SQL> select current_scn from v$database; CURRENT_SCN ----------- 2891887 21:20:53 SQL> insert into t values(3,4); 已建立 1 行。 21:21:13 SQL> commit; 提交完成。 21:21:16 SQL> select * from t; X Y ---------- ---------- 2 3 3 4 21:21:26 SQL> select * from t as of scn 2891887; X Y ---------- ---------- 2 3
可见基于SCN闪回查询获得插入数据以前表中的数据
闪回版本查询也就是flashback versions query。
一个时间段内的某一行的全部版本,以及改变该行的全部事务。
参考资料:
Using Oracle Flashback Version Query
闪回事务查询也便是flashback trasaction query
闪回一个事务对数据的全部改变。
参考资料:
Using Oracle Flashback Transaction Query
将表闪回到历史的某个时刻。
SQL> create table t(id int); 表已建立。 SQL> insert into t values(100); 已建立 1 行。 SQL> insert into t values(200); 已建立 1 行。 SQL> commit; 提交完成。 SQL> select rowid,id from t; ROWID ID ------------------ ---------- AAASaxAABAAAV3xAAA 100 AAASaxAABAAAV3xAAB 200 SQL> select current_scn from v$database; CURRENT_SCN ----------- 2960668 SQL> delete from t; 已删除2行。 SQL> commit; 提交完成。 SQL> select * from t; 未选定行 SQL> alter table t enable row movement; 表已更改。 SQL> select * from t; 未选定行 SQL> flashback table t to scn 2960668 2 ; flashback table t to scn 2960668 * 第 1 行出现错误: ORA-08185: 用户 SYS 不支持闪回 SQL> show recyclebin SQL>
解释1:因为当前是sys用户,会显示:
ORA-08185: 用户 SYS 不支持闪回
闪回技术只适用于普通用户而不适用于sys用户。system用户也不适用。
解释2:必需要启用表的行移动功能,不然不能闪回表。
参考资料:Oracle闪回功能详解
因为闪回技术不支持sys用户,因此使用普通用户测试。
Oracle10g之后,当咱们删除表时,默认Oracle只是在数据库字典里面对被删的表的进行了重命名,并无真正的把表删除。
回收站(recyclebin):用来维护表被删除前的名字与删除后系统生成的名字之间的对应关系的数据字典,表上的相关对象(索引、触发器等)也会一并进入回收站。
只有dba(sys,system)才有权限执行查询recyclebin的状态。
SQL> show parameter recyclebin; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string on
能够发现recyclebin是开启状态,若是发现是关闭状态,能够经过下面命令开启
alter system set recyclebin=on;
若是要关闭回收站功能,使用下面的命令:
alter system set recyclebin=off;
禁用后删除的对象将直接删除,不会写到Recyclebin中。
因为sys用户和system用户不支持闪回技术,因此咱们须要切换到普通用户进行实验,实验效果以下:
SQL> create table t(id int); 表已建立。 SQL> insert into t values(1); 已建立 1 行。 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$zqOXt7xBRA2SKyG5nGxb5w==$0 TABLE 2016-03-22:17:18:33 SQL> drop table t; 表已删除。 SQL> commit; 提交完成。 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$lpoDEIX2SSGAQt9TL3gUTA==$0 TABLE 2016-03-22:17:22:24 T BIN$zqOXt7xBRA2SKyG5nGxb5w==$0 TABLE 2016-03-22:17:18:33 SQL> select * from "BIN$lpoDEIX2SSGAQt9TL3gUTA==$0"; ID ---------- 1 SQL> flashback table t to before drop; 闪回完成。 SQL> select * from t; ID ---------- 1
能够所有清空回收站,也可只清空回收站的部分文件。
所有清空回收站
SQL> purge recyclebin;
部分清空回收站
##假定回收站中有一个文件的ORIGINAL NAME是t1,永久删除他t1表 SQL> purge table t1;
虽然Oracle并没真正删除被回收的表,可是在Oracle看来这一块空间已是自由的(free)。使用下面的演示能够查看效果:(在普通用户下验证便可)
SQL> create table t as select * from user_objects; 表已建立。 SQL> select sum(blocks) from user_free_space where tablespace_name='USERS'; SUM(BLOCKS) ----------- 96 SQL> drop table t; 表已删除。 SQL> select sum(blocks) from user_free_space where tablespace_name='USERS'; SUM(BLOCKS) ----------- 104 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$kMskKvD5SJqmwaC5WDQiAg==$0 TABLE 2016-03-22:18:31:43 SQL> select blocks from user_segments where segment_name='BIN$kMskKvD5SJqmwaC5WDQiAg==$0'; BLOCKS ---------- 8
实验效果代表删除表以后用户自由空间增大了,而且大小恰好就是回收站中的对应的表的大小。可见这一块空间在Oracle看来已是free_space了。
参考资料:
Using Flashback Data Archive (Oracle Total Recall)
闪回归档:Flashback Data Archive。Oracle Total Recall,也即Oracle全面回忆功能。
闪回数据归档能够和咱们一直熟悉的日志归档类比,日志归档记录的是Redo的历史状态,用于保证恢复的连续性;而闪回归档记录的是UNDO的历史状态,能够用于对数据进行闪回追溯查询;后台进程LGWR用于将Redo信息写出到日志文件,ARCH进程负责进行日志归档;在Oracle 11g中,新增的后台进程FBDA(Flashback Data Archiver Process)则用于对闪回数据进行归档写出。
具体操做见参考资料。
参考资料:Oracle DB闪回(Flashback database)开启笔记
数据库的闪回
闪回数据库架构Flashback database architecture
开启闪回数据库功能以后,会在SGA中开辟内存Flashback buffer,会记录buffer cache中的部分改变而后后台恢复写入进程RVWR将记录写入闪回日志Flashback logs中。FBDA进程(Flashback Data Archive )则会将Flashback logs进行归档。
这个过程和重作日志很是很是的相似。
记得帮我点赞哦!
精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你须要的学习资料,还在等什么?快去关注下载吧!!!
念念不忘,必有回响,小伙伴们帮我点个赞吧,很是感谢。
我是职场亮哥,YY高级软件工程师、四年工做经验,拒绝咸鱼争当龙头的斜杠程序员。听我说,进步多,程序人生一把梭
若是有幸能帮到你,请帮我点个【赞】,给个关注,若是能顺带评论给个鼓励,将不胜感激。
职场亮哥文章列表:更多文章
本人全部文章、回答都与版权保护平台有合做,著做权归职场亮哥全部,未经受权,转载必究!