16.4.2 如何对数据文件进行恢复

当数据文件丢失或损坏时,数据库服务器将根据目前所处状态的不同,将会有不同的表现形式。如果数据库实例处于OPEN状态,那么最直观的表现为业务系统运行不正常,对数据文件的读写将发生错误。如果数据库服务器正处于启动的过程中,在SQL*Plus命令行或其他工具中将显示类似以下信息:


ORA-01157:cannot identify/lock data file 4-see DBWR trace file

ORA-01110:data file 4:'/home/oracle/users01.dbf'


无论是哪种情况,可以通过两种途径获得数据文件的状态信息,一是查询动态性能视图v$datafile_header,二是查看后台进程DBWR的跟踪文件。例如,下面的SELECT命令用于查询目标数据库中数据文件的状态:


SQL>SELECT FILE#,STATUS, ERROR, RECOVER, NAME FROM v$datafile_header;

1 ONLINE NO/u01/app/base/oradata/orcl/system01.dbf

2 ONLINE NO/u01/app/base/oradata/orcl/sysaux01.dbf

3 ONLINE NO/u01/app/base/oradata/orcl/undotbs01.dbf

4 OFFLINE OFFLINE NORMAL


数据文件损坏或丢失时,DBWR进程将不能正常工作,在该进程的跟踪文件中将记录相关的错误信息。通过查看初始化参数BACKGROUND_DUMP_DEST的值,可以了解后台进程跟踪文件的存储路径。例如,下面的信息是从DBWR进程的跟踪文件中获得的:


ORA-01157:cannot identify/lock data file 4-see DBWR trace file

ORA-01110:data file 4:'/home/oracle/users01.dbf'

ORA-27037:unable to obtain file status

Error:2:No such file or directory


为了对数据文件进行恢复,需要把数据文件或所属表空间的状态转为OFFLINE。如果数据库处于正在启动的过程中,那么将损坏的数据文件置为OFFLINE状态后,执行命令ALTER DATABASE OPEN,将数据库打开后再对数据文件进行恢复。需要注意的是,如果要对整个数据库或者SYSTEM表空间进行恢复,只能在实例处于MOUNT状态时进行恢复。

数据的恢复过程包括两个步骤,第一步是RESTORE,第二步是RECOVER。其中RESTORE的功能是将数据文件从备份集中还原到它最初的存储位置(即丢失前或损坏前的存储位置),代替以前的数据文件。RECOVER的功能是在前面所还原的数据文件的基础上,利用重做日志对最后一段时间内没有备份的数据进行恢复。备份集的存储位置可以利用RMAN中的LIST命令获得。

假设某个数据文件需要恢复,在SQL*Plus中通过下列语句之一将数据文件置为OFFLINE状态:


SQL>ALTER TABLESPACE users OFFLINE;

SQL>ALTER DATABASE DATAFILE 4 OFFLINE;


然后在RMAN中对该数据文件进行恢复。例如:


RMAN>RUN{

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

RESTORE DATAFILE 4;

RECOVER DATAFILE 4;

SQL'ALTER DATABASE DATAFILE 4 ONLINE';

RELEASE CHANNEL ch1;

RELEASE CHANNEL ch2;

}


在对数据文件进行恢复时,在上述命令序列中可以指定它的完整名称,也可以指定它的ID。如果要对整个数据库进行恢复,先将数据库实例的状态切换到MOUNT,然后进行恢复。相应的命令序列如下:


RMAN>RUN{

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

RESTORE DATABASE;

RECOVER DATABASE;

SQL'ALTER DATABASE OPEN;

RELEASE CHANNEL ch1;

RELEASE CHANNEL ch2;

}


如果要对一个普通表空间进行恢复,可以在数据库实例处于MOUNT或者OPEN状态时,将表空间的状态置为OFFLINE,然后对其进行恢复。相应的命令序列如下:


RMAN>RUN{

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;

RESTORE TABLESPACE users;

RECOVER TABLESPACE users;

SQL'ALTER TABLESPACE users ONLINE';

RELEASE CHANNEL ch1;

RELEASE CHANNEL ch2;

}


如果数据文件所在的磁盘损坏,需要把文件恢复到另外一个位置。在RESTORE命令之前,需要为数据文件指定一个新的存储位置。命令格式如下:


SET NEWNAME FOR DATAFILE 4 TO'new_location';


在对数据文件进行恢复时,可以在SQL*Plus中,也可以在RMAN中执行相应的SQL命令,将数据文件或表空间的状态置为OFFLINE。在RMAN的RUN命令序列中,在分配通道的命令之后,加入下面的命令即可:


SQL'ALTER DATABASE DATAFILE 4 OFFLINE';