1)flashback drop
2)flashback query
3)flashback data archive
4)flashback table
5)flashback version query
6)flashback transaction
7)flashback database
闪回版本和事务
1.要点:
闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中数据变化的细节,10g的闪回版本查询可以对时间段内数据表的每行变化(不同版本)进行查询。
2.语法:
select … from … versions between
其中,select后面可以选择伪列,来获得事务的开始、结束时间、SCN号、事务XID号等。
①闪回版本查询不能用于外部表、临时表或V$视图。原因是这些对象都不生成撤销数据。(临时表的撤销是基于session的)。
②闪回版本中的内容不包括未提交的DML语句。
追加日志:
SYS@ prod>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
数据库已更改。
SYS@ prod>create table t3 (id int, name char(10));
表已创建。
SYS@ prod>insert into t3 values(1,'tim');
已创建 1 行。
SYS@ prod>insert into t3 values(2,'mike');
已创建 1 行。
SYS@ prod>insert into t3 values(3,'brain');
已创建 1 行。
SYS@ prod>insert into t3 values(4,'cade');
已创建 1 行。
SYS@ prod>commit;
提交完成。
SYS@ prod>update t3 set name='nelson' where id=4;
已更新 1 行。
SYS@ prod>commit;
提交完成。
SYS@ prod>delete t3 where id=2;
已删除 1 行。
SYS@ prod>commit;
提交完成。
SYS@ prod>update t3 set id=id+100;
已更新3行。
SYS@ prod>commit;
提交完成。
VER字段就是所作的操作。
顺序要从下往上看。所有的操作都是倒叙。
SYS@ prod>select versions_startscn, versions_endscn, versions_xid, versions_operation,id,name from t3 versions between scn minvalue and maxvalue;
VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID VER ID NAME
----------------- --------------- ---------------- --- ---------- ------------------------------
2069447 07001F0054060000 U 104 nelson
2069447 07001F0054060000 U 103 brain
2069447 07001F0054060000 U 101 tim
2069444 03001C002E070000 D 2 mike
2069441 2069447 0200120031070000 U 4 nelson
2069447 1 tim
2069444 2 mike
2069447 3 brain
2069441 4 cade
已选择9行。
SYS@ prod>select versions_xid, versions_operation,id, name from t3 versions between scn minvalue and maxvalue;
VERSIONS_XID VER ID NAME
---------------- --- ---------- ------------------------------
07001F0054060000 U 104 nelson
07001F0054060000 U 103 brain
07001F0054060000 U 101 tim
03001C002E070000 D 2 mike
0200120031070000 U 4 nelson
1 tim
2 mike
3 brain
4 cade
已选择9行。
闪回事务
SYS@ prod>select * from t3;
ID NAME
---------- ------------------------------
101 tim
103 brain
104 nelson
SYS@ prod>select undo_sql from flashback_transaction_query where xid=hextoraw('03001C002E070000');
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert into "SYS"."T3"("ID","NAME") values ('2','mike ');
SYS@ prod>select undo_sql from flashback_transaction_query where xid=hextoraw('07001F0054060000');
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
update "SYS"."T3" set "ID" = '4' where ROWID = 'AAAVtKAABAAAXoBAAD';
update "SYS"."T3" set "ID" = '3' where ROWID = 'AAAVtKAABAAAXoBAAC';
update "SYS"."T3" set "ID" = '1' where ROWID = 'AAAVtKAABAAAXoBAAA';
SYS@ prod>
执行相应的SQL就能回退道原来表的版本
SYS@ prod>update "SYS"."T3" set "ID" = '4' where ROWID = 'AAAVtKAABAAAXoBAAD';
已更新 1 行。
SYS@ prod>update "SYS"."T3" set "ID" = '3' where ROWID = 'AAAVtKAABAAAXoBAAC';
已更新 1 行。
SYS@ prod>update "SYS"."T3" set "ID" = '1' where ROWID = 'AAAVtKAABAAAXoBAAA';
已更新 1 行。
SYS@ prod>
SYS@ prod>
SYS@ prod>commit;
提交完成。
SYS@ prod>select * from t3;
ID NAME
---------- ------------------------------
1 tim
3 brain
4 nelson
SYS@ prod>insert into "SYS"."T3"("ID","NAME") values ('2','mike ');
已创建 1 行。
SYS@ prod>commit;
提交完成。
SYS@ prod>select * from t3;
ID NAME
---------- ------------------------------
1 tim
2 mike
3 brain
4 nelson
SYS@ prod>
本例子我没有回退所有的操作。
Jrojyun
2021-03-29