归档日志满导致数据库挂起故障处理

时间:2021-11-29 21:45:03

归档日志满导致的数据库挂起故障处理


当数据库运行在归档模式时,如果没有做好备份策略或归档文件和备份文件放到同一个逻辑区,则偶尔会遇到归档日志满导致系统挂起事故。在这样情况下,重启数据库不仅没有用而且将问题更复杂化(记得重启后在HA模式下的共享存储也不见了,进行了手工mount后进行手工删除部分归档日志)。

根据实际环境有不同处理方法,如下是比较通用的处理过程:

1、查看数据库日志文件(alert_log

2、查看用于归档日志或备份的磁盘空间

3、删除归档日志物理文件,归档日志一般都是位于目录下

4把归档日志的物理文件删除后,Oracle就可以恢复正常了,但是还没完全把归档日志删除干净。登录Rman,执行如下 两条命令:

  crosscheck archivelog all;

  delete noprompt expired archivelog all;

本人也经历了几次,虽然当时没有做记录,现在觉得还是有必要进行总结分享。


当数据库运行在归档模式时,如果没有做好备份策略或归档文件和备份文件放到同一个逻辑区,则偶尔会遇到归档日志满导致系统挂起事故。在这样情况下,重启数据库不仅没有用而且将问题更复杂化(记得重启后在HA模式下的共享存储也不见了,进行了手工mount后进行手工删除部分归档日志)。

根据实际环境有不同处理方法,如下是比较通用的处理过程:

1、查看数据库日志文件(alert_log

2、查看用于归档日志或备份的磁盘空间

3、删除归档日志物理文件,归档日志一般都是位于目录下

4把归档日志的物理文件删除后,Oracle就可以恢复正常了,但是还没完全把归档日志删除干净。登录Rman,执行如下 两条命令:

  crosscheck archivelog all;

  delete noprompt expired archivelog all;

本人也经历了几次,虽然当时没有做记录,现在觉得还是有必要进行总结分享。

1、查看数据库日志文件(alert_sid.log

查看日志文件最后100行记录:$tail -100lf alert_sid.log

2、查看用于归档日志或备份的磁盘空间

LinuxUnix下可以通过查看空间使用情况: $df -h

如果使用Oracle ASM存储技术,则通过如下命令查看:

$export ORACLE_SID=+ASM1

$asmcmd

ASMCMD> lsdg

3、删除归档日志物理文件,归档日志一般都是位于归档目录下

删除归档日志既可以手工删除,也可以通过RMAN来删除。如果采用手工删除则需要进行本文第4步骤来清理控制文件内容。

在文件系统管理模式下手工删除方法:

$ls -lrt --该命令按时间升序显示文件

$rm filename --filename为要删除的文件名

ASM管理模式下手工删除方法:

ASMCMD> cd archivelog

ASMCMD> ls

2011_10_05/

2011_10_06/

ASMCMD> cd 2011_10_05

ASMCMD> ls -lrt ----该命令按时间升序显示文件

ASMCMD> rm filename --filename为要删除的文件名

4把归档日志的物理文件删除后,Oracle就可以恢复正常了,但是还没完全把归档日志删除干净。登录Rman,执行如下 两条命令:

RMAN> crosscheck archivelog all;

RMAN> delete noprompt expired archivelog all;

通过如上处理过程,可以让系统运行恢复正常。但是通过这个方式后清理出来空间肯能并不是很大。在一般情况先如果采用RMAN备份方案,则建议将执行如下几行Rman命令,这样可能清理因备份不安计划执行等原因造成一些过期或重复的备份文件;

RMAN> crosscheck backup;

RMAN> delete noprompt expired backup;

RMAN> delete noprompt obsolete;

RMAN> resync catalog;

最终还要总结其他两种情况:

删除某几天前所有归档日志的方法

当出现应急情况下,如果对数据库备份方案熟悉,则通过如下Rman命令也可以删除某几天之前的所有归档日志。删除7天前所有归档日志:

RMAN>run{

DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';

}

RMAN>crosscheck archivelog all;

RMAN>delete noprompt expired archivelog all;

UNIX/LINUX下也可以通过FIND找到7天前的归档数据,使用EXEC子操作删除

  find /archivelog -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;

  这样做仍然会在RMAN里留下未管理的归档文件

  仍需要在RMAN里执行下面2条命令

  RMAN>crosscheck archivelog all;

  RMAN>delete expired archivelog all;

db_recovery_file_dest_size 参数

从Oracle10g开始,db_recovery_file_dest_size参数一般用来存放归档日志(archivelog)和rman的备份集(backupset),默认值一般为2G,当备份和归档日志超过该参数是也会出现ORA-19815错误。解决办法就是增大db_recovery_file_dest_size 的参数值:

SQL> show parameter db_recovery_file_dest_size

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest_size big integer 2G

SQL> alter system set db_recovery_file_dest_size=4G;

系统已更改。

SQL> show parameter db_recovery_file_dest_size

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest_size big integer 4G

SQL>

通过以上街上Rman命令删除不必要的数据并同步控制文件或catalog库内容。