Flashback Query(闪回查询)

Flashback Query实际上包含3个工具:Flashback Query、Flashback Version Query 和 Flashback Transaction Query,它们属于同一个工具集,都是利用UNDO 的内容来实现回退的功能,不同的是Flashback Query只能看到某一点的对象状态,Oracle10g引用的Flashback Version Query可以看到在过去的某个时间段内,记录是如何发生变化的(记录的演变历史)。根据这个演变历史,DBA可以快速判断数据是在什么时间点发生了错误,进而恢复到之前的状态。首先让我们来看看Flashback Query如何使用

1.Flashback Query

(1)准备实验数据:

MTX@mtxdb1>create table test (id number,name varchar2(100),salary number);

Table created.

MTX@mtxdb1>insert into test values (1,'mi',100);

1 row created.

MTX@mtxdb1>insert into test values (2,'tian',200);

1 row created.

MTX@mtxdb1>commit;

Commit complete.

MTX@mtxdb1>alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

Session altered.

查看当前系统时间:

MTX@mtxdb1>select sysdate from dual;

SYSDATE
-------------------

2018-02-15 13:38:05

(2)删除数据,模拟误操作

MTX@mtxdb1>delete from test;

2 rows deleted.

MTX@mtxdb1>commit;

Commit complete.

(3)通过Flashback Query查看误删除之前的状态

MTX@mtxdb1>select * from test as of timestamp to_timestamp('2018-02-15 13:38:05','yyyy-mm-dd hh24:mi:ss');

        ID NAME           SALARY
---------- ---------- ----------
         1 mi                100

         2 tian              200

(4)利用Flashback Query进行数据恢复

MTX@mtxdb1>insert into test  
  2  select * from test as of timestamp 
  3  to_timestamp('2018-02-15 13:38:05','yyyy-mm-dd hh24:mi:ss');

2 rows created.

MTX@mtxdb1>commit;

Commit complete.

MTX@mtxdb1>select * from test;

        ID NAME           SALARY
---------- ---------- ----------
         1 mi                100

         2 tian              200

当某一个字段的数据因为误操作而导致数据丢失的时候,还可以通过级联更新语法,进行数据恢复:

MTX@mtxdb1>update test t1 set t1.salary=
  2  (select salary from test
  3  as of timestamp
  4  to_timestamp ('2018-02-15 13:38:05','yyyy-mm-dd hh24:mi:ss') t2

  5  where t1.id=t2.id);

2 rows updated.

MTX@mtxdb1>commit;

Commit complete.


2.Flashback Version Query

上面提到Flashback Version Query可以看到在过去的某个时间段内,记录是如何发生变化的,ORA_ROWSCN是Oracle10g新增的伪列,这个伪列记录的是最后一次被修改且提交时的SCN,如果修改没有被提交,那么这个伪列不会发生变化。ORA_ROWSCN缺省是数据块级别的,也就是说,一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据块内所有记录的ORA_ROWSCN都会同时改变。但是如果在建表语句中添加了“rowdependencies”关键字,那么这个数据块中的每条记录都有自己的ORA_ROWSCN。Flashback Version Query通过这个伪列可以跟踪出记录的变化历史,以下为一个例子的演示

(1)准备测试数据

MTX@mtxdb1>create table test2 (id number,name varchar2(10));

Table created.

MTX@mtxdb1>insert into test2 values (1,'mitianxin');

1 row created.

MTX@mtxdb1>commit;

Commit complete.

(2)查看前面执行commit时的SCN

MTX@mtxdb1>select ora_rowscn,id,name from test2;

ORA_ROWSCN         ID NAME
---------- ---------- ----------

    770032          1 mitianxin

(3)修改记录,观察ORA_ROWSCN的变化

MTX@mtxdb1>update test2 set name='mtxdb' where id=1;

1 row updated.

MTX@mtxdb1>commit;

Commit complete.

MTX@mtxdb1>select ora_rowscn,id,name from test2;

