ORA-16038&ORA-00257

本文记录了一次Oracle数据库启动失败的经历,由于归档日志空间不足导致启动错误。作者详细介绍了如何诊断问题,包括查看日志状态、检查归档空间使用情况,并最终通过修改归档路径解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用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,可以随便敲了。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值