记一次生产库ORA-00257故障处理

故障现像

客户是一个虚拟机跑的生产库,前几天存储故障中断了几个小时服务,导致数据库都出现了坏块。

今天突然联系我说是业务系统不能用了,前台报错不能归档ORA-00257数据库,PLSQL也连不上,后台alert一直报错

复制代码
Errors in file D:\APP\ADMINISTRATOR\VIRTUAL\diag\rdbms\ORCL\ORCL\trace\ORCL_arc2_3736.trc:
ORA-00742: 日志读取在线程 1 序列 307139 块 7968 中检测到写入丢失情况
ORA-00312: 联机日志 1 线程 1: 'D:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\REDO01.LOG'
2026-05-26T19:33:34.821753+08:00
ARC2: All Archive destinations made inactive due to error 742
Committing creation of archivelog 'D:\ARCHIVELOG\ARC0000307139_1068117533.0001' (error 742)

客户还反馈了当前的定时rman备份也失败了,提示数据文件存在坏块

复制代码
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================

RMAN-03009: 位于 05/26/2026 01:08:27 的 c1 通道上的 backup 命令失败
ORA-19566: 超出损坏块限制 0 (文件 D:\APP\ADMINISTRATOR\VIRTUAL\PRODUCT\12.2.0\DBHOME_1\ORADATA\ORCL\XXX\XXX3.DBF)

连进去看了一下,应用这边的DBA也检测了下数据文件13号,发现一堆坏块,目测得有几百个。

复制代码
页 278049 标记为损坏
Corrupt block relative dba: 0x03443e21 (file 13, block 278049)
Completely zero block found during dbv:

页 278050 标记为损坏
Corrupt block relative dba: 0x03443e22 (file 13, block 278050)
Completely zero block found during dbv:

当然,还尝试了进行一下recover,很可惜,当时不知道谁给装了个标准版本的数据库。标准版没有block recover的功能。

复制代码
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: 位于 05/26/2026 16:43:00 的 recover 命令失败
RMAN-05009: 块介质恢复需要企业版

而且检查了下备份,他设置了保留1个备份的策略,但是之前好的备份己经都被清空了。。。

修复过程

还好,客户这边还有万能科力锐备份CDP的机器在跑,但不幸运的是故障的那天客户刚好关闭了一体机,但是好在还有个21号的备份,当前的实时CDP保护也是正常的。

沟通了一下客户,由于这个服务器是虚拟机,操作前建议客户给虚拟机打一个快照,以防万一,一切准备就绪后,开始执行操作。

其实操作也不复杂,查看一下 故障的日志组当前是inactive

复制代码
SQL> SELECT group#, sequence#, status, archived, bytes/1024/1024 AS size_mb FROM v$log;

    GROUP#  SEQUENCE# STATUS           ARC    SIZE_MB
---------- ---------- ---------------- --- ----------
         1    3071339 INACTIVE         NO         200
         2    307307 INACTIVE         NO         200
         3    307308 CURRENT          NO         200

那行直接清空一下就好了alter database clear unarchived logfile group 1;

以下是执行输出

复制代码
2026-05-26T19:38:18.540507+08:00
WARNING! CLEARING REDO LOG WHICH HAS NOT BEEN ARCHIVED. BACKUPS TAKEN
    BEFORE 05/22/2026 03:58:14 (CHANGE 17763614136) CANNOT BE USED FOR RECOVERY.
Clearing online log 1 of thread 1 sequence number 307139
2026-05-26T19:38:18.603005+08:00
Thread 1 cannot allocate new log, sequence 307309
Online log 1 still clearing
  Current log# 3 seq# 307308 mem# 0: D:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\REDO03.LOG
2026-05-26T19:38:20.478012+08:00
Thread 1 advanced to log sequence 307309 (LGWR switch)
  Current log# 1 seq# 307309 mem# 0: D:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\REDO01.LOG
2026-05-26T19:38:20.759253+08:00
Completed: alter database clear unarchived logfile group 1

执行成功后alter system switch logfile;测试切换归档成功,业务恢复。告诉客户观察一阵没问题就可以把虚拟机快照删除了。

接下来是备份的问题,由于数据文件坏了, 也没有最新的备份只好认载了,坏的还是数据表不是索引。坏就坏吧,但是RMAN备份还得备

修改下rman脚本,在里面添加13号数据文件允许300个坏块。。跳过。

复制代码
set maxcorrupt for datafile 13 to 300;

沟通了一下,把21号的科力锐的备份直接拉起虚拟机,几分钟就完事了,看一下虚拟机里的库还是完好的,剩下的交给业务处理吧,哪坏了不行再补哪里。

总结

有问题早发现啊!!这都好几天了,看来业务是真不用。

备份策略也有点毛病,备份没成功就把之前的好的备份全删除了~。

相关推荐
淡海水7 小时前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
DAVIED99 小时前
llama.cpp 本地部署完全指南
windows·llama·wsl·llamacpp
Light Gao10 小时前
企业级灰度发布技术方案
网络·数据库·oracle
云上飞4763696211 小时前
Windows WSL2 + Docker 环境下NVIDIA PhysicsNeMo 安装指南
windows·docker·physicsai·physicsnemo
weixin_66811 小时前
取消Windows 11 默认精简的鼠标右键文件夹菜单
windows·计算机外设
love530love11 小时前
彻底清理 Windows 右键“打开方式“中的重复/失效程序项(PyCharm 多版本残留实战 + 自动化脚本)
运维·人工智能·windows·pycharm·jetbrains·toolbox
腾科IT教育12 小时前
Oracle OCP/OCM认证含金量实测2026版
数据库·oracle·ocp·ocm·甲骨文
王维同学1 天前
进程模块枚举、映像身份与线程启动地址关联
c++·windows·安全
x²+(y-√³x²)²=11 天前
Linux打包文件到Windows,文件/文件类型丢失
linux·运维·windows
Rudon滨海渔村1 天前
windows10如何删除多余的输入法 - 仅保留English+拼音
windows·输入法