客户的一套开发环境,大概了解到的背景是清理空间时redo被运维人员当作log误删除,一线同事先接手处理,过程中遇到问题升级到我这里继续分析。

接手后,数据库处于mount状态,之前恢复过程中已经做过resetlogs的操作,也设置了"_allow_resetlogs_corruption"隐藏参数为true,目前直接开库会提示需要恢复,重新进行resetlogs时报错ORA-600 [2662],起初看到这个错误心中略有些放松,根据经验,推下SCN就好了:

  1. SQL> alter database open;
  2. alter database open
  3. *
  4. ERROR at line 1:
  5. ORA-01113: file 1 needs media recovery
  6. ORA-01110: data file 1:
  7. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSTEM_FNO-1_1bujd4ob.dbf'
  8. SQL> recover database ;
  9. ORA-00283: recovery session canceled due to errors
  10. ORA-00399: corrupt change description in redo log
  11. ORA-00353: log corruption near block 3 change 32581427074 time 08/25/2020
  12. 11:39:04
  13. ORA-00312: online log 5 thread 1: '/oradata/ODSDB/datafile/redo05.log'
  14. SQL> recover datafile 1;
  15. ORA-00283: recovery session canceled due to errors
  16. ORA-00399: corrupt change description in redo log
  17. ORA-00353: log corruption near block 3 change 32581427074 time 08/25/2020
  18. 11:39:04
  19. ORA-00312: online log 5 thread 1: '/oradata/ODSDB/datafile/redo05.log'
  20. SQL> alter database open resetlogs;
  21. alter database open resetlogs
  22. *
  23. ERROR at line 1:
  24. ORA-01139: RESETLOGS option only valid after an incomplete database recovery
  25. SQL> recover database using backup controlfile until cancel;
  26. ORA-00279: change 32581427072 generated at needed for thread 1
  27. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  28. auto
  29. ORA-00266: name of archived log file needed
  30. ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
  31. ORA-01194: file 1 needs more recovery to be consistent
  32. ORA-01110: data file 1:
  33. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSTEM_FNO-1_1bujd4ob.dbf'
  34. SQL> alter database open resetlogs;
  35. alter database open resetlogs
  36. *
  37. ERROR at line 1:
  38. ORA-00603: ORACLE server session terminated by fatal error
  39. ORA-00600: internal error code, arguments: [2662], [7], [2516656013], [7],
  40. [2516660859], [327174016], [], [], [], [], [], []
  41. ORA-00600: internal error code, arguments: [2662], [7], [2516656012], [7],
  42. [2516660859], [327174016], [], [], [], [], [], []
  43. ORA-01092: ORACLE instance terminated. Disconnection forced
  44. ORA-00600: internal error code, arguments: [2662], [7], [2516656008], [7],
  45. [2516660859], [327174016], [], [], [], [], [], []
  46. Process ID: 3997864
  47. Session ID: 580 Serial number: 5

重新启动到mount状态,根据上面报错计算要推进的SCN值:

  1. SQL> select open_mode from v$database;
  2. OPEN_MODE
  3. --------------------
  4. MOUNTED
  5. SQL> select current_scn from v$database;
  6. SQL> set num 30
  7. 30217546463
  8. select 7*power(2,32) + 2516660859 from dual;
  9. select 7*power(2,32) + 2516661000 from dual;
  10. 32581432072

使用oradebug poke进行SCN推进:

  1. oradebug setmypid
  2. oradebug dumpvar sga kcsgscn_
  3. oradebug poke 0x700000000019B70 8 32581432072
  4. oradebug dumpvar sga kcsgscn_

