ORACLE 10g数据库突然无法使用,报 “ORA-19809: 超出了恢复文件数的限制”错误。
经过查阅相关资料,该问题应为db_recovery_file_desc满,实际上db_recovery_file_desc有一个对应的文件目录,位置为:
D:\oracle\product\10.2.0\flash_recovery_area
删除归档日志。
1、登录
D:\oracle\product\10.2.0\db_1\BIN>SQLPLUS SYS/SYS AS SYSDBA
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 1199570944 bytes
Fixed Size 1250380 bytes
Variable Size 209718196 bytes
Database Buffers 981467136 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-16038: 日志 3 序列号 1717 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 3 线程 1: 'D:\ORADATA\UAPDB\UAPDB\REDO03.LOG'
2、查看空间
SQL> select * from v$recovery_file_dest;
NAME
--------------------------------------------------------------------------------
SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---------------
D:\oracle\product\10.2.0/flash_recovery_area
2147483648 2146949632 0 45
3、使用RMAN检查
D:\oracle\product\10.2.0\db_1\BIN>rman target /
RMAN> crosscheck archivelog all;
4、删除日志文件
MAN> delete expired archivelog all;
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=151 devtype=DISK
说明与恢复目录中的任何存档日志均不匹配
这种删除方法有问题!
MAN> delete noprompt archivelog until time "sysdate -3";
顺利删除!
MAN> delete noprompt archivelog until time "sysdate";
删除所有的日志文件。
退出后在sqlplus中用startup重新启动,正常启动。
注意:该操作可能有丢失数据的风险,在生产环境操作时要谨慎进行。
SQL> startup
ORACLE instance started.
Total System Global Area 263049216 bytes
Fixed Size 2212448 bytes
Variable Size 234884512 bytes
Database Buffers 20971520 bytes
Redo Buffers 4980736 bytes
Database mounted.
ORA-03113: 通信通道的文件结尾
进程 ID: 5801
会话 ID: 1 序列号: 5
[oracle@web trace]$ tail -f alert_orcl.log
ORA-19809: 超出了恢复文件数的限制
ORA-19804: 无法回收 44062720 字节磁盘空间 (从 4070572032 限制中)
ARCH: Error 19809 Creating archive log file to '/opt/oracle/flash_recovery_area/ORCL/archivelog/2011_11_04/o1_mf_1_482_%u_.arc'
Errors in file /opt/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_6141.trc:
ORA-16038: 日志 2 sequence# 482 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 2 线程 1: '/opt/oracle/oradata/orcl/redo02.log'
USER (ospid: 6141): terminating the instance due to error 16038
Fri Nov 04 15:28:21 2011
Instance terminated by USER, pid = 6141
Fri Nov 04 15:30:35 2011
通过这里的错误信息,可以看到是归档归档不了了,马上查看归档的路径
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 23
下一个存档日志序列 25
当前日志序列 25
用的是DB_RECOVERY_FILE_DEST的路径了。估计又是以前遇到过的错误的。
Oracle官方的有关19809的信息
ORA-19809: limit exceeded for recovery files
Cause: The limit for recovery files specified by the DB_RECOVERY_FILE_DEST_SIZE was exceeded.
Action: The error is accompanied by 19804. See message 19804 for further details.
ORA-19804: cannot reclaim string bytes disk space from string limit
Cause: Oracle cannot reclaim disk space of specified bytes from the DB_RECOVERY_FILE_DEST_SIZE limit.
Action: There are five possible solutions:
1) Take frequent backup of recovery area using RMAN.
2) Consider changing RMAN retention policy.
3) Consider changing RMAN archivelog deletion policy.
4) Add disk space and increase DB_RECOVERY_FILE_DEST_SIZE.
5) Delete files from recovery area using RMAN.
基本上的原因是,db_recovery_file_desc有size限制,默认是2G,如果用户没有设置过的话,应该就是这里的归档的文件超过了这个大小,而导致归档失败了,
先查看一下情况吧
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 23
下一个存档日志序列 25
当前日志序列 25
SQL> select * from v$recovery_file_dest;
NAME
--------------------------------------------------------------------------------
SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---------------
/opt/oracle/flash_recovery_area
4070572032 4068022784 0 100
这里已经把所有的db_recovery_file_dest的容量都占完了。
解决方法:删除多余的归档文件。然后设置较大的db_recovery_file_dest_size。
删除多余的归档文件
打开RMAN
rman target /
RMAN>crosscheck archivelog all; -- 运行这个命令可以把无效的expired的archivelog标出来。
RMAN>delete expired archivelog all; -- 直接全部删除过期的归档日志。
RMAN>delete noprompt archivelog until time "sysdate -3"; -- 也可以直接用一个指定的日期来删除。
重新打开数据库:
SQL> alter database open;
Database altered.
action
指定retention的策略,使得archivelog不至于这样增加
RMAN>configure retention policy to recovery window of 7 days;
RMAN>configure retention policy to redundancy 3;
SQL>alter system db_recovery_file_dest_size=4G scope=both;
把archivelog_dest指定到没有限制的地方
SQL>alter system log_archive_dest='/home/oracle';
查看修改ORACLE10G归档日志空间的限制
在ORACLE10G中,默认的归档路径为$ORACLE_BASE/flash_recovery_area。对于这个路径,ORACLE有一个限制,就是默认只能有2G的空间给归档日志使用,可以使用下面两个SQL语句去查看它的限制:
1. select * from v$recovery_file_dest;
2. show parameter db_recovery_file_dest(这个更友好直观一些)
当归档日志数量大于2G时,那么就会由于没有更多的空间去容纳更多的归档日志会报无法继续归档的错误。
如:“RA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 10017792 bytes disk space from 2147483648 limit
ARC0: Error 19809 Creating archive log file to '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2007_04_30/o1_mf_1_220_0_.arc' ”这时我们可以修改它的默认限制,比如说将它增加到5G或更多,也可以将归档路径重新置到别的路径,就不会有这个限制了。
更改限制语句如下:
alter system set db_recovery_file_dest_size=5368709102 (这里为5G 5x1024x1024x1024=5G)
alter system set db_recovery_file_dest_size=10737418240