ORA-00257: archiver error. Connect internal only, until freed.
问题缘由:在做RMAN性能测试的时候发现我在insert大量数据,并且到达一定量的时候,oracle会报出错误,错误内容就是上面这句话。
问题描述:
The database is running in archive log mode with automatic archiving turned on. When the archive log destination diskspace becomes full the automatic archiving will stop. This is expected to happen. At this point a message should appear on the screen: ORACLE Instance v816 - Can not allocate log, archival required When all of the online redo logs are filled up, the database will be in a hang state. After freeing up diskspace the online redo logs are still not archiving. In most cases this is the CORRECT behaviour.
If you attempt to manually archive the files you may receive the following errors:
SVRMGR> archive log next ORA-16014: log 1 sequence# 199 not archived, no available destinations ORA-00312: online log 1 thread 1: 'C:ORACLEORADATAV816REDO01.LOG'
SVRMGR> archive log all ORA-16020: less destinations available than specified by LOG_ARCHIVE_MIN_SUCCEED_DEST
Solution Description --------------------
Some of the possible ways to fix this problem:
1. Use the command:
alter system archive log all to 'c:oracleoradatav816archive'; *NOTE: You MUST specify a location ref - ora-16014
2. Shutdown and restart the database. It may be necessary to do a Shutdown abort.
3. Use the REOPEN attribute of the LOG_ARCHIVE_DEST_n init.ora parameter.
LOG_ARCHIVE_DEST_n='
REOPEN=30' Or run the following comand:
alter system set LOG_ARCHIVE_DEST_n = 'reopen'
4. Use the commands:
alter system archive log stop; alter system archive log start;
Explanation -----------
The error ora-16014 is the real clue for this problem. Once the archive destination becomes full the location also becomes invalid. Normally Oracle does not do a recheck to see if space has been made available.
1. Using the command: alter system archive log all to 'c:oracleoradatav816archive'; gives Oracle a valid location for the archive logs. Even after using this the archive log destination parameter is still invalid and automatic achive does not work. This solution is best for systems that do not archive regularly but cannot be shutdown. You can also use this to allow you to do a Shutdown immediate instead of Shutdown abort.
2. Shutdown and restart of the database resets the archive log destinstation parameter to be valid. Do not forget to make disk space available before starting the database.
3. Use the REOPEN attribute of the LOG_ARCHIVE_DEST_n parameter to determine whether and when ARCn attempts to re-archive to a failed destination following an error. REOPEN applies to all errors, not just OPEN errors. REOPEN=n sets the minimum number of seconds before ARCn should try to reopen a failed destination. The default value for n is 300 seconds. A value of 0 is the same as turning off the REOPEN option, in other words, ARCn will not attempt to archive after a failure. If you do not specify the REOPEN keyword, ARCn will never reopen a destination following an error. The Server Administration Guide has more information on REOPEN.
References ----------
[BUG:1271752] AUTOMATIC ARCHIVING HAS NOT RESUMED AFTER SPACE IS FREED UP Server Administration Guide: Chapter 7
[NOTE:74324.1] Auto Archive Stopped - 8i LOG_ARCHIVE_DEST_n Issues .
问题解决办法:
归档日志使用的磁盘空间已满。
SQL> shutdown abort;
ORACLE instance shut down.
删除一些老的磁盘归档文件(我删除了所有的归档文件,然后就导致了另外的一个问题,问题解决将在后面一篇文章中指出)
SQL> startup
ORACLE instance started.
总结:
其实问题的本质是归档日志的使用已经达到了spfile等启动参数文件中指定的最大值。oracle 10g中归档日志默认的存放地是闪回目录,即%ORACLE_BASE%/flash_recovery_area的相应实例名下面,这个位置的大小在参数文件中有个限制,解决空间不足的问题可以通过两种方式来实现,一个修改这个大小限制,还有一个就是修改归档日志存放位置。我们下面就来说说这个归档日志目的地修改的方法。
首先从spfile创建pfile,因为spfile是不运行使用vi等工具直接修改的,我们可以直接使用vi修改pfile的文件。创建方法:create pfile from spfile; 这句要在数据关闭的情况下执行,创建出来的pfile在%ORACLE_HOME%/dbs下面init+实例名+.ora的文件。使用vi打开这个文件后加入LOG_ARCHIVE_DEST=''即可,然后再使用create spfile from pfile即可,这里的pfile可能要指定相应的位置,如create spfile from pfile=''; 。建立好后在startup数据库即可。