〖环境(Environment)〗
OS:LINUX
DB:ORACLE10G
〖现象(Symptom)〗
以普通用户登录数据库时,报告错误:ORA-00257 : archiver error. Connect internal only, until freed。
用ALTER SYSTEM ARCHIVE LOG CURRENT执行手工归档也不行。
〖原理(Cause) 〗
Step01:用ps -ef|grep oracle查看归档进程,归档进程运行正常。
oracle 524 1 1 15:50:30 0:14 ora_arc0_nbo
oracle 518 1 0 15:50:23 0:01 ora_arc1_nbo
。。。
Step02:查看归档路径。
SQL> show parameter LOG_ARCHIVE_DEST_
NAME TYPE VALUE
------------------------------------ ----------- ----------------
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
log_archive_dest_6 string
log_archive_dest_7 string
log_archive_dest_8 string
log_archive_dest_9 string
log_archive_dest_state_1 string enable
。。。
从数据可以看出,归档路径LOG_ARCHIVE_DEST_n为空,没有设置归档路径。如果没有设置归档路径的时候,ORALCE默认会把归档文件(archived logs)放到闪回区(Flash Recovery Area)。
Step03:得到闪回区(flash recovery area)的路径。
SQL> show parameter DB_RECOVERY_FILE_DEST
NAME TYPE VALUE
------------------------------------ ----------- --------------------------
db_recovery_file_dest string /wxxrdata/flash_recovery_area
闪回区(flash recovery area)的路径是/wxxrdata/flash_recovery_area。
Step04:查看闪回区(Flash Recovery Area)的使用情况。
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 74.05 0 31
BACKUPPIECE 10.95 0 8
IMAGECOPY 15 0 66
FLASHBACKLOG 0 0 0
从查询结果可以看出,在闪回区中,归档日志(ARCHIVELOG)占用74.05%的空间,备份(BACKUPPIECE)占用10.95%的空间,文件拷贝(IMAGECOPY)占用15%的空间。闪回区中已经没有空余的磁盘空间。
〖方法(Action) 〗
u 方法一:重新指定归档路径。
●如果使用SPFILE启动数据库,则可以动态改变归档路径。
SQL>alter system set log_archive_dest_1='location=/proddata' scope=both;
这里指定一个新的归档路径。
●如果使用PFILE启动数据库,则需要执行下面的过程。
Step01:进入初始化参数文件所在的目录
$ cd $ORACLE_HOME/dbs(这是默认路径)
本例中的PFILE是initnbo.ora。
Step02:编辑初始化参数文件
$vi initnbo.ora
添加参数:
log_archive_dest_1='location=/proddata'。
这里指定一个新的归档路径,这个路径要有足够的空间。
Step03:关闭数据库
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Step04:重启数据库。
SQL> startup PFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/initnbo.ora';
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 100663976 bytes
Database Buffers 184549376 bytes
Redo Buffers 2945024 bytes
Database mounted.
Database opened.
从此以后,数据库的归档日志将被写到/proddata下。
u 方法二:增加闪回区(Flash Recovery Area)的大小。
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE =20GSCOPE=BOTH SID='*';
System altered.
闪回区的大小被提到20G。
u 方法三:删除闪回区(Flash Recovery Area)中多余的归档日志文件。
总结:最根本的方法是删除一定量的log释放空间,方法如下:
1、RMAN> DELETE noprompt ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-30'; 物理逻辑一起删除
2、手动物理删除rm,然后逻辑删除
RMAN> connect target sys/sys123
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all;删除所有过期归档日志-需要确认
RMAN> delete norpromt expired archivelog all;删除所有过期归档日志-不需要确认
备注如果仅仅物理删除后,select * from v$archived_log还会出线。如果备份归档日志时还会出现如下错误信息
RMAN> backup archivelog all delete input format '/home/oracle/log_backup/log_%s_%p_%t';
Starting backup at 2007-07-16 17:55:48
current log archived
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 07/16/2007 17:55:49
RMAN-06059: expected archived log not found, lost of archived log compromises recoverability
ORA-19625: error identifying file /home/oracle/archive_log/1_18_627807837.dbf
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3