15.5 数据库的完全恢复

如果数据库处于归档模式下,可以在实例的OPEN或者MOUNT状态下对数据库进行恢复。可以针对一个表空间、一个数据文件或者整个数据库进行恢复。如果数据文件损坏,数据库将无法正常运行,也无法重新启动实例。这时候需要将表空间或者数据文件转到OFFLINE状态,然后进行恢复。为了确定损坏的数据文件,可以采取下列方法:

·查询动态性能视图v$recover_file。

·查看警告文件或者DBWR后台进程的跟踪文件。

·在重新启动实例时查看SQL*Plus中的错误提示。

例如,下面的语句用于查询需要恢复的数据文件的编号、状态以及出错原因:


SQL>SELECT file#,online_status, error FROM v$recover_file;


在确定出错的数据文件之后,需要把表空间或者数据文件的状态转为OFFLINE,然后进行恢复。例如:


SQL>ALTER TABLESPACE users OFFLINE;

SQL>ALTER DATABASE DATAFILE 2 OFFLINE;


其中语句中的数字是数据文件的编号,这个编号可以从视图dba_data_files中获得,这上述语句中,可以指定数据文件的编号,也可以指定完整的名称。

通常我们所说的恢复实际包括两个步骤,即RESTORE和RECOVER。其中RESTORE指的是把备份的文件复制到数据文件原来所在的位置,覆盖原来的数据文件,这样就把数据库恢复到最后一个备份的时间点了,这个步骤需要管理员手工完成。RECOVER指的是在RESTORE的基础上,利用重做日志重新产生最后一段时间的数据,这样所有的数据就恢复到发生故障的时间点了。

对于普通表空间,可以在实例处于OPEN状态或者MOUNT时进行恢复。我们建议在OPEN状态下对普通表空间的数据文件进行恢复。可以通过下列语句之一进行恢复:


SQL>RECOVER TABLESPACE users;

SQL>RECOVER DATAFILE 2;

SQL>ALTER DATABASE RECOVER DATAFILE 2;


如果要对SYSTEM表空间或者整个数据库进行恢复,需要把实例转入MOUNT状态,这是因为在数据库正常运行时,无法把表空间SYSTEM转入OFFLINE状态。下面的语句用于在实例处于MOUNT状态时恢复整个数据库,或者一个数据文件,或者一个表空间:


SQL>RECOVER DATABASE;

SQL>RECOVER DATAFILE 1;

SQL>RECOVER TABLESPACE system;

SQL>ALTER DATABASE RECOVER DATABASE;


最后将数据库实例转入OPEN状态,数据库就可以正常访问了。