Oracle 不小心删除undo数据文件以及磁盘空间不足导致不能登录的解决办法
在一次测试中,由于导入的数据量过大导致事务一直提交失败因为磁盘空间不够用了,一检查发现是undo表空间不够用,于是重新创建了一个表空间,准备把之前的undo表空间删除,删除时却发现一直删不掉,因为它一直在使用,于是关闭数据库,手动的删掉。然后重启数据库,于是乎各种问题来了
1 使用SYS 账号登录时报错:ORA-09817: Write to audit file failed
然后在使用df -h命令系统检查一下,发现Oracle安装目录所对应的磁盘空间已满,于是删除3天以前的trace文件,然后看到之前的undo表空间对应的数据文件也顺便给删了结果就悲剧了
删除trace文件之后,可以使用 SYS AS SYSDBA命令登录到数据库了,但是启动数据库时报错,在启动到open阶段时报错,能够启动到mount阶段。
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/usr/oracle/app/oradata/orcl/undotbs01.dbf'
2 ORA-01157与ORA-01110错误
先查看具体的错误,登录到RAM模式,输入命令: list failure;
RMAN> list failure
using target database control file instead of recovery catalog
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
42 HIGH OPEN 24-MAY-17 One or more non-system datafiles are missing
报告显示数据文件丢失
查资料输入命令以下即可:
alter database datafile 7 offline drop;
但是这样操作有可能丢失部分数据,慎用
然后shutdown immediate,再startup,数据库成功启动。
3 删除undo表空间报错:ORA_01548
数据库成功启动之后,查询之前的UNDOTBS1还在,于是使用删除语句
drop tablespace UNDOTBS1 including contents; 报错
ORA-01548: active rollback segment '_SYSSMU6_2443381498$', terminated drop tablespace;
查询UNDOTBS1处于非offline的segment
select segment_name,tablespace_name,status
from dba_rollback_segs;
修改文件/usr/oracle/app/admin/orcl/pfile/init.ora.95201623739(先备份再修改),如下:
undo_management=manual
undo_retention=10800
undo_tablespace=UNDOTBS2
_CORRUPTED_ROLLBACK_SEGMENTS =(_SYSSMU6_2443381498$) -- 此处要将所有处于NEEDS RECOVERY状态的 segment全部放进来
关闭数据库: shutdown immediate
使用修改后的pfile启动数据:startup pfile='/usr/oracle/app/admin/orcl/pfile/init.ora.95201623739';
然后再删除UNDOTBS1 ,成功删除未报之前的错误。