暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

记录一次生产环境UNDOTBS1数据文件损坏宕机恢复的过程

原创 孙莹 2024-12-16
619

Oracle_database_undo_tablespace_block.png

前言

生产环境由于没有操作系统和数据库监控,且没有数据库备份,C盘和D盘满。导致数据库UNDO表空间坏块宕机。本文记录了UNDOTBS1数据文件损坏宕机恢复的过程

故障现象

2024年12月16日早上接运维人员电话告知数据库无法连接,登录上操作系统发现C盘和D盘空间快满了,做了简单清理重启操作系统发现还是无法连接数据库

故障排查

远程桌面到服务器上,无法使用sqlplus / as sysdba操作系统认证登录

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\user>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期一 12月 16 09:35:02 2024

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01031: insufficient privileges


请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝


请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝


SP2-0157: 在 3 次尝试之后无法连接到 ORACLE, 退出 SQL*Plus

C:\Users\user>

windows运行里打开lusrmgr.msc找到组,选择ora_dba组把当前登录的用户名添加进去。

202412161.jpg

然后选择ORACLE_HOME\NETWORK\ADMIN目录下的sqlnet.ora文件添加SQLNET.AUTHENTICATION_SERVICES= (NTS)

202412162.jpg

处理完操作系统认证登录问题后登录成功,发现数据库是MOUNT状态手动,试着手动拉起数据库,报了ORA-01157,ORA-01110的错误

C:\Users\user>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期一 1216 09:38:07 2024 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> alter database open; alter database open * 第 1 行出现错误: ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件 ORA-01110: 数据文件 3: 'D:\APP\USER\ORADATA\ORCL\UNDOTBS01.DBF' SQL>

查看alert_orcl.log,应该磁盘满了导致是UNDOTBS01.DBF文件坏了。

Mon Dec 16 09:41:54 2024 alter database open Mon Dec 16 09:41:54 2024 Errors in file d:\app\user\diag\rdbms\orcl\orcl\trace\orcl_dbw0_3532.trc: ORA-01157: cannot identify/lock data file 3 - see DBWR trace file ORA-01110: data file 3: 'D:\APP\USER\ORADATA\ORCL\UNDOTBS01.DBF' ORA-27047: unable to read the header block of file OSD-04006: ReadFile() 失败, 无法读取文件 O/S-Error: (OS 38) 已到文件结尾。 Errors in file d:\app\user\diag\rdbms\orcl\orcl\trace\orcl_ora_8904.trc: ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件 ORA-01110: 数据文件 3: 'D:\APP\USER\ORADATA\ORCL\UNDOTBS01.DBF' ORA-1157 signalled during: alter database open...

故障解决过程

既然确定UNDOTBS1的损坏故障,我们就把undo_management设置为manual,然后把UNDOTBS1 offline drop,打开数据库删除原来有问题UNDOTBS1

SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> create pfile from spfile; 文件已创建。 SQL> --pfile添加 *.undo_management=manual SQL> create spfile from pfile; 文件已创建。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 1255473152 bytes Fixed Size 1376408 bytes Variable Size 771755880 bytes Database Buffers 469762048 bytes Redo Buffers 12578816 bytes 数据库装载完毕。 SQL> alter database datafile 3 offline drop; 数据库已更改。 SQL> alter database open; 数据库已更改。 SQL> drop tablespace UNDOTBS1 including contents and datafiles; drop tablespace UNDOTBS1 including contents and datafiles * 第 1 行出现错误: ORA-01548: 已找到活动回退段 '_SYSSMU1_1518548437$', 终止删除表空间 SQL>

删除过程中报ORA-01548错误,原因是回滚段还有一些数据需要恢复,我们通过查询UNDOTBS1回滚段状态都是NEEDS RECOVERY的段,再添加_offline_rollback_segments隐藏参数强制offline

SQL> select segment_id, segment_name,status,tablespace_name from dba_rollback_se gs where status not in ('ONLINE','OFFLINE'); SEGMENT_ID SEGMENT_NAME STATUS ---------- ------------------------------ ---------------- TABLESPACE_NAME ------------------------------ 1 _SYSSMU1_1518548437$ NEEDS RECOVERY UNDOTBS1 2 _SYSSMU2_2082490410$ NEEDS RECOVERY UNDOTBS1 3 _SYSSMU3_991555123$ NEEDS RECOVERY UNDOTBS1 SEGMENT_ID SEGMENT_NAME STATUS ---------- ------------------------------ ---------------- TABLESPACE_NAME ------------------------------ 4 _SYSSMU4_2369290268$ NEEDS RECOVERY UNDOTBS1 5 _SYSSMU5_1018230376$ NEEDS RECOVERY UNDOTBS1 6 _SYSSMU6_1834113595$ NEEDS RECOVERY UNDOTBS1 SEGMENT_ID SEGMENT_NAME STATUS ---------- ------------------------------ ---------------- TABLESPACE_NAME ------------------------------ 7 _SYSSMU7_137577888$ NEEDS RECOVERY UNDOTBS1 8 _SYSSMU8_1557854099$ NEEDS RECOVERY UNDOTBS1 9 _SYSSMU9_1126410412$ NEEDS RECOVERY UNDOTBS1 SEGMENT_ID SEGMENT_NAME STATUS ---------- ------------------------------ ---------------- TABLESPACE_NAME ------------------------------ 10 _SYSSMU10_3176102001$ NEEDS RECOVERY UNDOTBS1 已选择10行。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> --修改pfile添加 *._offline_rollback_segments=(_SYSSMU1_1518548437$,_SYSSMU2_2082490410$,_SYSSMU3_991555123$,_SYSSMU4_2369290268$,_SYSSMU5_1018230376$,_SYSSMU6_1834113595$,_SYSSMU7_137577888$,_SYSSMU8_1557854099$,_SYSSMU9_1126410412$,_SYSSMU10_3176102001$) SQL> create spfile from pfile; 文件已创建。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 1255473152 bytes Fixed Size 1376408 bytes Variable Size 771755880 bytes Database Buffers 469762048 bytes Redo Buffers 12578816 bytes 数据库装载完毕。 数据库已经打开。 SQL> drop tablespace UNDOTBS1 including contents and datafiles; 表空间已删除。 SQL>

创建新的UNDOTBS_NEW表空间,重新把默认的UNDO表空间指向新的UNDOTBS_NEW,undo_management设置AUTO

SQL> create undo tablespace UNDOTBS_NEW datafile 'D:\app\user\oradata\orcl\UNDOTBS_NEW01.DBF' size 100M autoextend on; 表空间已创建。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> --修改pfile 把隐含参数*._offline_rollback_segments删除,把原来两个参数改成 *.undo_tablespace='UNDOTBS_NEW' *.undo_management=AUTO SQL> create spfile from pfile; 文件已创建。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 1255473152 bytes Fixed Size 1376408 bytes Variable Size 771755880 bytes Database Buffers 469762048 bytes Redo Buffers 12578816 bytes 数据库装载完毕。 数据库已经打开。 SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS_NEW SQL>

至此我们的数据库已经正常启动,undo表空间也正常,恢复使用

总结

本次故障是由于操作系统未监控导致C盘D盘满数据库坏块,无法启动数据库造成的。所以平时操作系统和数据库巡检监控和备份必须要做,才能未雨绸缪。

处理过程参考恩墨天花板Roger手工清除回滚段的几种方法

最后修改时间:2024-12-16 14:51:01
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论