
前言
生产环境由于没有操作系统和数据库监控,且没有数据库备份,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组把当前登录的用户名添加进去。

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

处理完操作系统认证登录问题后登录成功,发现数据库是MOUNT状态手动,试着手动拉起数据库,报了ORA-01157,ORA-01110的错误
C:\Users\user>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期一 12月 16 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手工清除回滚段的几种方法




