天天看点

10G的闪回技术

1.flash query

需要有flashback any table的系统权限或者是该表的flashback对象权限。

  需要有该表的SELECT, INSERT, DELETE, ALTER权限

  必须保证该表ROW MOVEMENT

A.drop table:

在普通用户下使用 flashback table test to before drop;

但是在sys下面会报错ORA-38305: object not in RECYCLE BIN

如果删除一个表,而不想放到回收站中,可以利用purge选项在drop语句中,如

drop table tablename purge

另外,还有一些需要注意的地方

·drop tablespace tsname including contents时,表空间内的所有对象包括回收站内的对象都将被清除。

·只执行drop tablespace,如果有永久对象将不能执行,如果仅仅是有回收站内的对象,将先清除回收站,然后删除表空间

·如果drop user username cascade时,所有对象将被删除,而且不放入回收站

B.delete/update/insert:

可以使用下列语句查询历史数据,但是超过undo_retention(默认15分钟)的时候就不一定能查到:

SELECT * FROM test AS OF TIMESTAMP

  TO_TIMESTAMP('2009-01-9 09:00:00', 'YYYY-MM-DD HH:MI:SS')WHERE XXX

但是作了truncate等DDL操作用上面的查询就,不能用闪回了

会报ORA-01466: 无法读取数据 - 表定义已更改

执行FLASHBACK TABLE XXXXXXXXXX的时候必须先

alter table test enable ROW MOVEMENT

然后

FLASHBACK TABLE test TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

多个表都需要flash back就可以

FLASHBACK TABLE test,test1,test2 TO TIMESTAMP TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

  

10g的flashback table有如下特性

  · 在线操作

  · 恢复到指定时间点或者SCN的任何数据.

  · 自动恢复相关属性,如索引,触发器等

  · 满足分布式的一致性

  · 满足数据一致性,所有相关对象将自动一致

  语法为:

  FLASHBACK TABLE test TO TIMESTAMP  TO_TIMESTAMP('2009-01-08 19:37:15', 'YYYY-MM-DD HH24:MI:SS')

  FLASHBACK TABLE test TO SCN 123456;

  FLASHBACK TABLE test TO TIMESTAMP '2009-01-08 19:37:15' ENABLE TRIGGERS;

  其中ENABLE TRIGGERS表示触发器恢复之后为enable状态,而默认为disable状态。

以上的都是可以在线作,因为它使用的undo里面的数据。

C.truncate table 不能恢复,其他对象比如package等就需要flash database了

D.其他操作:

a.

select versions_starttime,versions_endtime, versions_xid,versions_operation

from test versions

between timestamp minvalue and maxvalue

order by versions_starttime

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是伪列,

还有一些伪列,如versions_startscn和versions_endscn显示了该时刻的系统更改号。列versions_xid显示了更改该行的事务标识符

b.某一段时间内的操作

select dummy,versions_starttime,versions_endtime, versions_xid,versions_operation from test 

versions between timestamp to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss') and to_date('2009-01-09 08:30:00','yyyy-mm-dd hh24:mi:ss')

2.Flashback Transaction Query:

select * from FLASHBACK_TRANSACTION_QUERY

必须在SYS用户下执行

里面查询的是undo的SQL,比如删除了一笔数据,里面的就是插入数据的SQL,如果知道v$transaction的xid就可以查到这条undo SQL

3.flash database:

数据不要超过db_flashback_retention_target(默认一天),否则就有可能救不回来。

使用的回闪区域,所以,与下列的参数有关系

db_recovery_file_dest = /oracle/compard/flashbackarea

db_recovery_file_dest_size = 2G

db_flashback_retention_target = 1440

这些参数要事先设置好,否则mount下执行flashback on的时候,会报错误:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38709: Recovery Area is not enabled.

在mount状态下,确认数据库开启到archivelog模式,打开回闪,指令如下:

alter database flashback on;

用下列指令确认数据库是否开启在闪回模式下

select flashback_on from v$database;

如果发现数据库出问题,需要回闪,就可以使用下列指令,将整个数据库回闪到过去某个时刻。

flashback database to timestamp TO_TIMESTAMP('2008-01-08 19:46:15', 'YYYY-MM-DD HH24:MI:SS');

alter database open read only;

看看是否正确,如果不正确,可以退到mount下继续闪回

如果确认恢复的是正确的就是用这条SQL,把数据库打开alter database open resetlogs;

试了一下,依次执行下面的这三条SQL都可以成功:

flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:00:15', 'YYYY-MM-DD HH24:MI:SS');

flashback database to timestamp TO_TIMESTAMP('2008-01-14 09:58:34', 'YYYY-MM-DD HH24:MI:SS');

flashback database to timestamp TO_TIMESTAMP('2008-01-14 10:07:15', 'YYYY-MM-DD HH24:MI:SS');