ORA_ROWSCN         ID NAME
---------- ---------- ----------

    771065          1 mtxdb

MTX@mtxdb1>update test2 set name='walker' where id=1;

1 row updated.

MTX@mtxdb1>commit;

Commit complete.

MTX@mtxdb1>select ora_rowscn,id,name from test2;

ORA_ROWSCN         ID NAME
---------- ---------- ----------

    771258          1 walker

(4)用Flashback Version Query获得历史信息

MTX@mtxdb1>col versions_xid for a16 heading 'XID'
MTX@mtxdb1>col versions_startscn for 99999999 heading 'Vsn|Start|Scn'
MTX@mtxdb1>col versions_endscn for 99999999 heading 'Vsn|End|Scn'
MTX@mtxdb1>col versions_operation for a12 heading 'Operation'
MTX@mtxdb1>select versions_xid,versions_startscn,versions_endscn,
  2  decode(
  3  versions_operation,
  4  'I','Insert',
  5  'U','Update',
  6  'D','Delete','Original') Operation,
  7  id,name
  8  from test2
  9  VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE

 10  where id=1;

                       Vsn       Vsn
                     Start       End
XID                    Scn       Scn OPERATIO         ID NAME
---------------- --------- --------- -------- ---------- ----------
05000C0038010000    771258 (null)    Update            1 walker
0A002F0039010000    771065    771258 Update            1 mtxdb

08001F0037010000    770032    771065 Insert            1 mitianxin

这个结果描述了表test2的变迁过程,利用Flashback Version Query技术,可以很容易地看到记录变迁的过程,定位错误发生的时间。

注意:要使用Flashback Version Query,用户首先要有对象的select、flashback权限,对表执行过DDL语句(比如alter table 改变表的结构),就只能查看在DDL语句之后的版本,也就是Flashback Version Query不会跨越DDL操作。


3.Flashback Transaction Query

利用这个功能可以查看某个事物执行的所有变化。使用这个功能需要访问flashback_transaction_query视图,这个视图的XID列代表事物ID,利用这个ID就可以区分特定事物发生的所有数据变化,这个功能也是使用UNDO信息来实现。

(1)准备测试表:

MTX@mtxdb1>create table test3 (id number,name varchar2(10));

Table created.

MTX@mtxdb1>create table test4 (id number,did number,name varchar2(10));

Table created.

(2)第一个事物,插入测试数据:

MTX@mtxdb1>insert into test3 values (1,'dep1');

1 row created.

MTX@mtxdb1>insert into test4 values (1,1,'emp1');

1 row created.

MTX@mtxdb1>commit;

Commit complete.

(3)第二个事物:

MTX@mtxdb1>insert into test4 values (2,1,'emp2');

1 row created.

MTX@mtxdb1>commit;

Commit complete

(4)查看视图,每个事物都对应相同的XID。

MTX@mtxdb1>select xid,operation,commit_scn,undo_sql
  2  from flashback_transaction_query
  3  where xid in (
  4  select  versions_xid
  5  from test4
  6  versions between scn minvalue and maxvalue
  7  );

XID              OPERATION  COMMIT_SCN UNDO_SQL
---------------- ---------- ---------- ----------------------------------------------------------------------
070024003C010000 INSERT         811086 delete from "MTX"."TEST4" where ROWID = 'AAADB4AAHAAAAAmAAB';
070024003C010000 BEGIN          811086 (null)
0300210039010000 INSERT         810949 delete from "MTX"."TEST4" where ROWID = 'AAADB4AAHAAAAAmAAA';
0300210039010000 INSERT         810949 delete from "MTX"."TEST3" where ROWID = 'AAADB3AAHAAAAAeAAA';

0300210039010000 BEGIN          810949 (null)

小节:

闪回查询查看截止到任何一个时间点的数据库内容

闪回版本查询查看某一行在一段时间内的各个版本

闪回事物查询查看事物处理历史记录或行

闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术。使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间。当闪回技术使用时,它与介质恢复相比,在易用性、可用性和还原时间方面有明显的优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值