ORA-00257: archiver error. Connect internal only, until freed

【现象】: 
今天发觉发布在局方测试机上的项目登录不了,登录时报了个can not open connection。奇怪,这个错之前一直没遇过,于是便登录到服务器上去看tomcat的log,结果发现了这个: 
2012-02-26 17:31:57,089 [Prototyper] ERROR [org.logicalcobwebs.proxool.cmmbwebDataSource] - Prototype 
java.sql.SQLException: ORA-00257: archiver error. Connect internal only, until freed. 

【背景】: 
从Oracle10g开始,oracle提供了“The Flash Recovery Area”这样一种feature来帮助用户实现以磁盘空间为基础的自动备份和恢复,通过在磁盘中划分出的“The Flash Recovery Area”保存“备份和恢复相关的文件”来实现,如ControlFile,OnlineLog,ArchiverLog,BackupPiece,ImageCopy和FlashBackLog。 
详细可参考:http://docs.oracle.com/cd/B19306_01/backup.102/b14192/setup005.htm。 

【原因】: 
然后google了下,发现是Archive Log的问题,su - oracle;sqlplus /nolog;conn /as sysdba之后,查看闪回区(Flash Recovery Area)的使用情况: 
select * from V$FLASH_RECOVERY_AREA_USAGE; 
结果是: 

ORA-00257: archiver error. Connect internal only, until freed_第1张图片  
可以见到,Archive Log已经几乎占满了oracle flash_recovery_area的所有空间了。 
【有用的几个SQL】: 
1.查看flash_recovery_area的位置和大小:show parameter recover; 
2.查看flash_recovery_area的使用情况:select * from V$FLASH_RECOVERY_AREA_USAGE; 
3.查看archive是否已启用,及archive目标位置:archive log list; 

如果没有启用,可以用以下步骤启用: 
1. SQL> alter system set log_archive_dest_1='location=/oracle/oracle10g/log/archive_log'; 
该语句含义是确定归档日志的路径,实际上Oracle 10g可以生成多份一样的日志,保存多个位置,以防不测 
例如再添加一个日志位置可使用以下语句 
SQL>alter system set log_archive_dest_2='location=/oracle/oracle10g/log2/archive_log'; 
2.关闭数据库 
SQL> shutdown immediate 
3.启动数据mount状态: 
SQL> startup mount; 
4、修改数据库为归档模式: 
SQL> alter database archivelog; 
5、打开数据库,查询: 
SQL> alter database open; 
修改日志文件命名格式: 
SQL> alter system set log_archive_max_processes = 5; 
SQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile; 

【解决】: 
方法1:重新指定归档路径。 
(1)如果使用SPFILE启动数据库, 
alter system set log_archive_dest_1='location=/proddata' scope=both; 
(2)如果使用PFILE启动数据库, 
进入初始化参数文件所在的目录,$ORACLE_HOME/dbs,本例中的PFILE是initnbo.ora,添加参数:log_archive_dest_1='location=/proddata'。 
这里指定一个新的归档路径,这个路径要有足够的空间。然后关闭重启数据库。 

方法2:增加闪回区(Flash Recovery Area)的大小。 
alter system set db_recovery_file_dest_size=3G scope=both; 

方法3:删除archive log 
(1)手工删除,用系统级命令删除(如rm -rf)删除归档日志的物理文件后,还不行,因为Oracle的controlfile中仍然记录着这些archivelog的信息,所以在删除归档日志后,必须用RMAN维护控制文件,否则空间显示仍然不释放。方法是: 
1)[root@sha3 oracle]# rman target sys/pass 
2)RMAN> crosscheck archivelog all; 
3)RMAN> delete expired archivelog all; 
还可以这样:delete archivelog until time 'sysdate-1' ; 删除截止到前一天的所有archivelog。 
(2)写shell脚本自动删除。(稍后再添加这部分内容) 

你可能感兴趣的:(ORA-00257: archiver error. Connect internal only, until freed)