今天早上来了,同事说一个库启不来了。
过来看下,发现机器都启不来,系统是redhat 。询问同事做过的操作,同事只是重启机器了。
单用户模式进系统,经过检查发现/etc/pam.d/login 文件中加了一条session    required     /lib/security/pam_limits.so,把它注释后重启,系统正常了。

进入系统后,su - oracle然后启库,发现ORA-16038错误。
一般来说ORA-16038、ORA-19809、ORA-00312这三个错误会同时出现,果真同时出现了。
[oracle@moedb210 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Tue Feb 23 09:19:34 2010
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> startup
ORACLE instance started.
Total System Global Area 1124073472 bytes
Fixed Size                  2083368 bytes
Variable Size             301991384 bytes
Database Buffers          805306368 bytes
Redo Buffers               14692352 bytes
Database mounted.
ORA-16038: log 2 sequence# 50 cannot be archived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/moe210/redo02.log'
引起这种问题的原因一般是:
  该数据库打开了闪回功能并且闪回区以满;
  仅仅删除无用的归档文件是不会解决问题的,因为rman controlfile记录了闪回区的使用情况,并且认为该闪回区以满;
解决方法:
这里提供几种解决方法以供选择:
1. 提高参数db_recovery_file_dest_size
2. 关闭闪回功能(如果你确实不再需要该功能)
3. 删除无用的归档文件并更新rman记录
下面对方法3进行详细说明:
1. 使用rm命令删除闪回区中的无用归档文件
2. 连接到rman,使用命令RMAN> connect target /
3. 使用命令RMAN> crosscheck archivelog all,该操作将标明哪些归档文件已被删除
4. 使用命令RMAN> delete expired archivelog all,该命令将删除rman controlfile中相应的记录.

最后把监听启来就一切正常了。