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

归档日志空间满导致普通用户连接数据库出错,sys用户仍然可登录数据库。当rman使用catalog方式连接数据库时也报错。

两种处理方式:1、rman在非catalog方式连接到目标数据库,删除过期日志  2、增大归档日志空间的大小。

一、rman在非catalog方式连接到目标数据库,删除过期日志

1、用户连接报错
SQL> conn scott/tiger@orcl;
ERROR:
ORA-00257: archiver error. Connect internal only, until freed. --归档错误(日志空间满)

RMAN以catalog的形式连接也报同样的错。

2、检查FLASH_RECOVERY_AREA_USAGE使用情况
SQL> conn / as sysdba;
Connected.

SQL> show parameter log_archive_dest;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_2 string
log_archive_dest_3 string
log_archive_dest_4 string
log_archive_dest_5 string
……

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 99.6 .51 50
BACKUPPIECE .33 0 1
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0

6 rows selected.

----------

select * from v$archived_log;  --查看所有归档日志文件信息

---------
3、清除部分日志---采用rman方式清除日志
[oracle@rusky ORCL]$ rman target sys/12345  --使用rman连接到目标数据库,并清除过期日志(没有使用catalog)

Recovery Manager: Release 10.2.0.1.0 - Production on Mon Jan 5 14:51:36 2015

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: ORCL (DBID=1379778111)

RMAN> crosscheck archivelog all; ---先用该命令检查

RMAN> delete expired archivelog all;--删除过期日志 --delete noprompt expired archivelog all;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=124 devtype=DISK
specification does not match any archive log in the recovery catalog --无过期日志

RMAN> delete archivelog until time "to_date('2015-01-01 23:00:00','yyyy-mm-dd hh24:mi:ss')"; --删除指定日志前的日志

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=124 devtype=DISK

List of Archived Log Copies
Key Thrd Seq S Low Time Name
------- ---- ------- - --------- ----
1 1 1209 A 24-DEC-14 /home/oracle/oracle/flash_recovery_area/ORCL/archivelog/2014_12_24/o1_mf_1_1209_b9o2yclz_.arc
……

4、查看flash_recovery_area_usage使用情况
SQL> select * from v$flash_recovery_area_usage;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 34.72 0 17
BACKUPPIECE .33 0 1
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0

6 rows selected.

5、再次连接SQLPLUS正常

=========================

QL> show parameter DB_RECOVERY_FILE_DEST_SIZE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 2G

如果不要这些archivelog的话,可以删除一些

rman>DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-3'; 直接运行这条 这样会只保留三天的归档

二、增大归档日志空间的大小

其实问题的本质是归档日志的使用已经达到了spfile等启动参数文件中指定的最大值。oracle 10g中归档日志默认的存放地是闪回目录,即%ORACLE_BASE%/flash_recovery_area的相应实例名下面,这个位置的大小在参数文件中有个限制,解决空间不足的问题可以通过两种方式来实现,一个修改这个大小限制,还有一个就是修改归档日志存放位置。

据数据库目前可用存储空间情况、FLASH_RECOVERY_AREA空间为2GB的实际情况,把FLASH_RECOVERY_AREA的空间修改为20GB()。
SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;
系统已更改。

三、其它信息查看

1、在操作系统下查看每天生成的归档日志大小及总的归档日志文件大小
[root@rusky archivelog]# pwd
/home/oracle/oracle/flash_recovery_area/ORCL/archivelog
[root@rusky archivelog]# du -h --max-depth=1        ---------进入归档日志文件目录,使用该命令查看
208M ./2015_04_14
166M ./2015_04_27
166M ./2015_04_25
208M ./2015_04_20
166M ./2015_04_03
167M ./2015_03_08
208M ./2015_03_04
166M ./2015_03_05
209M ./2015_04_16
208M ./2015_03_31
208M ./2015_03_26
208M ./2015_04_21
208M ./2015_03_12
172M ./2015_04_23
212M ./2015_03_09
211M ./2015_03_28

……

11G .

2、查看每天生成的归档日志大小情况:

SELECT TRUNC(FIRST_TIME) "日期",TRUNC(SUM(BLOCKS*BLOCK_SIZE)/1024/1024/1024,2)  "大小(GB/DAY)" FROM V$ARCHIVED_LOG GROUP BY(FIRST_TIME) ORDER BY 1 DESC;

3、查看所有归档日志文件的详细信息

select * from v$archived_log;