今天用sqlplus登陆后,startup就报了个错ORA-16038:
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 75499088 bytes
Database Buffers 205520896 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-16038: log 2 sequence# 171 cannot be archived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 2 thread 1: '/opt/oracle/oradata/orcl/redo02.log'
查了下资料,造成 无法归档的原因是log_archive_dest指定的归档空间已经满了。这个是我自己建的数据库,默认情况下是非归档模式,我前两天为了学习下归档的知识,就设置为归档模式,这才两天就出问题了。为了省事,我在网上找了个最简单的方法:你说我log2无法归档,我就把log2清除掉:
1. 当前日志组是1,满了,想要切换到2,发现2也是满的,没归档,所以报错
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 173 NO CURRENT
3 172 NO INACTIVE
2 171 NO INACTIVE
2. 为什么日志2组不归档了???因为我开启归档模式时,并没有指定log_archive_dest,这样归档日志就生成在/opt/oracle/flash_recovery_area/ORCL/archivelog下,而flash_recovery_area是有大小限制的,不能无限扩张的,通过下面两个视图就可以看到,flash_recovery_area已经马上要爆了。。。。
SQL> select NAME,space_limit,space_used from v$recovery_file_dest;
NAME
--------------------------------------------------------------------------------
SPACE_LIMIT SPACE_USED
----------- ----------
/opt/oracle/flash_recovery_area
2147483648 2101227008
SQL> select file_type,percent_space_used from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED
------------ ------------------
CONTROLFILE 0
ONLINELOG 0
ARCHIVELOG 97.85 -----------可以看到归档的使用率只占到 97.85%,无力再承担归档日志了
BACKUPPIECE 0
IMAGECOPY 0
FLASHBACKLOG 0
3. 我不想去扩展flash_recovery_area,嫌麻烦,直接清除要切换的日志组,这样就可以open数据库了
SQL> alter database clear unarchived logfile group 2;----这样系统就能切换到日志2组了,后来才发现这根本治标不治本
Database altered.
SQL> alter database open;
Database altered.
以为可以高枕无忧了,结果在PL/SQL上没敲几下,就报错:ORA-00257: archiver error. Connect internal only, until freed.一看就知道又是归档出现问题了,肯定是刚刚切换的日志2组满了,需要切换的时候发现又没有可用的日志组了。。。。。看来必须想个长久之计:不要归档日志在flash_recovery_area下生成了,换个地方:
SQL> alter system set log_archive_dest='/opt/oracle/oradata/archivelog1' scope=spfile;
System altered.
SQL> alter system set log_archive_duplex_dest='/opt/oracle/oradata/archivelog2' scope=spfile;
System altered.
指定归档位置,这里指定2个,用复镜像原理保护归档日志,重启数据库,OK,可以随便敲了。。。。。。。。。。。