环境模拟:单机11204,开归档数据库,做写入事务时,删除所有redo。无备份。(2662可以模拟,4193模拟的效果不好没有undo损坏段)
大致流程
- 使用临时参数文件起mount
- 重建控制文件
- 推进控制文件scn
- Open resetlogs
- 重建undo
- 正常启动与后续工作(原则上所有强起的库都要做导出重建库)
隐含参数强起库
一般流程
1、配置隐含参数
2、恢复控制文件、或使用原控制文件启动到mount
3、恢复数据库(using backup controlfile)
4、Open resetlogs
在open resetlogs遇到需要恢复dbf1,需要按如下流程
- 重建控制文件
- 推进scn(先做recover until cancel,不做也应该可以)
- Open resetlogs
配置单实例的pfile参数文件,方便修改
cluster_database=false ###关闭集群模式,修复完成前不使用rac启动
_allow_resetlogs_corruption=true ###允许resetlogs损坏打开,redo与datafile损坏
Startup nomount pfile=‘/home/oracle/init.ora’
用以下sql查询dbf状态信息
select file#,checkpoint_change#,fuzzy from v$datafile_header;
#######mount状态下,fuzzy状态为yes情况下必须设置_allow_resetlogs_corruption=true
#######开库前的数据库scn应为全平
用以下语句重新生成控制文件
alter database backup controlfile to trace;
#######内有4个创建语句,(no)archivelog\(no)resetlog条件组合,
#######根据数据库状态与redolog是否损坏选择。我这里用arcivelog resetlogs
注1:重建控制文件内不存在tempfile,需要手添加tempfile
Alter tablespace temp add tempfile ‘/u01/app/oracle/oradata/prod/temp01.dbf’size 5m autoextend on;
ora600【2662】、【2663】 控制文件scn不足
一般强制起库时会遇到以下报错
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
ORA-00600: internal error code, arguments: [2662], [0], [2419301], [0],
[2462324], [12583040], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [2662], [0], [2419300], [0],
[2462324], [12583040], [], [], [], [], [], []
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00600: internal error code, arguments: [2662], [0], [2419298], [0],
[2462324], [12583040], [], [], [], [], [], []
Process ID: 7568
Session ID: 1 Serial number: 5
2662\2663都是scn不足的报错。处理方法相同。
黄底字样是当前的scn,蓝底字样是起库需要的scn
常用的推进工具有以下
- Oradebug工具,详见后
- 事件event 10015(adjust scn事件)###12c后摒弃
Mount状态时,alter session set event 10015 trace name adjust_scn level 1;
3、隐含参数_minimum_giga_scn###该隐含参数仅支持10g
_minimum_giga_scn=1000
Oradebug流程见下
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> oradebug poke 0x06001AE70 8 1073741824 ####要推进值算法见后
BEFORE: [06001AE70, 06001AE78) = 00000000 00000000
AFTER: [06001AE70, 06001AE78) = 40000000 00000000
SQL> alter database open resetlogs;
概念
ORA-00600: internal error code, arguments: [2662], [0], [2419301], [0],[2462324], [12583040],
scn wrap scn base
数据库scn计算
scn=scn wrap * power(2,32)+scn base
推进的scn为scn/1024/1024/1024后向上取整,再*1024*1024*1024
ora600【4193】、【4194】、【4197】undo损坏
一般流程为
1、Undo设置manual起库
2、新建undotbs,查询损坏undo段
3、指定新undotbs,屏蔽undo段启动
4、重建之前的undotbs
5、恢复之前的参数状态启动
数据库启动后,或启动时alert中看到
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_mmon_7620.trc (incident=27730):
ORA-00600: internal error code, arguments: [4193], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /u01/app/oracle/diag/rdbms/prod/PROD/incident/incdir_27730/PROD_mmon_7620_i27730.trc
可能遇到无法启动,先设置参数
undo_management=manual
一般可以启动
查询故障的undo段
select SEGMENT_ID,SEGMENT_NAME,STATUS,TABLESPACE_NAME from dba_rollback_segs where status not in('ONLINE','OFFLINE')
查询死掉的事务
select KTUXEUSN,KTUXESLT,KTUXESTA,KTUXECFL,KTUXESIZ from x$ktuxe where KTUXESTA='ACTIVE' and KTUXECFL='DEAD';
重建新的undo表空间,将实例表空间指向该新表空间(spfile),设置隐含参数屏蔽undo段,启动。
Undo_tablespace=undotbs9
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
重建undotbs
Drop tablespace undotbs1;
Create undo tablespace undotbs1 datafile ‘/u01/app/oracle/oradata/prod/undotbs1.dbf’ size 500m autoextend on;
官方参考文献
281429.1
Basic Steps to be Followed While Solving ORA-00600 [4194]/[4193] Errors Without Using Unsupported parameter (文档 ID 281429.1)
1428786.1
Step by step to resolve ORA-600 4194 4193 4197 on database crash (文档 ID 1428786.1)
28929.1
ORA-600 [2662] "Block SCN is ahead of Current SCN" (文档 ID 28929.1)