IT数据库行业小学生,记录日常工作中数据库知识及一些故障案例,如有不对请指正,欢迎关注小编,小编微信xh870545795,CSDN:dba_notes
一、故障背景
客户一台运行在windows2008上的oracle 10.2.0.4 的单机数据库,由于近期在部署第三方监控系统,监控系统bug导致服务器cpu占用率达到100%,导致数据库服务异常停止,再次启动提示undo损坏,具体排查过程如下。
二、排查处理
1.故障现象
客户反馈数据库突然连不上,报错如下:
2.远程连接服务器排查
2.1 登录服务器发现oracle服务停止,服务器运行卡顿,查看资源利用情况如下
发现服务器cpu使用率达到100%,内存使用占比也相对较高,继续排查可疑进程:
发现java.exe这个进程不断终止和重启,占用cpu资源。经过和客户沟通杀掉了相关服务后,cpu使用恢复正常。
2.2重启数据库,启动报错如下
提示ORA-01092,实例终止,强制断开连接,查看alert日志,提示undo表空间有问题,进一步查看trc文件:
提示回滚段需要恢复,证实了是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;
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