故障场景: AIX IBM 存储更换存储控制器电源模块导致存储双控同时掉电, 存储双控恢复供电后发生锁盘, IBM 解盘后 RAC 数据库无法正常启动, 启动报错: ORA-00600: internal error code, arguments: [2131], [33], [32], [], [], [], [], [], [], [], [], []
恢复方案确定: 由于损坏的数据库数据量巨大, 有 30T 之多, 并且要求尽快打开数据库, 可以接受丢失部分数据, 数据库有备份. 商议之下, 使用备份控制文件恢复数据库, 进行数据库的不一致性恢复.
恢复过程:
1, 从磁带库拉取控制文件备份集并恢复到 Oracle RAC 数据库 ASM 存储中
-- 此时尝试启动数据库会遇到报错信息:
- ORA-00600: internal error code, arguments: [3020], [718], [2828551], [3014338823], [], [], [], [], [], [], [], []
- ORA-10567: Redo is inconsistent with data block (file# 718, block# 2828551, file offset is unknown bytes)
2, 生成 Oracle 的 pfile 并加入如下三个参数
- _allow_resetlogs_corruption=true #跳过 redo 崩溃, 允许 resetlogs 开库
- undo_management=manual #将 undo 管理修改为手工管理
- event="10513 trace name context forever,level 2" #开 10513 事件跳过一致性验证
- *.cluster_database=false
-- 此时, 尝试启动数据库会遇到报错信息:
ORA-00600: internal error code, arguments: [2662], [3735], [1979553782], [3735], [1979584838], [20971664], [], [], [], [], [], []
3,Oracle 数据库使用备份控制文件恢复数据库后, 需要推进控制文件的 SCN
数据库当前的 SCN= 3735.1979584838=(3735*4294967296)+1979584838=16043682435398
giga=16043682435398/1024/1024/1024=14941.843=14941
需要推进的新 SCN=14942*1024*1024*1024=16043850334208
Oracle 数据库 10g 控制文件推进可以在 pfile 中加入参数:_minimum_giga_scn;
ORACLE 11.2.0.4 SCN 推进方法 oradebug
本次数据库控制文件 SCN 推进步骤步骤
SQL> oradebug setmypid
Statement processed.
- SQL> oradebug dumpvar sga kcsgscn_
- kcslf kcsgscn_ [700000000019B70, 700000000019BA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07000000 00019850
- SQL> oradebug poke 0x700000000019B70 8 16043850334208
- BEFORE: [700000000019B70, 700000000019B78) = 00000000 00000000
- AFTER: [700000000019B70, 700000000019B78) = 00000E97 80000000
- SQL> oradebug dumpvar sga kcsgscn_
- kcslf kcsgscn_ [700000000019B70, 700000000019BA0) = 00000E97 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07000000 00019850
- SQL>
-- 此时尝试启动数据库会遇到报错信息:
ORA-00600: internal error code, arguments: [4193], [], [], [], [], [], [], [], [], [], [], []
接下来 ORA600[4193] 的处理就是 ORACLE rac 的 undo 表空间的重建了, 需要配合参数: undo_management 和_CORRUPTED_ROLLBACK_SEGMENTS.
4, 处理完 ORA600[4193] 后, 数据库能够启动并打开到 open 状态, 此时最好进行全库备份, 如果条件允许, 就重建数据库以逻辑的方式导出故障数据库导新环境. 否则, 后续的使用中会时不时遇到如下报错信息:
ORA600[6122] 和 ORA600[KDSGRP1], 实质文件是索引逻辑坏块引起的, 以 drop 和 create 重建相关的索引即可.
来源: http://www.linuxidc.com/Linux/2019-05/158851.htm