首页 > 代码库 > DG备库磁盘空间满导致无法创建归档

DG备库磁盘空间满导致无法创建归档

上周五去某客户那里做数据库巡检,是window 2008系统上10g的一套NC系统的库,已经配置了DG,但是巡检时发现数据库报错:

Tue Nov 11 10:13:57 2014
LNS: Standby redo logfile selected for thread 1 sequence 3945 for destination LOG_ARCHIVE_DEST_2
Tue Nov 11 10:14:29 2014
Errors in file d:\oracle\product\10.2.0\admin\nc\bdump\nc_arc0_177356.trc:
ORA-16401: archivelog rejected by RFS

FAL[server, ARC0]: FAL archive failed, see trace file.
Sun Nov 16 04:05:12 2014
Errors in file d:\oracle\product\10.2.0\admin\nc\bdump\nc_arc0_177356.trc:
ORA-16055: FAL request rejected

ARCH: FAL archive failed. Archiver continuing
Sun Nov 16 04:05:15 2014
Errors in file d:\oracle\product\10.2.0\admin\nc\bdump\nc_arc0_177356.trc:
ORA-00270: error creating archive log 

提示归档日志被RFS进程拒绝,FAL进程请求被拒绝,无法创建归档日志

*** 2014-11-11 10:14:29.806
tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x2)
tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x2)
Error 16401 creating standby archive log file at host ‘ncdg‘
ORA-16401: archivelog rejected by RFS
*** 2014-11-11 10:15:29.900
tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x2)
tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x2)
Error 16401 creating standby archive log file at host ‘ncdg‘
ORA-16401: archivelog rejected by RFS
*** 2014-11-11 10:16:29.962
tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x2)
tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x2)
Error 16401 creating standby archive log file at host ‘ncdg‘
ORA-16401: archivelog rejected by RFS
*** 2014-11-11 10:17:30.025
tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x2)
tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x2)
Error 16401 creating standby archive log file at host ‘ncdg‘
ORA-16401: archivelog rejected by RFS
*** 2014-11-11 10:18:30.088
tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x2)
tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x2)
Error 16401 creating standby archive log file at host ‘ncdg‘
ORA-16401: archivelog rejected by RFS

查看trace文件nc_arc0_177356.trc得知,从11月11日上午10点14分开始报错,也是类似的提示,再目标主机无法创建归档日志文件,平均1分钟报一次错误,在备库查看,发现原来是因为没有定期清理主库传递过来的归档日志,磁盘空间耗尽了!



70G空间全部用完了,由于客户的磁盘本来就比较小,其中一部分还用来存放数据文件,本身就要占用47G。



最后一个归档日志是11月11日,7:25生成的,后面就没有了,这和trace文件中的报错也是符合的,由于这个时刻耗尽了磁盘的最后一些空间,进而造成了主库报警日志中出现的无法创建远程归档的错误,既然找到问题了,那么处理就容易了,先把备库应用过的归档删除掉,释放磁盘空间。

由于备库归档存在GAP,并且这些GAP在主库的归档中也已经没有了,主库并没有保留非常多的归档,切归档日志也没有单独做备份集,因此只能是重新配置DG Configuration。

今天过去客户那边,把DG重新配置了一下。步骤其实很简单,因为之前已经配置过一次,这次只要是同步一下就行了,不需要修改参数,拷贝参数文件、密码文件、tnsnames.ora、listener.ora等,只需要在主库创建一个备库控制文件,然后再把主库的RMAN备份集拿到备库去恢复就行了。具体过程这里就不写了,配置完DG后,检查两边归档路径状态,确定没有error后开启redo apply,备库就又和主库数据同步了。

因为可用磁盘空间仍然比较小,因此这次专门给客户配置了自动删除备库归档日志的脚本,主要用到了3个文件,大致内容如下:

--delete_dg_archivelog
cd D:\archivelogdel
d: 
sqlplus / as sysdba @delete_archive.sql 
echo rman target / cmdfile=rman_checkcross.rman>>delete_archivelog.bat 
delete_archivelog.bat >>delete_dg_archivelog_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%".log 
exit 

--delete_archive.sql 
set lines 150 
col name for a150 
set pagesize 0 feedback off verify off heading off echo off 
spool delete_archivelog.bat 
select ‘del ‘||name from v$archived_log where APPLIED=‘YES‘ AND NAME IS NOT NULL and DEST_ID=1; 
spool off 
exit; 

--rman_checkcross.rman 
crosscheck archivelog all; 
delete noprompt expired archivelog all; 
exit 

下面来说明一下这个脚本,其中第一个bat脚本就是去调用了delte_archive.sql和rman_checkcross.rman这2个命令文件,最主要的就是delete_archive.sql这个脚本的执行内容,用SQL拼接的方式找出已经应用过的归档文件,然后生成del命令,在OS级别删除它们,最后再调用rman命令交叉校验,最后删除expired的归档日志(OS级别的删了,也要通知控制文件这些归档已经不存在了,需要删除),如果日志还未在备库应用,那么之前的那条select语句是不会查询出行记录的。

今天第一次做的时候delete_archivelog.sql中select语句用DEST_ID=1的时候,居然没查到数据行,用了DEST_ID=2才有结果,而后来又碰到用DEST_ID=2没结果,于是又换回DEST_ID=1才行。其实最主要的就是要关注SQL脚本要跑出结果,否则之前的那些命令都等于不起作用了,没有结果,OS命令就不会去del这些文件,而如果OS级别没有del掉这些文件,那么RMAN就检查不出是expired的,因此也就不会从控制文件中删除这些归档的相关记录。

最后把这个脚本添加到windows任务计划中定期运行即可,由于客户的日志切换频率并不高,因此暂定为每周清一次归档。



DG备库磁盘空间满导致无法创建归档