糟糕,Oracle归档满RMAN进不去,CPU98%了!

📢📢📢📣📣📣

哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验

一位上进心十足的【大数据领域博主】!😜😜😜

中国DBA联盟(ACDU)成员,目前服务于工业互联网

擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。

✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

    • [📣 1.故障现象](#📣 1.故障现象)
    • [📣 2.故障分析](#📣 2.故障分析)
    • [📣 3.故障处理](#📣 3.故障处理)
      • [✨ 3.1 物理删除归档](#✨ 3.1 物理删除归档)
      • [✨ 3.2 停止监听](#✨ 3.2 停止监听)
      • [✨ 3.3 强制关库](#✨ 3.3 强制关库)
      • [✨ 3.4 pfile修改启库](#✨ 3.4 pfile修改启库)
      • [✨ 3.5 RMAN删除归档](#✨ 3.5 RMAN删除归档)
      • [✨ 3.6 重新启库调整归档](#✨ 3.6 重新启库调整归档)
    • [📣 4.定时删除归档任务](#📣 4.定时删除归档任务)
    • [📣 5.总结](#📣 5.总结)

Oracle归档满基本会导致服务器卡,无法登录SQLPLUS及RMAN,做好策略

📣 1.故障现象

业务反馈应用无法访问数据库,如下报错

报错ORA-00257: Archiver error. Connect AS SYSDBA only until resolved错误解决

📣 2.故障分析

从本次报错来看,是归档满导致,处理的办法是直接删归档即可,可是当登录服务器的时候,发现根本无法登录RMAN执行删除归档,而且SQLPLUS也不进去,无法调整归档相关参数,怎么办?
从ALERT日志来看,无法开库的原因是归档空间满,数据库已经无法登录导致

Errors in file /u01/oracle/diag/rdbms/devdb/devdb/trace/devdb_tt00_3486.trc:

ORA-19809: limit exceeded for recovery files

ORA-19804: cannot reclaim 1073741824 bytes disk space from 214748364800 bytes limit

那么接下来首先得从物理空间删除归档,

再强制管库调整归档参数,重新启动库删除归档

📣 3.故障处理

✨ 3.1 物理删除归档

确认归档路径后发现是放到快速恢复区,那么找到后直接物理删除归档

快速恢复区目录:fast_recovery_area

✨ 3.2 停止监听

oracle@dev1 \~$ lsnrctl stop

✨ 3.3 强制关库

--强制关闭库,这个很关键,因为此时已经无法SQLPLUS登录了

ps -ef|grep ora_dbw0_$ORACLE_SID

然后kill掉

kill -9 PID

✨ 3.4 pfile修改启库

--创建PFILE

SYS@devdb> create pfile='/home/oracle/devspfile.ora' from spfile;

--将快速恢复区修改大一点启动库,原来200G,修改到400G
.db_recovery_file_dest_size=404800m
--pfile启动数据库
SQL> startup pfile='/home/oracle/pfile.ora';
oracle@dev1 \~$ sqlplus / as sysdba
SQL
Plus: Release 19.0.0.0.0 - Production on Thu Mar 14 13:55:26 2024

Version 19.3.0.0.0

Copyright © 1982, 2019, Oracle. All rights reserved.

Connected to an idle instance.

SYS@devdb> startup pfile='/home/oracle/devspfile.ora';

ORACLE instance started.

Total System Global Area 2.5837E+10 bytes

Fixed Size 26605704 bytes

Variable Size 3288334336 bytes

Database Buffers 2.2481E+10 bytes

Redo Buffers 40501248 bytes

Database mounted.

Database opened.
SYS@devdb> archive log list

Database log mode Archive Mode

Automatic archival Enabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 274

Next log sequence to archive 278

Current log sequence 278

✨ 3.5 RMAN删除归档

--登录RMAN删除归档

RMAN> crosscheck archivelog all;

RMAN> delete expired archivelog all;

RMAN> delete archivelog until time 'sysdate-1';

select * from V$FLASH_RECOVERY_AREA_USAGE;

注意:必须通过RMAN删除归档,不然控制文件不更新,还是登录不了

✨ 3.6 重新启库调整归档

--重新启动库

SYS@devdb> startup force;

--调整归档路径,从快速恢复区移动到其他目录

SYS@devdb> alter system set log_archive_dest_1='location=/zisemi/oracle/arch;

📣 4.定时删除归档任务

因为是个单机库,后期防止归档满,设置定时任务删除

root@devdb \~# su - oracle

oracle@devdb \~$ mkdir -p /home/oracle/script

oracle@devdb \~$ mkdir -p /home/oracle/arch/log
root@devdb \~# su - oracle

oracle@devdb \~$ mkdir -p /home/oracle/script

oracle@devdb \~$ mkdir -p /home/oracle/archlog

bash 复制代码
vi /home/oracle/script/archdel_dev.sh
export ORACLE_HOME=/u01/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=devdb
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
rman target / log /home/oracle/archlog/log_arch.log  <<EOF
run{ 
allocate channel ch1 type disk;
allocate channel ch2 type disk;
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog until time 'sysdate-3';
release channel ch1;
release channel ch2;
}
EOF

crontab -l

0 23 * * * su - oracle -c "/home/oracle/script/archdel_dev.sh"

📣 5.总结

本次故障总结如下:

1.归档不要放在快速恢复区,不好管控

2.归档要设置定时任务删除,比如备份后删除或者定时脚本删除

3.归档满一定要从RMAN进去删除,控制文件才能更新

4.归档满基本会导致服务器卡,无法登录SQLPLUS及RMAN,需要采取强制关库

相关推荐
敲个大西瓜4 小时前
Redis一百道核心面试题
数据库·redis·缓存
無a伟7 小时前
Redis持久化详解:RDB与AOF原理、配置、优缺点
数据库
小罗水8 小时前
附录A 各微服务完整 application.yml 配置汇总
数据库·elasticsearch·微服务
muddjsv8 小时前
SQLite 外键进阶:CASCADE / SET NULL / 级联更新与完整性校验
数据库·sqlite
APItesterCris8 小时前
Open Claw 实战教程:5 分钟搭建京东商品自动化监控与数据分析系统
大数据·运维·数据库·数据仓库·自动化
Nturmoils9 小时前
查库存的 SQL 时灵时不灵,最后发现是 WHERE 里两个函数在打架
数据库
不想纳尼的青春9 小时前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
倔强的石头_10 小时前
Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误
数据库
杨云龙UP10 小时前
生产环境Oracle表空间扩容实战:使用Toad for Oracle图形界面新增Datafile(ASM+OMF)
linux·运维·数据库·oracle·表空间·asm 存储管理·toad
黑桃小柒710 小时前
Django模型关系:从一对多到多对多全解析
数据库·django·sqlite