Oracle的回收站和闪回查询机制(一)
实际工作中,我们经常会遇到一些情况,误删除某些表或某些表的某些记录,这时候就需要我们将这些记录重新插入进去。如何才能解决这个问题呢?
Oracle的Flashback query(闪回查询)为我们解决了这个问题 ,他的原理是Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回。
下面我们先从简单的例子来看闪回查询的用法;
现有一张表有如下的数据
如果误执行了delete语句,删除其中一条记录,或插入一个废数据,修改了另外一个记录,
delete hb where 姓名 = '张三';
insert into hb (姓名, 语文, 数学, 物理) values ('王五', 99, 99, 99);
update hb set 语文 = '60', 数学 = '60', 物理 = '60' where 姓名 = '李四';
这些操作,此时得到了如下的数据
我现在希望以上的操作全部回退,回到这最初始的状态,此时就需要用到我们的Oracle提供的闪回查询,
上面的闪回是基于时间点的,前面也说了还可以基于SCN来查询,道理是一样的,
通过查询系统参数表,知道10点31分是28分的后面,所以我们查询的所依据的SCN则采用14119586030431;
SELECT hb.*, sysdate FROM hb AS OF scn 14119586030431;
一样可以得到上面的结果。这些都是查询修改前的数据记录,我们也可以直接将表整体闪回
flashback table hb to scn 14119586030431;
在此需要说明的是Oracle每5分钟记录一次SCN,并将SCN和对应时间的映射进行纪录。如果原来插入的记录到做闪回操作的时间在5分钟之内,用基于时间的闪回查询可能得不到记录,因为基于时间点的查询实际上是转化为最近的一次SCN,然后从这个SCN开始进行恢复。因此,如果需要精确的查询可以采用基于SCN的闪回查询,可精确闪回到需要恢复的时间。可以通过
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
获得系统当前的SCN。
(由于快照时间太久了,这上面我采用的新的SCN)这上面的是可以查看对应的时间段内对表所进行的操作:
versions_startscn,versions_starttime记录了操作时的SCN或时间,如果为空,表示在查询范围外创建的
versions_endscn,versions_endtime记录了失效时的SCN或时间,配合version_operation列查看,如果为空,或者被删除、或者该记录当前时间在当前表不存在
versions_operationI:insert D:delete U:update
versions_xid事务ID
以上这些都是表记录级别的闪回查询。知道了如何使用使用使用闪回查询,那么原理呢?
我们知道,在Oracle中数据都是存储在表空间中的,而闪回查询就是查询undo空间里的数据来实现的。
回滚段(undo)用于存放数据修改之前的位置和值,回滚段的头部包含正在使用的该回滚段事务的信息。回滚段的作用如下:
(1)事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务时,Oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
(2)事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,Oracle将在下次打开数据库时利用回滚来恢复未提交的数据。
(3)读一致性:当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。这里就涉及到Oracle的事务级别,在此不做讨论。
而Oracle的delete和commit操作的流程:
(1)delete流程 ,首先Oracle将数据块读到缓冲区中; 在“重做日志缓冲区”中记录delete操作的全过程;在相应回滚段段头的事务表中创建一个回滚条目;将要删除的记录创建前镜像并存放到回滚段中;最后将相应的数据块上删除记录并标记相应的数据块为dirty。
(2)commit流程 ,Oracle产生一个SCN;在回滚段事务表中标记此事务为committed,然后日志读写进程将日志缓冲区中的记录写到日志文件。
所以后面我们通过闪回读取的记录都是回滚段中记录的,换句话说,回滚段中有的数据我们可以通过闪回查询查出来,没有的数据的话就无法通过这个技术。
因此,要使用闪回查询,undo_management必须设置为AUTO,undo_retention是undo保存数据的时间,单位是秒,设置的越大,就需要更大的表空间来支持,undo_tablespace即时回滚表空间的名称。
Oracle的回收站和闪回查询机制(一)的更多相关文章
- Oracle的回收站和闪回查询机制(二)
上一篇中讲诉了Oracle中一些闪回查询(Flashback Query),这是利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照).要注意的是,Flashback Query仅仅是查询以前 ...
- oracle闪回查询
一.引言 程序中用到需要同步oracle更新和删除数据,于是考虑利用oracle的闪回查询机制来实现. 利用该机制首先需要oracle启用撤销表空间自动管理回滚信息,并根据实际情况设置对数据保存的有效 ...
- oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复
我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...
- Oracle Flashback Technologies - 闪回查询
Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...
- Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点
Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...
- Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询
emmmm 写这个博客心情很复杂,,,本来这个触发器早就写好了,后来发生点事就写个博客当个备份吧,就当留纪念了:话不多数上问题以及SQL: 问题: 在ABONPB表上增加一个触发器,针对车牌号字段做u ...
- Oracle闪回查询恢复delete删除数据
Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback q ...
- Oracle Flashback Technology【闪回技术】
-------------------------与其他数据库相比,Oracle的闪回让开发者多了一条选择的路. Flashback的目的 先看下Oracle官方文档中的解释: Oracle Flas ...
- 【转】FlashBack总结之闪回查询与闪回表
本文主要介绍利用UNDO表空间的闪回技术,主要包括:闪回表,闪回版本查询,闪回事务查询,闪回查询.这些闪回技术实现从回滚段中读取表中一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错 ...
随机推荐
- AFNetworking使用
1.访问网络获取Json //Get方法 NSString *str = @"http://api.xxx.cc/product/found.jhtml"; NSDictionar ...
- Camel、Pastal、匈牙利标记法区别及联系
在英语中,依靠单词的大小写拼写复合词的做法,叫做"骆驼拼写法"(CamelCase).比如,backColor这个复合词,color的第一个字母采用大写. 这种拼写法在正规的英语中 ...
- 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
http://www.mzwu.com/article.asp?id=3611 因为新加了Microsoft.CSharp的引用, 只需要重新生成一下项目,就可以消除这个错误提示
- [HDOJ4635]Strongly connected(强连通分量,缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一张图,问最多往这张图上加多少条边,使这张图仍然无法成为一个强连通图. 起初是先分析样例 ...
- oj放苹果
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m< ...
- sh.exe": grunt: command not found
今天在git命令行工具中使用 grunt的时候,总是提示我找不到grunt命令,如: sh.exe": grunt: command not found 但是我运行 npm install ...
- HighCharts 饼图
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @section ...
- bzoj1563
P<=10一开始是吓死我了 后来想到这就是一个经典的决策单调性解决1d1d动态规划的题目 像决策单调性完全可以打表找规律,这里有一篇严谨的证明https://www.byvoid.com/blo ...
- UVa 12186 Another Crisis
题意: 给出一个树状关系图,公司里只有一个老板编号为0,其他人员从1开始编号.除了老板,每个人都有一个直接上司,没有下属的员工成为工人. 工人们想写一份加工资的请愿书,只有当不少于员工的所有下属的T% ...
- 修改数据库中group_concat的返回结果的长度限制
修改数据库中group_concat的返回结果的长度限制 我们可以使用Mysql的客户端管理工具,Sqlyog 新建一个查询编辑器 显示 SHOW VARIABLES LIKE "grou ...