推进SCN后,尝试直接开库报错ORA-00399、ORA-00353、ORA-00312:

  1. SQL> oradebug setmypid
  2. Statement processed.
  3. SQL> oradebug dumpvar sga kcsgscn_
  4. kcslf kcsgscn_ [700000000019B70, 700000000019BA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07000000 00019850
  5. SQL> oradebug poke 0x700000000019B70 8 32581432072
  6. BEFORE: [700000000019B70, 700000000019B78) = 00000000 00000000
  7. AFTER: [700000000019B70, 700000000019B78) = 00000007 96013308
  8. SQL> oradebug dumpvar sga kcsgscn_
  9. kcslf kcsgscn_ [700000000019B70, 700000000019BA0) = 00000007 96013308 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07000000 00019850
  10. SQL> alter database open;
  11. alter database open
  12. *
  13. ERROR at line 1:
  14. ORA-00399: corrupt change description in redo log
  15. ORA-00353: log corruption near block 3 change 32581427074 time 08/25/2020
  16. 11:39:04
  17. ORA-00312: online log 5 thread 1: '/oradata/ODSDB/datafile/redo05.log'

看起来有些麻烦,根据报错推断之前的resetlogs其实都没有完全成功。

此时查询各个checkpoint_change#都是一致的,正常应该可以open成功:

  1. select distinct checkpoint_change# from v$database;
  2. select distinct checkpoint_change# from v$datafile;
  3. select distinct checkpoint_change# from v$datafile_header;

可事实上,即使尝试read only开库都会报错ORA-16433:

  1. SQL> alter database open read only;
  2. alter database open read only
  3. *
  4. ERROR at line 1:
  5. ORA-16433: The database must be opened in read/write mode.

查了下这个错误,看起来控制文件有些问题,于是想重建下控制文件,结果发现命令同样报错ORA-16433:

  1. --recreate controlfile
  2. alter database backup controlfile to trace;
  3. SQL> alter database backup controlfile to trace;
  4. alter database backup controlfile to trace
  5. *
  6. ERROR at line 1:
  7. ORA-16433: The database must be opened in read/write mode.

而正常mount下,是可以执行此命令的。

没办法,只能根据控制文件的语法,查询必要信息,然后手工构建控制文件的创建脚本:

  1. --dbname
  2. ODSDB
  3. --select userenv('language') from dual;
  4. AMERICAN_AMERICA.AL32UTF8
  5. --nomount
  6. STARTUP NOMOUNT
  7. --create_controlfile.sql
  8. CREATE CONTROLFILE REUSE DATABASE "ODSDB" NORESETLOGS NOARCHIVELOG
  9. MAXLOGFILES 16
  10. MAXLOGMEMBERS 3
  11. MAXDATAFILES 1024
  12. MAXINSTANCES 8
  13. MAXLOGHISTORY 292
  14. LOGFILE
  15. GROUP 1 '/oradata/ODSDB/datafile/redo01.log' size 1024M blocksize 512,
  16. GROUP 2 '/oradata/ODSDB/datafile/redo02.log' size 1024M blocksize 512,
  17. GROUP 3 '/oradata/ODSDB/datafile/redo03.log' size 1024M blocksize 512,
  18. GROUP 4 '/oradata/ODSDB/datafile/redo04.log' size 1024M blocksize 512,
  19. GROUP 5 '/oradata/ODSDB/datafile/redo05.log' size 1024M blocksize 512,
  20. GROUP 6 '/oradata/ODSDB/datafile/redo06.log' size 1024M blocksize 512
  21. -- STANDBY LOGFILE
  22. DATAFILE
  23. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSTEM_FNO-1_1bujd4ob.dbf',
  24. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSAUX_FNO-2_1aujd4oa.dbf',
  25. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-ODS_FDM_P11_FNO-3_0fujd0al.dbf',
  26. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-USERS_FNO-4_30ujd66a.dbf',
  27. ..此处省略大量数据文件输出..
  28. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-ODS_FDM_FNO-89_08ujcris1.dbf',
  29. '/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-ODS_FDM_FNO-00_08ujcg7n.dbf'
  30. CHARACTER SET AL32UTF8
  31. ;

重建控制文件后,再次推SCN,最终恢复成功:

  1. select 7*power(2,32)+2616661492 from dual;
  2. 32681432564
  3. --recover again..
  4. conn /as sysdba
  5. startup nomount;
  6. @create_controlfile.sql
  7. oradebug setmypid
  8. oradebug dumpvar sga kcsgscn_
  9. oradebug poke 0x700000000019B70 8 32681432564
  10. oradebug dumpvar sga kcsgscn_
  11. recover database using backup controlfile until cancel;
  12. auto
  13. alter database open resetlogs;

最后将隐藏参数"_allow_resetlogs_corruption"设置为false,正常重启数据库正常:

  1. alter system set "_allow_resetlogs_corruption" = false scope=spfile;
  2. shut immediate
  3. startup

总结:主要还是推进SCN,只是这次遇到报错ORA-16433需要重建控制文件。

案例:记录一则强制开库遭遇ORA-16433的处理过程的更多相关文章

  1. 利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库)

    利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库),完成预期的任务,大致有下面几步: 1.代码提交到github平台 2.创建.podspec 3. ...

  2. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

  3. 记录参加“牛津计划.Docker在线黑客松”比赛的过程

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  4. 如何交叉编译开源库-->编译c-ares库从失败到成功的过程[ocean]

    编译c-ares库从失败到成功的过程c-ares-master: apt-get install libtool   ####https://github.com/c-ares/c-ares ==== ...

  5. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

  6. Android图表库MPAndroidChart(四)——条形图的绘制过程过程,隐隐约约我看到了套路

    Android图表库MPAndroidChart(四)--条形图的绘制过程过程,隐隐约约我看到了套路 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  7. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...

  8. 通达OA系统故障解决案例记录

    案例1: 现象:在人员访问量大的时候OA系统经卡死,并且经常宕机,需要启动apache服务 优化配置如下: D:\MYOA\conf\http.conf 修改参数如下: <IfModule mp ...

  9. Android 4.4.2 动态加入JNI库方法记录 (一 JNI库层)

    欢迎转载,务必注明出处.http://blog.csdn.net/wang_shuai_ww/article/details/44456755 本篇是继<s5p4418 Android 4.4. ...

  10. 简单的Cooki案例——记录用户上次访问该网页的时间

    功能: 帮助网站实现提示客户端计算机上次访问网站的时间 实现原理: 将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中, ...

