Linux下Oracle 数据文件被物理误删除的恢复

简介:

#加深对Linux句柄的理解/紧急情况下Oracle的快速恢复

不同于从Oracle中drop掉数据文件,在某些情况下,可能会遇到数据库在运行时数据文件在操作系统级别被删除,而此时Oracle实例并未崩溃,仍然处于open状态。此时就要求尽量在最小的影响下最高效率地完成恢复。现将恢复过程整理出来,以备不时之需。


<<过程模拟>>


<STEP 1>模拟删除

SYS@icsdb >select name from v$datafile;

NAME

--------------------------------------------------

/ora_data/icsdb/system01.dbf

/ora_data/icsdb/sysaux01.dbf

/ora_data/icsdb/undotbs01.dbf

/ora_data/icsdb/users01.dbf

/ora_data/icsdb/icsdb01.bdf

/ora_data/icsdb/hr01.dbf


已选择6行。


[root@iccsdb01 icsdb]# ls -ld icsdb01.bdf 

-rw-r-----. 1 oracle oinstall 1073750016 5月  25 16:24 icsdb01.bdf


检查一下数据看看当前表和数据条数,有3个表


ICS@icsdb >select table_name from user_tables;


TABLE_NAME

------------------------------------------------------------------------------------------

SC

COURSE

STUDENT


已student表为例,说明表中有39条数据

ICS@icsdb >select count(*) from student;


  COUNT(*)

----------

39


insert into student  values(200216303,'王伟','男',33,'IS');



删除测试数据文件


[root@icsdb02 icsdb]# rm -rf /oracle_data/icsdb/icsdb01.dbf 


SQL> ho rm /oracle_data/icsdb/icsdb01.dbf  --删除用户数据文件;


在查看数据文件已经不在了

[root@iccsdb01 icsdb]# ls -ld icsdb01.bdf 

ls: 无法访问icsdb01.bdf: 没有那个文件或目录


这里千万不要重启数据库,否则就真丢了



<STEP 2>通过句柄恢复数据文件--先找出db writer所对应的PID(3742)

[root@iccsdb01 icsdb]# ps -ef|grep dbw0|grep -v grep

oracle    3742     1  0 11:13 ?        00:00:00 ora_dbw0_icsdb


--再找出被进程所删除文件的句柄(3742),可能会有多个进程,本处只有一个

[root@iccsdb01 icsdb]#  ls -l /proc/3742/fd | grep deleted

lrwx------. 1 oracle oinstall 64 5月  25 16:36 263 -> /ora_data/icsdb/icsdb01.bdf (deleted)


--将被删数据文件的句柄拷贝回数据文件,先备份到tmp下

[root@iccsdb01 icsdb]# cp /proc/3742/fd/263   /tmp/icsdb01.dbf


重启数据库测试恢复,关闭数据库关闭不掉会报错

SYS@icsdb >shutdown immediate;

ORA-01116: 打开数据库文件 5 时出错

ORA-01110: 数据文件 5: '/ora_data/icsdb/icsdb01.bdf'

ORA-27041: 无法打开文件

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


强制关闭数据库

SYS@icsdb >shutdown abort

ORACLE 例程已经关闭。


启动数据库测试,启动只能启动到mount状态,open不了

SYS@icsdb >startup

ORACLE 例程已经启动。


Total System Global Area  471830528 bytes

Fixed Size     2254344 bytes

Variable Size   360712696 bytes

Database Buffers   104857600 bytes

Redo Buffers     4005888 bytes

数据库装载完毕。

ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件 ORA-01110:

数据文件 5: '/ora_data/icsdb/icsdb01.bdf'


SYS@icsdb >select instance_name,status from v$instance;


INSTANCE_NAME  STATUS

------------------------------------------------ ------------------------------------

icsdb  MOUNTED


将数据文件拷贝会原来目录,并修改属组为oracle

[root@iccsdb01 tmp]# mv icsdb01.dbf  /ora_data/icsdb/

[root@iccsdb01 icsdb]# chown oracle:oinstall icsdb01.dbf 


alter tablespace ICSDB rename DATAFILE '/ora_data/icsdb/icsdb01.bdf' to  '/ora_data/icsdb/icsdb01.dbf';  


<STEP 3>通过日志恢复事务

接下来便是事务的恢复操作,分为两种情况:

1)对于归档模式,只需简单offline掉数据文件,进行recover最后再将数据文件online即可,如:

SQL> alter database datafile 4 offline;

Database altered.

 

SQL> recover datafile 4;

Media recovery complete.

SQL> alter database datafile 4 online;

Database altered.


2)如果是非归档,那么作offline datafile的时候会遇到ORA-01145错误,但是可以在copy完文件句柄之后,

尝试offline tablespace,然后再online tablespace,这时候会要求恢复之前误删除的文件,如果日志组还没有切换到全部覆盖,那么recover是可以成功的。


SQL> alter tablespace users offline;

Tablespace altered.


SQL> recover datafile 4 ;          

Media recovery complete.


SQL> alter tablespace users online;

Tablespace altered.

至此恢复完成!


<<恢复原理>>

在Linux操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,

并且该文件的文件描述符可以从/proc目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有 其它方法了,

因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。

另:rm操作始终是系统上最危险的区域,需谨慎驾驶!




本文转自 yuri_cto 51CTO博客,原文链接:http://blog.51cto.com/laobaiv1/1948152,如需转载请自行联系原作者

相关文章
|
1天前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
1月前
|
Oracle 关系型数据库 Linux
linux8安装oracle 11g遇到的问题记录
Oracle 11g在Linux 8上安装时会遇到link编译环节的问题。官方建议忽略安装中的链接错误,安装完成后应用DBPSU 11.2.0.4.240716补丁及一次性补丁33991024,再重新编译二进制文件,并配置监听器和数据库。但因11g已退出服务期,这些补丁需付费获取。网上信息显示22年1月的PSU补丁也可解决问题,找到该补丁后按常规方式打补丁即可。如有需求或疑问可咨询我。
80 20
|
3月前
|
Oracle Cloud Native 关系型数据库
Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版
Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版
112 10
Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版
|
3月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
3月前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
291 2
|
3月前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
3月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
3月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
Oracle 网络协议 关系型数据库
linux安装oracle client客户端远程连接数据库
  linux安装oracle client客户端远程连接数据库。   1.到oracle官网下载basic,sqlplus,devel三个软件包   oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.tar   oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.tar   oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.tar   2.到root用户下创建一个oracle文件夹
510 0
|
Oracle 关系型数据库 Linux
实战篇:Linux 安装 Oracle 11GR2 数据库保姆级教程(二)
实战篇:Linux 安装 Oracle 11GR2 数据库保姆级教程(二)
实战篇:Linux 安装 Oracle 11GR2 数据库保姆级教程(二)