下载丨9月数据库技术通讯:Redo日志丢失,重建遭遇ORA-16433处理
这里推荐一个常见的问题,希望对大家有借鉴作用。
故障: Redo日志丢失,重建遭遇ORA-16433处理
在Oracle中,Redo日志文件包含所有的数据库变化历史记录,例如所有的DML变化(INSERT、UPDATE、DELETE和SELECT FOR UPDATE)
和所有DDL
语句造成的数据字典对象的更改及递归语句的更改等,所以redo
文件可以最大限度地保证数据的一致性与安全性。万一数据库出现故障可以启用数据恢复。但是redo
日志被误删了怎么办呢?本文通过一个案例来了解一下redo
日志被误删,强制开库遭遇ORA-16433
,供大家参考。
问题描述:客户的一套开发环境,版本为11.2.0.4
, redo
在清理空间时被运维人员当作log
误删除,在恢复的过程中已经做过resetlogs
的操作,并且将“_allow_resetlogs_corruption"
这个隐藏参数设置成了true
,但是在mount
状态打开数据库时会提示需要恢复,重新进行resetlogs
时报错ORA-600 [2662]
。根据以往经验,推进SCN
就好了,但是推进之后还是无法打开数据库,最后通过重建控制文件得以解决。
问题分析
1、强行打开数据库报错 当redo
日志不存在的时候,强制打开数据库会报错,然后根据报错提示进行恢复,再次进行resetlogs
启动的时候报错
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1:
'/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSTEM_FNO-1_1bujd4ob.dbf'
SQL> recover database ;
***
ORA-00312: online log 5 thread 1: '/oradata/ODSDB/datafile/redo05.log'
SQL> recover datafile 1;
***
ORA-00312: online log 5 thread 1: '/oradata/xxxx/datafile/redo05.log'
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 32581427072 generated at needed for thread 1
***
ORA-01110: data file 1:
'/oradata/ODSDB/datafile/data_D-ODSDB_I-3532120983_TS-SYSTEM_FNO-1_1bujd4ob.dbf'
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
***
[2516660859], [327174016], [], [], [], [], [], []
Process ID: 3997864
Session ID: 580 Serial number: 5
2、根据报错推进SCN
重新启动到mount状态,根据上面报错计算要推进的SCN值
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
MOUNTED
SQL> select current_scn from v$database;
SQL> set num 30
30217546463
select 7*power(2,32) + 2516660859 from dual;
select 7*power(2,32) + 2516661000 from dual;
32581432072
使用oradebug poke进行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 32581432072
BEFORE: [700000000019B70, 700000000019B78) = 00000000 00000000
AFTER: [700000000019B70, 700000000019B78) = 00000007 96013308
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [700000000019B70, 700000000019BA0) = 00000007 96013308 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07000000 00019850
推进之后,打开数据库依然报错
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-00399: corrupt change description in redo log
ORA-00353: log corruption near block 3 change 32581427074 time 08/25/2020
11:39:04
ORA-00312: online log 5 thread 1: '/oradata/ODSDB/datafile/redo05.log'
这时候看起来有些麻烦,根据报错推断之前的resetlogs
其实都没有完全成功。此时查询各个checkpoint_change#
都是一致的,正常应该可以open
成功。但是即使尝试read only
开库都会报错ORA-16433
:
SQL> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-16433: The database must be opened in read/write mode.
查了下这个错误,看起来控制文件有些问题,于是想重建下控制文件,结果发现命令同样报错ORA-16433,而正常mount下,是可以执行此命令的。
没办法,只能根据控制文件的语法,查询必要信息,然后手工构建控制文件的创建脚本
重建控制文件之后,再次推进SCN
,就可以打开数据库了
select 7*power(2,32)+2616661492 from dual;
32681432564
--recover again..
conn /as sysdba
SQL>startup nomount;
SQL>@create_controlfile.sql
SQL>oradebug setmypid
SQL>oradebug dumpvar sga kcsgscn_
SQL>oradebug poke 0x700000000019B70 8 32681432564
SQL>oradebug dumpvar sga kcsgscn_
SQL>recover database using backup controlfile until cancel;
SQL>alter database open resetlogs;
最后将隐藏参数"_allow_resetlogs_corruption"
设置为false
,正常重启数据库正常:
SQL>alter system set "_allow_resetlogs_corruption" = false scope=spfile;
SQL>shut immediate
SQL>startup
问题总结
总结:主要还是推进SCN,只是这次遇到报错ORA-16433需要重建控制文件。
- 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持
- Canvas 图片平铺设置
- Canvas 给图形绘制阴影
- State模式的经典应用场景:订单处理(c#实现)场景描述遇到问题解决问题走起
- ASP.NET SignalR 2.0入门指南介绍SignalRSignalR和WebSocket传输和回滚HTML5 传输协议Comet transports传输协议选择过程监测传输指定传输协议连接
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用Grunt和Gulp使用Grunt准备项目配置NPM配置Grunt集成起来监测文件变化与V
- 有趣的算法(三)——Hash算法
- JavaScript中的数据类型
- Logistic回归算法及Python实现
- <script>元素在XHTML中的用法
- 有趣的算法(四)——一致性Hash算法模拟redis集群
- ASP.NET5 中静态文件的各种使用方式服务端的静态文件开启目录浏览呈现默认文件使用UseFileServer方法文件类型基于IIS的考虑最佳实践
- 使用ASP.NET Identity以手机短信实现双重验证创建一个ASP.NET 5项目运行应用程序使用SMS短信进行双重验证开启双重验证使用双重验证登陆应用程序禁用账户来防止暴力破解
- ASP.NET 5 之 错误诊断和它的中间件们配置错误处理页面在Development阶段使用错误页面运行时信息页面欢迎页面
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php PDO属性设置与操作方法分析
- PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
- CI框架实现创建自定义类库的方法
- php如何计算两坐标点之间的距离
- Python调用C语言程序方法解析
- php workerman定时任务的实现代码
- Yii2.0 RESTful API 基础配置教程详解
- opencv 形态学变换(开运算,闭运算,梯度运算)
- 使用darknet框架的imagenet数据分类预训练操作
- php两点地理坐标距离的计算方法
- tp5(thinkPHP5)框架连接数据库的方法示例
- CI框架附属类用法分析
- ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
- PHP封装的page分页类定义与用法完整示例
- Swoole实现异步投递task任务案例详解