首页 > 代码库 > Oracle 11gR2数据库闪回功能--预防人为逻辑错误

Oracle 11gR2数据库闪回功能--预防人为逻辑错误

Oracle 11gR2数据库闪回功能--预防人为逻辑错误

 

1.Flashback对于DJI ERP系统的作用?

对于一些人为操作的错误,比如批量删除了数据,我们可以通过Flashback功能来恢复。缺点是,此段时间内其他用户的正确操作也会丢失。

a.设立一个闪回窗口,例如60分钟。当出现人为错误时,可以恢复到过去60分钟内的任何一个时间点。

b.以某个时刻设定一个恢复点,以后出问题了,那怕过了几个月,都可以恢复到这个时刻上来。而且,只能恢复到这个时刻,而不能是这几个月内的任何一个时间点。

 

我们的需求只落在闪回方案b上。

 

我们可以在生产库或灾备库上开启flashback

A.利用灾备库做完闪回操作后,我们可以查询相应时刻的表数据,也可以利用这个时刻的静态数据库,克隆出一个新的环境。如果克隆到正式环境,能起到恢复生产的作用。但此时生产停机时间可能就得半天左右了。

B.如果是生产开启flashback,当出现需要全库闪回时,直接就可以在生产闪回了,停机时间会在1小时内。

 

 

2.闪回理论参考

理论上,我们都可以闪回到这时间窗口内的任何一个时间点。开了闪回日志,每间隔10分钟,会将有变化data block的变化前影像写到flashback log中(没变化的data block就不会记)。此时能回退的点,取决于FRA中的闪回日志窗口,窗口是随着空间的压力而向后滚动的。鉴于闪回日志是一段时间采样一次,那么我们是否只能闪回到以10分钟为单位的时间点上呢?如果想要10分钟内的时刻怎么办呢?所以flshback database时也是需要用redo log来做精确恢复的。回退的机制是这样的,根据想恢复到的target time,将该target time之前的最接近的一次闪回日志采样数据取出,然后将每个数据块利用redo log向后走到精确地走到target scn。当然,我们有了1440这个保证的时间窗,时间窗中的日志与归档日志都不会被删除、就算它符合归档日志删除策略。

 

 

 

3.方案A的实践指导参考

包括开启闪回功能、以及如何闪回。

在生产库与灾备库上开启闪回都是可以的,方法大同小异,下面介绍在灾备库上开启flashback功能。

 

1).通过这个查询,可以知道,我们的ERP生产库、灾备库的闪回功能都是没有开启的。



SQL> select flashback_on from v$database;

FLASHBACK_ON

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

NO

 

2).开启flashback功能。当我在DG库想开启闪回功能时,会提示必须先启动闪回恢复区,指定闪回日志应该放到哪里。

SQL> alter database flashback on;

alter database flashback on

*

ERROR at line 1:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38709: Recovery Area is not enabled.

SQL>

 

3).指定flash recovery area(fra,闪回恢复区)。我们设定其size为80G(也就是flashback log、以及存放在fra区的其他文件如归档日志、备份等,不能超过80G),并且把“/u01/erpdg/db/apps_st/fra”这两个路径作为闪回恢复区。

SQL> alter system set db_recovery_file_dest_size=80g;

System altered.

SQL> alter system set db_recovery_file_dest=‘/u01/erpp1/db/apps_st/fra‘;

System altered.

SQL> 

 

4).再次开启flashback功能,因为我们的灾备库在实时恢复生产库的日志,所以会报错。我们必须先停下恢复日志的进程、即MRP进程,使得灾备库处于一个静止时间点。

5).停掉MRP进程:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

Database altered.

6).再次开启闪回特性,成功了。

 

7).此时我们的闪回时间窗口多大呢?通过查看参数db_flashback_retention_target的值,是1440分钟。这个值是可以调整的。这个窗口是随着空间的压力而向后滚动的。也就是说,1440分钟(一天)以内的数据,系统是必须要保证可以闪回到的,假如空间不足以保证1440分钟的闪回,系统宁愿宕下来不运作,也不会让我们不能闪回到。那是不是1440分钟以外的人为错误,我们就一定不能闪回呢?也不一定,假如空间是否足够,两天、三天前的闪回日志,系统依然会保留的。触发系统删除闪回日志的,一般是系统空间压力(比如设定为达到fra的90%就触发删除,删除到60%为止)。

 

 

8).此时我们要将dg库的mrp进程重新启起来,再实时应用生产库传过来的日志。

 

SQL> alter database recover managed standby database using current logfile disconnect from session parallel 8;

 

Database altered.

 

SQL>

 

此时,整个DG库的flashback功能开启完毕。

 

9).闪回查询。当有一天,有用户在数据库里面误操作,比如人为地删除了数据。如果是一个表的数据,其实这里我们首先是可以考虑利用undo的闪回查询。

select * from dept as of timestamp to_timestamp(‘2012-03-09 21:55:06‘,‘yyyy-mm-dd hh24:mi:ss‘);--闪回查询,利用回滚段。 

select * from dept as of timestamp to_timestamp(‘2012-03-09 21:55:06‘,‘yyyy-mm-dd hh24:mi:ss‘) minus select * from dept;--得到被删除的记录

execute SYS.dbms_flashback.enable_at_time(to_timestamp(‘2012-03-09 21:55:06‘,‘yyyy-mm-dd hh24:mi:ss‘));

--让当前会话回到指定时间点,会看到一个冻结版的数据库,只能select,不能DML。

备注:表结构不能被更改过。即闪回不能跨越DDL

对于闪回查询,就是查询某个表过去的数据。这里,我们先讨论需要整库闪回的情况,比如做了一些错误操作,涉及到很多关联的表,我们也很难理清究竟要闪回什么的时候,就可以用统一的整库闪回操作。

 

 

10).全库flashback前,同样需要停掉MRP进程:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

 

Database altered.

 

11).全库Flash back操作

SQL> flashback database to timestamp to_timestamp(‘2014-07-22 14:22:24‘,‘yyyy-mm-dd hh24:mi:ss‘);

Flashback complete.

SQL> 

 

 

12).验证。此时我们已经闪回到了所需要的时间点。

SQL> alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘;

Session altered.

SQL> col max(first_time) for a30

SQL> select CONTROLFILE_TIME from v$database;

CONTROLFILE_TIME

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

2014-07-22 14:22:25

SQL> 

13).反复闪回,以取得错误刚好发生前的时间点。

alter database open read only;

以只读模式打开,看是否找到了被误删除的内容,不断从shutdown abort开始,重新flashback,不断采用二分法,以逼近被删除模式那一刻之前的点。