Oracle 10g默认归档路径在闪回区的2G空间大小限制问题是本文我们主要要介绍的内容,接下来我们就通过一个实际的例子来开始介绍。实例使这样的,在为客户解决问题时,打开数据解压缩后一看,他们还是用的Oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本的exp是可以用高版本的imp导入到高版本数据库中的。
一看是导入还很正常,导入到其中某个表的时候,突然就不动了。一开始我还没有弄明白怎么回事。后来,无意中看到了计算机管理--事件查看器中,有很多报错信息:
- Archive process error: ORA-16038: log 1 sequence# 317 cannot be archived
- ORA-19809: limit exceeded for recovery files
- ORA-00312: online log 1 thread 1: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORACLE/REDO01.LOG'
我这才发现,问题出在了归档上了。
又看了alert_oracle.log文件,也有很多这个报错信息。到这里,这个问题给了我一个教训:与oracle有关的操作,只要有问题,肯定会向alert_oracle.log文件写入日志的,就看你有没有意识去看这个日志文件了。
网上查看资料得知:Oracle 10g在默认情况下,归档日志是保存在闪回恢复区的(对于我的来说是:E:/oracle/product/10.2.0/flash_recovery_area/ORACLE/ARCHIVELOG),如果你建库的时候用的默认设置,闪回恢复区应该是2G,空间被占满了以后就无法再归档了。
此时,我从sqlplus open database,有提示:
- Microsoft Windows XP [版本 5.1.2600]
- (C) 版权所有 1985-2001 Microsoft Corp.
- C:/Documents and Settings/Administrator>sqlplus / as sysdba
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 11月 26 17:58:22 2008
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- 连接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
- With the Partitioning, OLAP and Data Mining options
- SQL> select open_mode from v$database;
- OPEN_MODE
- ----------
- MOUNTED
- SQL> alter database open;
- alter database open
- *
- 第 1 行出现错误:
- ORA-16014: 日志 1 的序列号 317 未归档, 没有可用的目的地
- ORA-00312: 联机日志 1 线程 1:
- 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORACLE/REDO01.LOG'
- SQL>
那怎么解决这个问题呢?网上的高手也给出了不少方法(以下的方法为转载,原文地址:http://yaanzy.itpub.net/post/1263/286285 ):
解决方法:
1.将归档设置到其他目录,修改alter system set log_archive_dest = 其他路径。
2.转移或者删除闪回恢复区里的归档日志。
3.增大闪回恢复区。
- ALTER SYSTEM SET db_recovery_file_dest_size=4g scope=both;
我的处理方法是采用第3种方法,下边是我的操作过程:
- SQL> show parameter db_recovery_file_dest_size;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_recovery_file_dest_size big integer 2G
- SQL> alter system set db_recovery_file_dest_size=3G;
- 系统已更改。
- SQL> alter database open;
- 数据库已更改。
- SQL> show parameter db_recovery_file_dest_size;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_recovery_file_dest_size big integer 3G
- SQL>
值得注意的是,我执行完毕alter system set db_recovery_file_dest_size=3G;后,马上又去show parameter db_recovery_file_dest_size;此时显示的是3g了,不是原来的2g了。从另外一个方面来说:E:/oracle/product/10.2.0/db_1/dbs/SPFILEORACLE.ORA这个文件的修改时间,就是我执行alter system set db_recovery_file_dest_size=3G; 这就更证明,此更改马上就生效了。
如果将归档路径下的可用空间扩充到了3G,也就是在原来2G的基础上又加了1G. oracle database下新形成的归档日志,实际上是用的这个新增的1G的空间。也许会有人提出疑问,“那我把原来已经形成的2G归档日志删除掉,oracle database不就能用3G了么?”其实不是这样,虽然在物理空间上,已经删除了2G,但是动态性能视图(v$recovery_file_dest)并没有释放此这2g空间,可以使用select * from v$recovery_file_dest 查询出来。
若你不从动态性能视图里删除这2G的空间,oracle database会认为这2G依然被占用。若是有个大的事物提交,并有频繁的日志切换,1G的空间马上就被用完,到时候你的alert_oracle.log就有错误出现,比如:
- ORA-19815: WARNING: db_recovery_file_dest_size of 3221225472 bytes is 100.00% used, and has 0 remaining bytes available.
- *** 2008-11-28 10:05:13.375
- ************************************************************************
- You have following choices to free up space from flash recovery area:
- 1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
- then consider changing RMAN ARCHIVELOG DELETION POLICY.
- 2. Back up files to tertiary device such as tape using RMAN
- BACKUP RECOVERY AREA command.
- 3. Add disk space and increase db_recovery_file_dest_size parameter to
- reflect the new space.
- 4. Delete unnecessary files using RMAN DELETE command. If an operating
- system command was used to delete files, then use RMAN CROSSCHECK and
- DELETE EXPIRED commands.
- ************************************************************************
- ORA-19809: limit exceeded for recovery files
- ORA-19804: cannot reclaim 47715840 bytes disk space from 3221225472 limit
- *** 2008-11-28 10:05:13.406 60680 kcrr.c
- ARC0: Error 19809 Creating archive log file to 'E:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORACLE/ARCHIVELOG/2008_11_28/O1_MF_1_344_%U_.ARC'
解决以上问题,就需要删除掉动态性能视图中的已占用空间的信息。按照eygle大师在http://www.eygle.com/archives/2005/03/oracle10gecieif.html 一文中的方法,是用rman来删除这些信息。所用到的rman命令如下:
1.是RMAN> crosscheck archivelog all;--此命令的含义是检查所有归档日志的状态,并把遗失的标记为expired,也就是说,expired 表示已经被操作系统中被删除的归档日志。
2.是delete expired archivelog all; --此命令的含义是删除expired的归档日志。
关于Oracle 10g默认归档路径在闪回区的2G空间大小限制问题的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
【编辑推荐】