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
可以见到,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脚本自动删除。(稍后再添加这部分内容)

你可能感兴趣的:(oracle)