问题描述:本来还在愉快的工作中,突然同时通知客户主数据库无法登陆了,心中莫名的一紧,赶紧登陆数据库查看,发现只有sys账号可以正常登录,其他账号登录均提示ORA00257错误。

ORA-00257: archiver error. Connect internal only, until freed Oracle 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

赶紧百度一下,看大致的意思为归档日志写满了、闪回日志写满了。根据网上提供的方法进行查看:

select * from v$recovery_file_dest;
select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;
select * from v$flash_recovery_area_usage;
select * from v$version;

发现根本没有信息返回,应该是未开启闪回日志,正好想起前一阶段数据库才开启了归档日志,因此怀疑是归档日志写满的问题。归档日志信息可以在v$archived_log表中查询到。

解决方法:

因为时间比较紧急,没空给我进行慢慢的排查解决了(主要是我太菜),直接求助公司大神吧。具体解决步骤如下:

1、远程登录数据库任意节点(现场为rac集群),切换到oracle账号通过lsnrctl status命令查看监听到的服务。

ORA-00257: archiver error. Connect internal only, until freed Oracle 第2张

在执行lsnrctl status命令时候,如果提示命令未找到,很可能是环境变量的问题,通过source ~/.bash_profile命令使之生效即可。

2、到grid用户下,分别执行以下命令,进入asmcmd命令行。

su – grid 
export ORACLE_SID=+ASM1
asmcmd

ORA-00257: archiver error. Connect internal only, until freed Oracle 第3张

这里需要注意一下,su – grid 而不是su grid之前执行的时候就想当然的弄错了,结果执行命令的时候一直报错。

其简单区别如下:

su - grid 要给grid 重新配置环境变量
su grid 使用切换到grid 用户之前的那个用户的环境变量。

执行lsdg命令查看磁盘组使用情况:

ORA-00257: archiver error. Connect internal only, until freed Oracle 第4张

可以查看磁盘组总量,以及可使用量(我这里是删除部分日志后的截图),查看其可用空间是否满足。

3、如果需要删除归档日志,需要定位到归档日志目录,查看归档日志情况。

cd +DATADG/orcl/archivelog

ls

ORA-00257: archiver error. Connect internal only, until freed Oracle 第5张

4、根据自己需要,删除执行的归档日志即可。例如,删除2020年2月份的归档日志可以使用rm -rf 2020_02*命令。

优化建议:

对于出现这种情况,归根结底是磁盘无法放下过多的归档日志,可以考虑:

1、挂接单独的磁盘组存储归档日志,并同步进行备份(推荐)。

2、对当前磁盘组进行扩容。

3、定期进行人工检查,删除部分归档日志以保证磁盘空间保持有剩余状态,或者设置自动删除较早的归档日志。


后续补充:通过下面语句可以查看磁盘归档日志的大小占用情况。

SELECT TRUNC(FIRST_TIME) "日期",
TRUNC(SUM(BLOCKS*BLOCK_SIZE)/1024/1024/1024,2) "大小(GB/DAY)"
FROM V$ARCHIVED_LOG GROUP BY TRUNC(FIRST_TIME)  ORDER BY 1 DESC

ORA-00257: archiver error. Connect internal only, until freed Oracle 第6张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