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)
小节:
闪回查询查看截止到任何一个时间点的数据库内容
闪回版本查询查看某一行在一段时间内的各个版本
闪回事物查询查看事物处理历史记录或行
闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术。使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间。当闪回技术使用时,它与介质恢复相比,在易用性、可用性和还原时间方面有明显的优势。