升级不正确导致ORA-27468错误 及闪回区满(ORA-16014)

Oracle 10.2.0.5环境告警日志出现ORA-27468错误。

查看预警日志:

Errors in file /u01/app/oracle/admin/crab/bdump/crab_j001_23669.trc:
ORA-12012: 自动执行作业 5329 出错
ORA-27468: "SYS.PURGE_LOG" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j000_23667.trc:
ORA-12012: 自动执行作业 42568 出错
ORA-27468: "EXFSYS.RLM$SCHDNEGACTION" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j002_23671.trc:
ORA-12012: 自动执行作业 8886 出错
ORA-27468: "SYS.GATHER_STATS_JOB" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j001_23669.trc:
ORA-12012: 自动执行作业 42567 出错
ORA-27468: "EXFSYS.RLM$EVTCLEANUP" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j000_23667.trc:
ORA-12012: 自动执行作业 8887 出错
ORA-27468: "SYS.AUTO_SPACE_ADVISOR_JOB" 被另一进程锁定
[oracle@RedHat4 bdump]$  tail -20 /u01/app/oracle/admin/crab/bdump/alert_crab.log
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j001_23669.trc:
ORA-12012: 自动执行作业 5329 出错
ORA-27468: "SYS.PURGE_LOG" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j000_23667.trc:
ORA-12012: 自动执行作业 42568 出错
ORA-27468: "EXFSYS.RLM$SCHDNEGACTION" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j002_23671.trc:
ORA-12012: 自动执行作业 8886 出错
ORA-27468: "SYS.GATHER_STATS_JOB" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j001_23669.trc:
ORA-12012: 自动执行作业 42567 出错
ORA-27468: "EXFSYS.RLM$EVTCLEANUP" 被另一进程锁定
Fri Jun 27 23:14:22 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_j000_23667.trc:
ORA-12012: 自动执行作业 8887 出错
ORA-27468: "SYS.AUTO_SPACE_ADVISOR_JOB" 被另一进程锁定

导致这个错误的原因在于升级时没有执行catupgrd.sql,而是执行了建库的部分脚本如catalog.sql和catproc.sql,这导致只有CATALOG视图和系统的PACKAGE以及TYPE的版本更新到10.2.0.5,而其他数据库中组件的版本并没有升级,仍然是10.2.0.1。

在MOS文档ORA-12012 ORA-27468: "SYS.PURGE_LOG" is Locked by Another Process [ID 751884.1]中介绍了这个错误,这个问题可能发生在10.2.0.2到10.2.0.5之间,解决问题的方法很简单,在闲时执行catupgrd.sql,完成升级组件的后续操作既可。

在执行catupgrd.sql期间还遇到Oracle闪回区满(ORA-16014)

Sat Jun 28 16:30:31 CST 2014
ORA-16038: 日志 3 sequence# 52 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 3 线程 1: '/u01/app/oracle/oradata/crab/redo03.log'
Sat Jun 28 16:30:31 CST 2014
Errors in file /u01/app/oracle/admin/crab/bdump/crab_arc1_1250.trc:
ORA-16038: 日志 3 sequence# 52 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 3 线程 1: '/u01/app/oracle/oradata/crab/redo03.log'
Sat Jun 28 16:31:31 CST 2014
ARCH: Archival stopped, error occurred. Will continue retrying
Sat Jun 28 16:31:31 CST 2014
ORACLE Instance crab - Archival Error
Sat Jun 28 16:31:31 CST 2014
ORA-16014: 日志 3 sequence# 52 未归档, 没有可用的目的地

--查看归档模式
 SQL> archive log list;
 
--归档空间使用率
SQL>select * from v$flash_recovery_area_usage;
 
--闪回区所占用的空间
SQL>select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

解决办法:
-- 扩大闪回区空间
SQL>alter system set db_recovery_file_dest_size=3g  scope=both;
 
System altered.
以下命令需要在RMAN下:

rman target/
--删除备份
crosscheck backupset;
delete noprompt expired backupset;
delete obsolete;
delete noprompt expired backup;
delete noprompt expired copy;
 
--清掉归档
--清掉过期的归档
crosscheck archivelog all;
delete noprompt expired archivelog all;
--要还不够,强制删除掉指定天数前的归档
delete noprompt archivelog all completed before 'sysdate-7';