4.3 Flashback Transaction Query
Flashback Transaction Query也是使用UNDO信息来实现。
利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,
这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
示例:
SQL> insert into B values(3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from B;
ID
----------
1
2
3
查看视图,每个事务都对应相同的XID
SQL>Select xid,operation,commit_scn,undo_sql
from flashback_transaction_query
where xid in (Select versions_xid
from B versions between scn minvalue and maxvalue);
或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
from flashback_transaction_query q
where q.xid in(select versions_xid
from B versions between scn 413946 and 413959);
XID OPERATION COMMIT_SCN UNDO_SQL
-----------------------------------------------------------------------------------------------------
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('4');
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('3');
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('2');
5 Flashback Table
注意SYS用户不支持闪回,这点前面已经说明过。
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,
输入:flashback table table_name to scn(to timestamp) 即可。
注意:如果想要对表进行flashback,必须允许表的row movement.
SQL>Alter table table_name row movement;
要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables).
例如:
SQL> select row_movement from user_tables where table_name='C';
ROW_MOVE
-------
ENABLED
要启用或禁止某表row movement,可以通过下列语句:
--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。
举例:
SQL> create table C (id number(2));
表已创建。
SQL> insert into C values(1);
已创建 1 行。
SQL> insert into C values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from c;
ID
----------
1
2
SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 21:17:47
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1103864
删除数据并恢复
SQL> delete from C;
已删除2行。
SQL> commit;
提交完成。
SQL> alter table c enable row movement;
表已更改。
SQL> flashback table c to scn 1103864;
闪回完成。
或者
SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-dd hh24:mi:ss');
SQL> select * from c;
ID
----------
1
2
Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,
如果你执行一条flashback table命令时同时指定了多个表,
要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。
如:
flashback table a,b ,c to scn 1103864;
一些注意事项:
(1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,
包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,
这些操作会令undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query
会触发ORA-01466 错误。
ORA-01466: unable to read data - table definition has changed
Cause: Query parsed after tbl (or index) change, and executed w/old snapshot
Action: commit (or rollback) transaction, and re-execute
另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,
但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,
而flashback query 查询出的undo 记录已经不符合新建的约束条件,
这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,
对要恢复的数据进行处理之后,再执行恢复。
(2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),
因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp
在执行时会自动disable 掉与其操作表相关的triggers,如果你希望在此期间trigger
能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。
6 Oracle Flashback Data Archive
在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive.
在11g的官方文档里搜到了相关内容说明,参考:
Using Oracle Flashback Technology
--Using Flashback Data Archive (Oracle Total Recall)
#BJFIEJGG
6.1 Flashback Data Archive 说明
官网的定义如下:
A Flashback Data Archive provides the ability to track and store transactional changes
to a table over its lifetime. A Flashback Data Archive is useful for compliance with
record stage policies and audit reports.
--Flashback Data Archive 在它的有效期内将保存事务改变的信息。
A Flashback Data Archive consists of one or more tablespaces or parts thereof.
You can have multiple Flashback Data Archives. If you are logged on as SYSDBA,
you can specify a default Flashback Data Archive for the system.
A Flashback Data Archive is configured with retention time. Data archived in the
Flashback Data Archive is retained for the retention time.
-- FDA 包含一个或者多个表空间,我们可以创建多个FDA。 当以sysdba 登陆时,
可以指定default FDA。
By default, flashback archiving is off for any table. You can enable flashback archiving
for a table if all of these conditions are true:
-- 默认情况下,FDA 是关闭的,当具备一下条件时,我们可以启用FDA。
(1). You have the FLASHBACK ARCHIVE object privilege on the Flashback Data Archive
to use for that table.
(2). The table is neither nested, clustered, temporary, remote, or external.
(3). The table contains neither LONG nor nested columns.
After flashback archiving is enabled for a table, you can disable it only if you either
have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on as SYSDBA.
--当FDA 启动以后,只有具有FLASHBACK ARCHIVE ADMINISTER 权限的用户或者
用SYSDBA登陆的用户才可以禁用FDA。
When choosing a Flashback Data Archive for a specific table, consider the data
retention requirements for the table and the retention times of the Flashback
Data Archives on which you have the FLASHBACK ARCHIVE object privilege.
给用户赋:
SQL> create user dvd identified by dvd default tablespace users temporary tablespace temp;
User created.
SQL> grant resource,connect to dvd;
Grant succeeded.
SQL> grant flashback archive administer to dvd;
Grant succeeded.
SQL> select * from dba_sys_privs where grantee='DVD';
GRANTEE PRIVILEGE ADM
----------------------- ---------------------------------------- ---
DVD FLASHBACK ARCHIVE ADMINISTER NO
DVD UNLIMITED TABLESPACE NO
在Oracle 10g中的flashback 包括: flashback version query、flashback transaction query、
flashback database、flashback table和flashback drop等特性。
在这些闪回技术当中,除了Flashback Database(依赖于闪回日志)、
flashback drop(依赖recyclebin)之外,其他的闪回技术都是依赖于Undo撤销数据,
都与数据库初始化参数UNDO_RETENTION密切相关。
它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。
而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,
虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,
设置过大,可能导致undo tablespace快速膨胀。