Oracle之闪回操作 (五)

2014-11-24 09:48:23 · 作者: · 浏览: 5

------------------------------ -----------------

DEPT TABLE

EMP TABLE

BONUS TABLE

SALGRADE TABLE

TEST1234 TABLE

SYS_TEMP_FBT TABLE

TEST123 TABLE

已选择7行。

SQL> select * from test123;

TID

----------

1

2

SQL> select * from test1234;

TID TNAME

---------- --------------------

1 Tom

SQL> host cls

闪回 删除: 需要考虑的事情

l闪回删除对下列表无效:

在SYSTEM 表空间内的表

用精细审计的数据库或 虚拟的私人数据库

属于字典管理的表空间

由于空间不足已经被手动或自动删除的表

l以下依赖不被保护:

位图索引

表之前删掉的索引

lFLASHBACK TABLE命令作为单一的事务执行,会得到一个单一的DML锁

表的统计数据不会被闪回

当前的索引和从属的对象会被维持

l闪回表操作:

系统表不能被闪回

不能跨越DDL操作

会被写入警告日志

产生撤销和重做的数据

SQL> --闪回版本查询

SQL> creat table versions_table

SP2-0734: 未知的命令开头 "creat tabl..."- 忽略了剩余的行。

SQL> create table versions_table

2 (vid number,

3 vname varchar(20));

表已创建。

SQL> insert into versions_tableva lues(1,'Tom');

已创建 1 行。

SQL> commit;

提交完成。

SQL> insert into versions_tableva lues(2,'Mary');

已创建 1 行。

SQL> commit;

提交完成。

SQL> insert into versions_tableva lues(3,'Mike');

已创建 1 行。

SQL> commit;

提交完成。

SQL> update versions_table setvname='Mary123' where vid=2;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select * from versions_table;

VID VNAME

1 Tom

2 Mary123

3 Mike

SQL> /*

SQL> 问题:1

SQL> 1. 如何获取前面三个版本?

SQL> 2. 如何获取该表过去的一个时间

SQL> */

闪回版本查询

闪回版本查询,提供了一个审计行改变的查询功能,通过它可以查找到所有已经提交了的行记录。其语法格式如下:

selectcolumn_name[,column_name,...]

from table_name

versionsbetween [SCN|TIMESTAMP] [expr|MINVALUE]

and [epxr|MAXVALUE] as of [SCN|TIMESTAMP]expr;

备注:

其中:column_name列名;table_name表名;between...and时间段;SCN系统改变号;TIMESTAMP时间戳;ASOF表示恢复单个版本;MAXVALUE最大值;MINVALUE最小值;expr指定一个值或者表达式。

SQL> --执行闪回版本查询,获取所有的版本信息

SQL> selectvid,vname,versions_operation,versions_starttime,versions_endtime

2 from versions_table

3 versions between timestampminvalue and maxvalue

4 order by 1,4;

SQL> col VERSIONS_STARTTIME for a20

SQL> col VERSIONS_ENDTIME for a20

SQL> /