Oracle 11g新特性之事务管理
SQL> create flashback archive near_term
2 tablespace far_near_term
3 retention 1 month
4 /
![]()
Flashback archive created.
命令行界面
如果您无权访问企业管理器怎么办?或者也许您想通过脚本来完成这一切,那该怎么办?程序包 DBMS_FLASHBACK(Oracle 数据库 10g 中也提供该程序包)新增了一个名为 TRANSACTION_BACKOUT 的过程。这个过程超载,因此您必须将值传递给命名参数,如下所示。
declare
trans_arr xid_array;
begin
trans_arr := xid_array('030003000D040000','F30003000D04010');
dbms_flashback.transaction_backout (
numtxns => 1,
xids => trans_arr,
options => dbms_flashback.cascade
);
end;
xid_array 类型也是 Oracle 数据库 11g 的新增内容。它用来向该过程传递一系列事务标识符。
LogMiner 的其他改进
如果您一直使用 XML Type 作为数据类型,那么在 Oracle 数据库 11g 中您更有理由使用它,您会很高兴地看到 LogMiner 也可以挖掘 XML 数据。XML 数据在 SQL_REDO 和 SQL_UNDO 列中都有显示。
启动 LogMiner 时,您可以设置选项 SKIP_CORRUPTION,它会跳过重做日志中的受损块。因此,即使部分数据损坏了,您也可以回收重做日志里的有效数据。 以下是这一改进语法的用法:
begin
dbms_logmnr.start_logmnr(
options => dbms_logmnr.skip_corruption
) ;
end;
闪回数据存档
Oracle9i 数据库第 2 版以闪回查询的形式引入了众所周知的时间机器。闪回查询允许您选择更改前的数据。例如,如果您将一个值从 100 改为 200 并将其提交,即使更改已经提交了,您仍然可以选择两分钟前的值。这种技术使用了还原段中更改前的数据。在 Oracle 数据库 10g 中,这项功能通过引入闪回版本查询得到增强,您甚至可以将某一行的更改追溯到还原段所能提供的最久远的更改状态。
但是,这里存在一个小问题:数据库回收后,还原数据被清除了,随之更改前的值也消失了。即使不回收数据库,数据也可能因时间太长而退出还原段为新更改让出空间。
由于 11g 之前的闪回操作依赖于还原数据,而还原数据的可用时间短暂,您无法真正长期使用这些数据或者将其用于审计之类较永久的记录。作为变通手段,我们通过编写触发器来长期记录数据库的更改。
不过,不要感到失望。在 Oracle 数据库 11g 中,闪回数据存档结合了两者的优势:它既提供闪回查询的简易性与功能性,又不像还原数据一样依赖临时存储。它在更加永久的位置(即闪回恢复区)记录更改。
我们来看一个示例。(注:您需要激活自动撤消管理,这样闪回数据存档才能发挥作用。)首先,创建一个闪回数据存档,如下所示:
SQL> create flashback archive near_term
2 tablespace far_near_term
3 retention 1 month
4 /
![]()
Flashback archive created.
关于时间,先不用管术语“保留”的意义,我们稍后再讨论。(这是记录更改的位置。)存档在表空间 far_near_term 中创建好了。
假设您需要记录表 TRANS 的更改。那么,您只需启用该表的闪回数据存档状态,开始在存档中记录更改即可。
SQL> alter table trans flashback archive near_term;
![]()
Table altered.
