继续聊聊flashback家庭成员。flashback version query、flashback query和本次介绍的flashback transaction query相同,都是依赖
继续聊聊flashback家庭成员。flashback version query、flashback query和本次介绍的flashback transaction query相同,,都是依赖于undo表空间的过期数据。和version query和query不同的是,flashback transaction query将数据变化的粒度细化到了事务级别,而且支持用户进行undo操作,准备好相关的sql语句。
1、实验环境
笔者使用oracle 11g进行实验,具体实验版本是11.2.0.4。
sql> select * from v$version;
banner
--------------------------------------------------------------------------------
oracle database 11g enterprise edition release 11.2.0.4.0 - 64bit production
pl/sql release 11.2.0.4.0 - production
core 11.2.0.4.0 production
tns for linux: version 11.2.0.4.0 - production
nlsrtl version 11.2.0.4.0 – production
使用flashback transaction有两个条件,一个是使用自动automatic undo management,另一个不是必须,但是建议设置的是添加补充日志supplemental redo log。
sql> show parameter undo;
name type value
------------------------------------ ----------- ------------------------------
undo_management string auto
undo_retention integer 9000
undo_tablespace string undotbs1
sql> select supplemental_log_data_min from v$database;
supplemental_log_data_min
-------------------------
yes
默认的undo_retention大小为900秒,为了实验方便设置为9000秒。
数据环境构建,创建简单数据表。
sql> create table test as select empno, sal from scott.emp;
table created
sql> select * from test;
empno sal
----- ---------
7369 800.00
7499 1600.00
7521 1250.00
(篇幅原因,有省略……)
7934 1300.00
14 rows selected
2、操作实验
flashback transaction query的核心,就是将日志以事务+数据行的修改粒度在flashback_transaction_query中查询到。
flashback_transaction_query视图是oracle提供给用户进行操作日志查询的接口。在其中,可以看到对应一个数据表、数据行和事务进行的所有数据操作。
sql> desc flashback_transaction_query;
name type nullable default comments
---------------- -------------- -------- ------- -----------------------------------------
xid raw(8) y transaction identifier
start_scn number y transaction start scn
start_timestamp date y transaction start timestamp
commit_scn number y transaction commit scn
commit_timestamp date y transaction commit timestamp
logon_user varchar2(30) y logon user for transaction
undo_change# number y 1-based undo change number
operation varchar2(32) y forward operation for this undo
table_name varchar2(256) y table name to which this undo applies
table_owner varchar2(32) y owner of table to which this undo applies
row_id varchar2(19) y rowid to which this undo applies
undo_sql varchar2(4000) y sql corresponding to this undo
下面进行简单的修改。
sql> update test set sal=100 where empno=7369;
1 row updated
sql> commit;
commit complete
根据owner和table_name,可以找到数据记录。
sql> select xid, start_scn, commit_scn, row_id, operation,undo_sql from flashback_transaction_query where table_owner='sys' and table_name='test';
xid start_scn commit_scn row_id operation undo_sql
---------------- ---------- ---------- ------------------- ------------------------------------------------------------------------------------
0900130035060000 1939850 1939857 aaav4eaabaaarfpaaa update update sys.test set sal = '800' where rowid = 'aaav4eaabaaarfpaaa';
在其中,可以看到对数据表test进行的操作事务信息,修改数据行rowid。最重要有意思的是oracle还将逆转事务操作使用的sql语句。
undo_sql的存在,就给用户提供一种手工逻辑恢复数据的能力。注意:如果supplemental log data不开启,这个数据是不会显示的。
下面借助flashback version query,检查一下刚刚修改。
sql> select versions_xid xid,versions_startscn, versions_endscn, versions_operation, test.* from test versions between scn minvalue and maxvalue;
xid versions_startscn versions_endscn versions_operation empno sal
---------------- ----------------- --------------- ------------------ ----- ---------