随机推荐

  1. CoinBase是什么?

    什么是CoinBase交易? 比特币区块链上的每个区块中都会包含一个或者多个交易(transaction),其中第一个交易就叫做CoinBase交易. 什么是CoinBase交易? CoinBase交 ...

  2. Kubernetes 网络:Pod 和 container 的那点猫腻

    1. Kubernetes 网络模型 在 Kubernetes 的网络模型中,最小的网络单位是 Pod.Pod 的网络设计原则是 IP-per-Pod,即 Pod 中 container 共享同一套网 ...

  3. JVM 垃圾回收算法与垃圾回收器

    本文为博主原创,未经允许不得转载: 如何确定垃圾? 引用计数法: 在 Java 中,引用和对象是有关联的.如果要操作对象则必须用引用进行.因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以 ...

  4. 开发了一个json格式化工具,使用js格式化json的代码分享

    今天给大家介绍一下如何通过js来格式化json. 假设json字符串是: {"name":"刘德华","age":25.2,"bi ...

  5. 笔记本也能飞:运行chat大模型

    背景 在过去的一年,ChatGPT的崛起彻底改变了我们与AI的交互方式.它不再是被动的信息提供者,而是成为了一个可以与我们自由交流.分享知识的伙伴.无论是生活中的琐事,还是工作中的难题,ChatGPT ...

  6. 【linux】Linux内核结构体--kfifo 环状缓冲区

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  7. Oracle数据库统计信息_执行计划_sharedpool等的知识梳理

    Oracle数据库统计信息_执行计划_sharedpool等的知识梳理 背景 最近有项目出现了年底业务量增加时卡顿的情况. 同事多次发现执行SQL缓慢. 但是重新执行统计信息更新后问题就优化的现象. ...

  8. [转帖]oracle 审计日志清理

    https://www.cnblogs.com/bangchen/p/7268086.html   --进入审计日志目录: cd $ORACLE_BASE/admin/$ORACLE_SID/adum ...

  9. [转帖]kafka-console-ui v1.0.6发布

    前言 kafka-console-ui 是一款web版的kafka管理平台,从第一次发布到现在已经两年了,断断续续也更新了7个版本了(v1.0.0~v1.0.6). 一些常用的功能也陆续完善了不少,相 ...

  10. 你应该知道的Hooks知识

    Hooks Hooks 是 React16.8 的新增特性,能够在不写 class 的情况下使用 state 以及其他特性. 动机 在组件之间复用状态逻辑很难 复杂组件变得难以理解 难以理解的 cla ...