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

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

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

<<过程模拟>>

<STEP 1>模拟删除

[email protected] >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行。

[[email protected] icsdb]# ls -ld icsdb01.bdf

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

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

[email protected] >select table_name from user_tables;

TABLE_NAME

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

SC

COURSE

STUDENT

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

[email protected] >select count(*) from student;

COUNT(*)

----------

39

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

删除测试数据文件

[[email protected] icsdb]# rm -rf /oracle_data/icsdb/icsdb01.dbf

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

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

[[email protected] icsdb]# ls -ld icsdb01.bdf

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

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

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

[[email protected] icsdb]# ps -ef|grep dbw0|grep -v grep

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

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

[[email protected] 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下

[[email protected] icsdb]# cp /proc/3742/fd/263   /tmp/icsdb01.dbf

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

[email protected] >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

强制关闭数据库

[email protected] >shutdown abort

ORACLE 例程已经关闭。

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

[email protected] >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‘

[email protected] >select instance_name,status from v$instance;

INSTANCE_NAME STATUS

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

icsdb MOUNTED

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

[[email protected] tmp]# mv icsdb01.dbf  /ora_data/icsdb/

[[email protected] 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操作始终是系统上最危险的区域,需谨慎驾驶!

时间: 2024-11-10 01:29:17

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

linux下误删数据文件恢复

linux下文件被删除可以用很多工具进行恢复,例如undelete(适合ext2,ext3).giis(不能恢复安装giis之前的文件).ext3grep(仅限ext3).R-linux(支持ext3,但是需要操作系统是32位的).还有testdisk等等就不一一介绍了.需要注意的是,我们误删文件后,最好保持现场. 下面不用工具来恢复误删的数据文件: [email protected]>select * from zbdba; select * from zbdba * ERROR at lin

Linux 平台下 误删 oracle 数据文件的恢复方法

1  问题描述 之前写过一篇删除oracle home目录的blog,参考: Linux 平台误删 home oracle 根目录的解决方法 http://blog.csdn.net/tianlesoftware/article/details/43794273 本篇是这边的引深,本来应该是年前整理的,拖到年后了. 模拟现状: 数据库在正常运行,误操作,直接rm 掉了数据文件. 测试环境: [[email protected] trace]$ cat /etc/redhat-release Re

Oracle数据文件物理删除后的恢复

做系统管理的都是这样,难免会误删文件,某天要是把某个Oracle数据文件删除,那该如何恢复呢?(这里数据库是OPEN的,并且未关闭) 建立测试表空间 创建测试用户 插入测试数据 删除数据文件 恢复数据库文件 建立测试表空间 SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /opt/oracle/oradat

Oracle 数据文件误删除的不完全恢复

应用环境: 我的一个表被人不小心误删除了,这时候,我不可以把整个库都恢复回去,那样太麻烦了. 所以现在我就从新到一个新库,只将这一个数据文件拷贝过来恢复. 那我们Oracle在恢复文件的时候是不可以只恢复一部分数据文件的,因为oracle  要保证数据文件块头信息一致,所以如果我们要恢复部分文件的话,就得采取以下这种方法: 可以另起一个库,再把要恢复的数据文件拷贝过来,恢复.(当然不单单是该数据文件,还要包括system表空间,undo表空间) 1)另起一个库很简单,可以搞出参数文件,在参数文件

linux下oracle安装

本文主要介绍linux下oracle的安装,主要分为3部分:准本工作.安装oracle软件.用dbca工具创建数据库. 实验环境:rhel5.6+oracle_database_linux32.zip(10.2.0.1.0) 实验过程: 首先要确保linux系统内存大小在1G以上,另外/home与/目录也要足够大. 1.在安装oracle软件前,linux需要安装这些软件:binutils-2.17.50.0.6-5.el5.compat-db-4.2.52-5.1.control-center

Linux下Oracle启动、建立表空间、用户、授权、数据库导入导出

1.1进入到sqlplus启动实例 [[email protected] ~]$ su - oracle                                 --“切换到oracle用户”[[email protected] ~]$ lsnrctl start                               --“打开监听”[[email protected] ~]$ sqlplus /nolog                                --“进入到

解决Linux下Oracle中文乱码的一些心得体会 ,转自

以下转自 http://blog.itpub.net/29151695/viewspace-1173238/ 最近在linux上安装完oracle 10gR2后,又遇到了字符集乱码的问题,之前在网上找了下,然后解决完后就不了了之了,这次又碰到此类问题,所以就认真下来花点时间去测试了一番,经过一些测试,现在已经解决了问题,现在把自己遇到的问题和解决方法记录一下,方便自己日后查找. 测试环境如下: 测试平台: VMware? Workstation 9.0.2 build-1031769 (注:VM

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

Linux下ORACLE客户端安装详解

1.首先去oracle官网下载以下安装包(http://www.oracle.com/technetwork/topics/linuxsoft-082809.html) instantclient-basic-linux.x64-11.2.0.3.0.zip instantclient-odbc-linux-11.2.0.3.0.zip instantclient-sdk-linux.x64-11.2.0.3.0.zip instantclient-sqlplus-linux.x64-11.2.