Oracle UNDO表空间文件误删除故障恢复

Oracle UNDO表空间文件误删除故障恢复

本篇针对Oracle数据库UNDO表空间数据文件误删除后的两类典型故障场景


故障场景一:数据库未关闭,执行shutdown immediate报错

故障现象

UNDO表空间文件误删除后,数据库仍处于运行状态,执行正常关闭命令触发文件打开失败报错,核心报错信息如下:

Plain 复制代码
SQL> shutdown immediate;
ORA-01116: error in opening database file 3
ORA-01110: data file 3: '/u01/app/oracle/oradata/orcl/datafile/undotbs1.258.1218675403'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory

恢复前提

数据库进程未终止,系统仍保留误删除文件的进程句柄,可通过进程fd目录找回文件。

实际操作命令

  1. 查找误删除文件的进程句柄
    执行命令筛选已删除的UNDO文件关联进程,精准定位文件描述符编号与对应进程PID,为后续文件还原做准备。
  • 通用查询:筛选所有已删除文件关联进程

    lsof | grep deleted

  • 精准查询:直接定位目标误删UNDO文件

    lsof | grep undotbs1.258.1218675403

  1. 进入对应进程文件描述符目录
    将命令中的PID替换为上一步查询到的数据库进程号,查看目录下文件描述符详情。

    cd /proc/13412/fd
    ll

  1. 复制句柄文件还原至原路径
    替换命令中的文件描述符编号和UNDO文件原路径。
shell 复制代码
cp 257 /u01/app/oracle/oradata/orcl/datafile/undotbs1.258.1218675403
  1. 正常关闭并启动数据库,完成文件恢复
    文件还原后,执行数据库关闭、启动及数据文件恢复命令,最终正常打开数据库。

    shutdown immediate;

启动数据库至mount状态

复制代码
startup mount;

恢复指定UNDO数据文件

复制代码
recover datafile 3;

正常打开数据库

复制代码
alter database open;

故障场景二:文件误删除后,数据库正常关闭无报错,重启后开库失败

故障现象

UNDO文件误删除后,数据库正常关闭未触发报错,重启后ALTER日志报错,启动数据库提示无法识别锁定数据文件,核心报错:

Plain 复制代码
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/u01/app/oracle/oradata/orcl/datafile/undotbs1.258.1218675403'

实际操作命令

  • 尝试切换UNDO管理模式为手动

    alter system set undo_management=MANUAL SCOPE=SPFILE;

  • 将undotbs1.258.1218675403下线后重启

    alter database datafile '/u01/app/oracle/oradata/orcl/datafile/undotbs1.258.1218675403' offline;
    shutdown immediate;
    startup;

  • 设置UNDO为新的UNDO 并且将控制文件中的表空间信息删除

    create undo tablespace undotbs3 DATAFILE '/u01/app/oracle/oradata/orcl/datafile/undotbs3.dbf' size 70M ;

    alter system set undo_tablespace='undotbs3' SCOPE=SPFILE;

  • 重启数据库

    startup;

  • 删除表空间文件

    DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;


实践附加故障及解决方案

故障1:文件一致性恢复报错

报错信息

复制代码
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: /u01/app/oracle/oradata/orcl/datafile/system.256.1218675401

解决步骤

  1. 设置隐含参数,允许重置日志修复数据文件一致性损坏,修改参数至spfile文件。

    alter system set _allow_resetlogs_corruption= TRUE SCOPE=SPFILE;

  2. 重启数据库,重新执行不完全恢复及resetlogs开库操作,完成修复。

    shutdown;
    immediate;
    startup mount;
    recover database using backup controlfile until cancel;
    ALTER DATABASE OPEN RESETLOGS;

故障2:数据字典缺失系统表空间文件报错

报错信息

复制代码
ORA-01173: data dictionary indicates missing data file from system tablespace

解决步骤

  1. 提取系统数据文件中的回滚段信息,导出至临时日志文件,方便后续整理。

    strings /u01/app/oracle/oradata/orcl/datafile/system.256.1218675401 |grep _SYSSMU /tmp/systemSMU.log

  2. 整理导出的日志文件,对回滚段名称去重,剔除格式异常、无效的条目,保留标准_SYSSMU开头的回滚段名称。

  3. 修改数据库参数文件pfile,添加手动UNDO管理参数,同时配置损坏回滚段屏蔽参数,将整理后的所有有效回滚段填入参数内。

    *.undo_management=manual;

    *._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU4_1254879796,_SYSSMU3_1723003836,其余去重后回滚段名称)

  4. 使用修改后的pfile手动启动数据库,重新执行控制文件重建、不完全恢复流程,完成最终修复。

    startup pfile=/u01/app/oracle/product/11g/db/dbs/initorcl.ora;
    nomount;

后续重复执行控制文件重建、恢复、开库步骤


相关推荐
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿10 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴10 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存