9.2.4 删除重做日志文件

在一些情况下,需要将某个重做日志组或日志成员删除。例如,由于某个日志成员损坏而导致整个重做日志组不可用,这时需要将损坏的日志成员删除。

删除日志组时,日志组中的所有日志成员都将被删除。为了保证数据库服务器的运行,应该保证至少有两个日志组可用。另外,如果日志组的状态为“CURRENT”,那么该日志组是不能删除的,这时必须进行日志组的切换。“CURRENT”状态表明数据库服务器当前正在使用该日志组。在删除日志组之前,应该先查询日志组的状态。例如:


SQL>SELECT GROUP#,STATUS FROM v$log;

GROUP#STATUS


1 CURRENT

2 INACTIVE

3 INACTIVE

4 INACTIVE


删除日志组的命令是ALTER DATABASE,通过DROP LOGFILE子句指定要删除的日志组。例如,以下语句用于删除日志组4:


SQL>ALTER DATABASE

DROP LOGFILE GROUP 4;


为了保证重做日志的连续性,在归档模式下删除一个重做日志组时,应先对其进行归档。重做日志组的归档状态也可以通过查询动态性能视图v$log获得。

当重做日志组被删除后,所有的日志成员都将被删除。在有些情况下,仅需要删除日志组的某些日志成员,其余成员仍然保留。比如当某个重做日志文件损坏时,应该将该日志成员删除,以保证数据库服务器的正常运行。

删除日志成员时,不能删除重做日志组中唯一的成员。为了保证重做日志文件的安全,应该保证日志组中至少有两个成员。当某个日志组中仅剩一个日志成员时,应该及时添加其他的日志成员。如果某个日志组处于“CURRENT”状态,不能删除该重做日志组中的任何成员,这时必须手工切换日志,使重做日志组的状态切换为“INACTIVE”状态。

删除日志成员的命令仍然是ALTER DATABASE,在命令中通过DROP LOGFILE MEMBER子句指定要删除的日志成员。因为重做日志文件的位置和名称是唯一的,因此,不需要指定该日志成员所属的重做日志组。例如,下面的语句用于删除重做日志组4的日志成员redo402.log:


SQL>ALTER DATABASE

DROP LOGFILE MEMBER'/home/oracle/orcl/redo402.log';


当一个重做日志组或一个日志成员被删除后,对应的重做日志文件并没有被真正删除。为了彻底删除重做日志文件,还需要在操作系统中手工执行删除操作。