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';