生产故障:Oracle数据库意外宕机导致Undo损坏

IT数据库行业小学生,记录日常工作中数据库知识及一些故障案例,如有不对请指正,欢迎关注小编,小编微信xh870545795,CSDN:dba_notes

85be131c6ae18e950cc940c997944564.jpeg


一、故障背景

      客户一台运行在windows2008上的oracle 10.2.0.4 的单机数据库,由于近期在部署第三方监控系统,监控系统bug导致服务器cpu占用率达到100%,导致数据库服务异常停止,再次启动提示undo损坏,具体排查过程如下。

二、排查处理

1.故障现象

  客户反馈数据库突然连不上,报错如下:

7e5857731349b99e32b9a5ffdba81f8f.png

2.远程连接服务器排查

2.1 登录服务器发现oracle服务停止,服务器运行卡顿,查看资源利用情况如下

100078ca46277409641fda43d5b3a787.png

发现服务器cpu使用率达到100%,内存使用占比也相对较高,继续排查可疑进程:

93b391e1d2eb18b3c979e08e3ae3887e.png

0ed6d14e91b800b9c4774a0bb1abce20.png

发现java.exe这个进程不断终止和重启,占用cpu资源。经过和客户沟通杀掉了相关服务后,cpu使用恢复正常。

2.2重启数据库,启动报错如下

e9a61599c6743eea6b43db11115bb113.png

提示ORA-01092,实例终止,强制断开连接,查看alert日志,提示undo表空间有问题,进一步查看trc文件:

2acbc5422ab5ce9f9c415a43378ef3ae.png

提示回滚段需要恢复,证实了是undo表空间的问题,数据库异常宕机,导致undo回滚段损坏。

2.3修复undo

       修复undo最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数据丢失。因为客户没有备份,所以采用非常规手段。

 2.3.1 创建pfile,添加隐含参数,并启动数据库

create pfile from spfile;--创建pfile

修改initorcl.ora文件,加入

*._allow_resetlogs_corruption=true --允许在数据库文件SCN不一致的情况下启动数据库
*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)--允许在rollback segments损坏的情况下启动数据库

使用pfile启动数据库

sqlplus / as sysdba
startup pfile='E:\oracle\initorcl.ora'

查看一下当前的rollback segments

SQL> select segment_name,status from dba_rollback_segs;

1aefc58c90b557a946d3985003550f37.png

2.3.2 新建undo表空间替换有问题的undo

新建undo表空间

SQL> create undo tablespace undotbs2 datafile 'E:/ORADATA/orcl/undo02.dbf' size 50M reuse autoextend on;

停库,修改pfile文件将undo表空间改为undotbs2

SQL> shutdown immediate

修改initorcl.ora文件

*.undo_tablespace=undotbs2

再次使用pfile启动数据库

sqlplus / as sysdba
startup pfile='E:\oracle\initorcl.ora'

删除损坏的undotbs1表空间:

SQL> alter tablespace undotbs1 offline normal;Tablespace altered.SQL> drop tablespace UNDOTBS1 including contents and datafiles;Tablespace dropped.SQL>  select * from v$recover_file;no rows selected

停库并注释掉相关隐含参数:

SQL> shutdown immediate

修改initorcl.ora文件,注释或者删除参数:

#*._allow_resetlogs_corruption=true
#*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

通过pfile生成spfile启动数据库,处理完成

sqlplus / as sysdba
create spfile from pfile='E:\oracle\initorcl.ora'
startup
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dba_notes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值