oracle中的闪回
项目中运用:
首先说明:闪回方法有一个前提,就是需要尽早的发现问题,果断的采取行动。若误操作的记录已经在UNDO表空间中被清除,则此方法就不可行了,需要另寻他法。
例如:
SELECT * FROM tb_moko_info_basic AS OF TIMESTAMP TO_TIMESTAMP('2014-12-16 9:50:24', 'YYYY-MM-DD HH24:MI:SS') WHERE receipt_num = 'P14120100496';
使用闪回功能快速恢复用户的误操作
Oracle提供的闪回特性对于快速恢复误操作的数据起到了非常大的帮助。在没有这个特性的Oracle早期版本,如果需要恢复因用户错误导致的数据丢失,需要大量的时间和精力去做不完全恢复。 不过,这种用空间换时间的策略也存在限制,不可能无限地恢复任何时间点的误操作。针对那些“及时”发现的误操作,使用该方法进行恢复是非常有效的。
简单演示一下这个方法,供参考。
1.创建实验表T sec@ora10g> create table t (x int);
Table created.
2.初始化数据 sec@ora10g> insert into t values (1);
1 row created.
sec@ora10g> commit;
Commit complete.
sec@ora10g> insert into t values (2);
1 row created.
sec@ora10g> commit;
Commit complete.
3.查看表中的数据,之所以使用rowid字段是为了后面实验参考方便。 sec@ora10g> select rowid, x from t;
ROWID X ------------------ ---------- AAASVaAAFAAAAAYAAA 1 AAASVaAAFAAAAAYAAB 2
4.模拟误删除 sec@ora10g> delete from t;
2 rows deleted.
sec@ora10g> commit;
Commit complete.
5.看一看此时T表有哪些动作被记录在案? sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X --------------------- --------------------- ---------------- - ---------- 05-DEC-09 09.52.51 PM 09002C004B250000 D 2 05-DEC-09 09.52.51 PM 09002C004B250000 D 1 05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2 05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
因为前后的操作时间并不是很长,所以对于T表的所有操作都清晰的展示出来了。
6.恢复方法一:使用UNDO SQL。 重点关注一下“VERSIONS_XID”的内容,每一个不同的值都对应了一个完整的操作动作。我们逐条看一下上面每个动作对应的恢复语句。 1)如果要恢复误删除的操作,可以使用下面的UNDO SQL。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL ---------------------------------------------------------------------- insert into "SEC"."T"("X") values ('2'); insert into "SEC"."T"("X") values ('1');
2)向前一步回滚:回滚插入的“2”,即删除记录“2”对应的行。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090018004B250000';
UNDO_SQL ---------------------------------------------------------------------- delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAB';
3)再向前回滚:回滚插入的“1”,即删除记录“1”对应的行。 sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090008004B250000';
UNDO_SQL ---------------------------------------------------------------------- delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAA';
7.恢复方法二:使用SCN号进行便捷恢复 上面虽然已经列出了具体回滚的SQL语句,只要简单的执行即可,不过如果涉及的到的记录数非常多,那么使用具体的UNDO SQL就不是很方便了。 这里有一个比较简单的方法,我们可以通过XID的值在flashback_transaction_query视图中得到操作前的SCN号,然后根据SCN号进行闪回恢复。简单演示一下。 1)得到误删除之前的SCN号 sec@ora10g> col UNDO_SQL for a42 sec@ora10g> col OPERATION for a8 sec@ora10g> select undo_sql, operation, start_scn from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL OPERATIO START_SCN ------------------------------------------ -------- ---------- insert into "SEC"."T"("X") values ('2'); DELETE 31205010 insert into "SEC"."T"("X") values ('1'); DELETE 31205010 BEGIN 31205010 2)使用上面的SCN号“31205010”进行闪回 sec@ora10g> flashback table t to scn 31205010; flashback table t to scn 31205010 * ERROR at line 1: ORA-08189: cannot flashback the table because row movement is not enabled
3)上面报错提示信息很明确,需要启用“row movement”。 sec@ora10g> alter table t enable row movement;
Table altered.
4)再次尝试闪回,成功。 sec@ora10g> flashback table t to scn 31205010;
Flashback complete.
5)最后重新查看一下T表的操作记录 sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X --------------------- --------------------- ---------------- - ---------- 05-DEC-09 10.02.16 PM 09000F004C250000 I 1 05-DEC-09 10.02.16 PM 09000F004C250000 I 2 05-DEC-09 09.52.51 PM 09002C004B250000 D 2 05-DEC-09 09.52.51 PM 09002C004B250000 D 1 05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2 05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
6 rows selected.
可见闪回的动作也被记录在案,因为使用的是真实的SQL来完成。
6)使用这种基于SCN的恢复方法可以将表恢复到任何“可恢复”的时间点,比较灵活。 例如,我们可以使用下面的SQL恢复T表到仅插入记录“1”的状态。 sec@ora10g> flashback table t to scn 31204988;
Flashback complete.
sec@ora10g> select * from t;
X ---------- 1
oracle中的闪回的更多相关文章
- Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点
Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...
- Oracle Flashback Technologies - 闪回查询
Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...
- Oracle Flashback Technologies - 闪回被drop的表
Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...
- Oracle Flashback Technologies - 闪回数据库
Oracle Flashback Technologies - 闪回数据库 根据指定的SCN,使用rman闪回数据库 #查看可以闪回到多久前 SQL> select * from v$flash ...
- 【Oracle】Oracle 10g利用闪回挽救误删的数据
我们在开发和运维过程中,经常遇到数据被误删除的情况.无论是在应用开发中的Bug,还是修改数据的时候,如果提交了错误数据修改结果,会带来很多问题.一般来说,一旦提交commit事务,我们是不能获取到之前 ...
- oracle 基础(一)--闪回技术
一,闪回表初探 闪回须知: 1 使用闪回表注意如下事项: 2 3 (1)被闪回的表必须启用行移动功能 4 5 SQL> alter table dept enable row movement; ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:Oracle 11g的闪回技术
alter system set db_recovery_file_dest_size=4g scope=both; connect system/1qaz2wsx as sysdba; archiv ...
- Oracle数据库的闪回操作(查询指定时间的数据、恢复数据)
通过DELETE删除数据后相当于放入回收站,一般情况下可以找回:通过UPDATE更新数据后数据库也会保留数据快照.闪回就是恢复指定时间的数据快照以达到恢复数据的目的.根据步骤一查询出数据快照,恢复数据 ...
- Oracle的回收站和闪回查询机制(二)
上一篇中讲诉了Oracle中一些闪回查询(Flashback Query),这是利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照).要注意的是,Flashback Query仅仅是查询以前 ...
随机推荐
- poj 2318 TOYS(计算几何 点与线段的关系)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12015 Accepted: 5792 Description ...
- WebForm与MVC模式优缺点(转)
Asp.net Web开发方式,分为两种: 1. WebForm开发 2. Asp.Net MVC开发 MVC是微软对外公布的第一个开源的表示层框架,MVC目的不是取代WebForm开发,只是web开 ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型
一.概述: 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis ...
- Flask – SQLite:增加成员
目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 models模块 home主页 list列表页 result消息结果页 studentst添加成员 简介 结构 $ tree ...
- 如何让div处于body居中的状态
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...
- 官网svn提交到代码库,但是不能同步到web目录
现象:数据库名字存在,但是数据库中表为空:svn提交代码能到svn库中,但不能同步到web目录. 原因:磁盘分区满了,导致内测服务器中数据库先删掉但没能从线上拉取回来,显示数据库中表为空: 磁盘满,导 ...
- 【JZOJ3601】【广州市选2014】Tree(tree)
╰( ̄▽ ̄)╭ 每个非叶子节点,其左右子树叶子节点的权值之和相等.我们称这种二叉树叫平衡二叉树. 我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平 ...
- 备考2019年6月份PMP考试-分享一些考试笔记(二)
最新比较经典的100道试题,有备考的小伙伴可以练练手,文章末尾附答案. 1 一个项目经理在运作一个数据中心安装项目.他发现相关方很恼火,因为他超出了预算,原因是人员费用要高于原先的计划.另外项 ...
- html2canvas截取屏幕的方法
html2canvas截取屏幕的方法 需要放在服务上运行,否则会报错, 放在服务器里,完美运行 处理截屏模糊的方法 html2canvas 0.5.0-beta3解决截图模糊问题 需要引入html2 ...
- typeof与js数据类型
js有6种数据类型有null.undefied.string.number.boolean.object. 然而我之前的[误区]: typeof的返回值和JS的数据类型是一样的.但是并不是(⊙o⊙)哦 ...