Oracle Flashback技术之Flashback Database

来源:互联网 发布:html5网页小游戏源码 编辑:程序博客网 时间:2024/05/22 05:12

Oracle Flashback家族有四个成员,分别是以下:

Flashback Database  ——闪回数据库

Flashback Drop     ——闪回删除
Flashback Table    ——闪回表

Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query) ——闪回查询

今天讨论下Flashback Database技术

Flashback Database(利用闪回日志恢复

Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,如Word中的"撤消"操作,可以不利用备份就快速的实现基于时间点的恢复。Oracle通过创建新的Flashback Logs(闪回日志),记录数据库的闪回操作。如果希望能闪回数据库,需要设置如下参数:DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢复区的大小。在创建数据库的时候,Oracle将自动创建恢复区,但默认是关闭的,需要执行alter database flashback on命令。打开Flashback Database功能之前不保证数据库是Archivelog模式

打开Flashback Database功能:

shutdown immediate

startup mount

alter database archive log;(打开归档模式)

archive log list;(确认数据库归档模式)

alter Database Flashback on;(on为打开,off为关闭)

alter database open;(打开数据库)

select current_scn ,log_mode,flashback_on from v$database;(查询当前scn号,归档模式,闪回功能)

执行破坏性操作,delete from test;(误删除了test表中数据)

shutdown immediate(关闭数据库)

startup mount(启动到mount状态)

Flashback Database to scn ****;(按scn号闪回)

Flashback Database to timestamp to_timestamp('2015-10-10 07:30:10.350','yyyy-mm-dd hh24:mi:ss.ff') ;(按时间戳闪回)

select * from test;(查看闪回之后的效果)

在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库

1). 先执行alter database open read only命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

假设现在有两个表,test1和test2,

SQL> select * from test1;
 ID NAME
---------- ----------
   3759479 A
 
SQL> select * from test2;
   ID VAL
---------- ----------
   3759479 A

SQL>delete from test1;(误删除了test1表中数据,现在要闪回到当前scn号为***)

SQL>insert into test2 values(dbms_flashback.get_system_change_number,'B');
1 row created.
SQL> commit;
Commit complete.
 
SQL> select * from test2;
     ID VAL
---------- ----------
   3759479 A
   3761885 B

在删除之后又对test2表做了正确的插入操作。

闪回到scn号为***时,虽然test1表中记录回来了,但是test2表中记录会丢失第二条记录,此时需要应用scn号***之后的redo来恢复数据库。

SQL> alter database open read only;(flashback database test1表中数据会恢复到删除之前的状态,此时以read only模式打开数据库,读取test1中记录,逻辑导出,以待最后再插入到test1中)
Database altered.
SQL> select * from test1;(记录正常)
     ID NAME
---------- ----------
   3759479 A

SQL> select * from test2;(丢失第二条记录)
     ID NAME
---------- ----------
   3759479 A

SQL> shutdown immediate
SQL> startup mount
SQL> recover database;(应用redo来恢复数据库)
Media recovery complete.
SQL> alter database open;
Database altered.

此时结果为:

SQL> select * from test1;(状态回到删除之后的,待逻辑插入刚才导出的记录)
no rows selected
SQL> select * from test2;(记录正常)
     ID VAL
---------- ----------
   3759479 A
   3761885 B

最后再逻辑插入刚才从test1中导出的记录。至此,恢复完毕,数据零丢失。

2). 直接alter database open resetlogs打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。

SQL> alter database open resetlogs;

此时,所有表的状态都回到恢复点,之后产生的数据都丢失了。


注意:Flashback Database 需要在数据库mount模式下执行,sys用户可以执行,注意两种数据恢复方式。




1 0
原创粉丝点击