15.7 Flashback技术在数据库恢复中的应用

Flashback是从Oracle 10g开始出现的一种技术,利用这种技术,可以很方便地查看数据库中过去某个时刻的数据,或者把数据库恢复到过去某个时刻的状态,还可以恢复被误删除的表。

为了使用Flashback技术,数据库必须满足以下条件:

·数据库必须是处于归档日志模式。

·在参数文件中通过下面两个初始化参数指定一个快速恢复区的路径及大小:


DB_RECOVERY_FILE_DEST

DB_RECOVERY_FILE_DEST_SIZE


·以sys用户登录实例,执行下面的命令:


SQL>ALTER DATABASE FLASHBACK ON;


快速恢复区是一个目录或者一个ASM磁盘组,在这个位置将保存一段时间内所有的归档日志文件。每次数据库服务器对重做日志文件进行归档时,都将在这个位置产生一个归档日志文件。Flashback的基本原理就是利用过去的重做日志还原数据。下面的两条命令分别用于指定快速恢复区的大小及路径(注意两条命令的顺序):


SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G;

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/app/recovery_area';


利用Flashback技术,我们对数据库可以进行如下操作:

·数据库的Flashback:把整个数据库恢复到过去某个时刻。

·表的Flashback:把某个表恢复到过去某个时刻。

·Flashback drop:还原对表的drop操作。

·Flashback查询:查询数据库在过去某个时刻的数据。

·Flashback事务查询:查询某个表在过去某个时间段的事务。

15.7.1 回收站的应用

当用户删除表、索引等数据库对象时,数据并没有被立即删除,而是放在了回收站中。回收站实际上是一个数据字典视图,从这个视图中可以查看被删除的表的信息。回收站中的每个对象都被指定了一个复杂的、唯一的名称。

为了在一个会话中使用回收站,登录用户必须在SQL*Plus中执行下面的命令:


SQL>ALTER SESSION SET recyclebin=on;


为了在会话中取消回收站的使用,登录用户必须在SQL*Plus中执行下面的命令:


SQL>ALTER SESSION SET recyclebin=off


为了在整个数据库中使用或者取消回收站的功能,sys用户必须在SQL*Plus中执行下面的命令:


SQL>ALTER SYSTEM SET recyclebin=on

SQL>ALTER SYSTEM SET recyclebin=off


回收站就是一些数据字典视图,普通用户可以从视图user_recyclebin或者RECYCLEBIN查看属于自己的被删除的对象。sys用户可以从视图dba_recyclebin查看整个数据库内所有被删除的对象。例如:


SQL>SHOW recyclebin;

SQL>SELECT object_name, original_name, type FROM recyclebin;

OBJECT_NAME ORIGINAL_NAME TYPE


BIN$gqB40awS/ubgQAB/AQAUkA==$0 T1 TABLE


在查询结果中我们可以看到被删除对象在回收站的名称、原来的名称以及对象类型等。例如,在上面的查询结构中,有一个表,被删除之前的名称是t1,在回收站中的名称是BIN$gqB40awS/ubgQAB/AQAUkA==$0。

假设用户创建了一个数据库对象t1,然后将其删除,后来又创建了一个同名的数据库对象,又将其删除,这两个对象都将被放在回收站中。尽管两个数据库对象最初的名称是相同的,但是在回收站中的名称是不同的。通过回收站中的名称可以查询这些对象中被删除之前的数据。例如:


SQL>SELECT*FROM"BIN$gqB40awS/ubgQAB/AQAUkA==$0";


如果一个数据库对象是被误删除的,可以利用FLASHBACK命令将其从回收站中恢复。例如,下面的命令用于恢复表:


SQL>FLASHBACK TABLE"BIN$gqB40awS/ubgQAB/AQAUkA==$0"TO BEFORE DROP;


假设用户删除一个数据库对象后又重新创建了一个同名同类型的数据库对象,那么在恢复被删除的数据库对象时就会遇到名称冲突的问题。在恢复数据库对象的时候还可以更改它的名称。例如:


SQL>FLASHBACK TABLE"BIN$gqB40awS/ubgQAB/AQAUkA==$0"TO BEFORE DROP RENAME TO T2;


如果觉得一个数据库对象确实没有存在的必要了,可以利用PURGE命令将其从回收站中删除,这样可以节省磁盘空间。例如:


SQL>PURGE TABLE emp;

SQL>PURGE TABLE"BIN$gqB40awS/ubgQAB/AQAUkA==$0";


如果确定要删除一个数据库对象,可以在DROP命令中使用PURGE关键字,这样就不会将其放在回收站中了。例如:


SQL>DROP TABLE dept PURGE;