Linux下利用文件描述符恢复的成功失败实验

1、测试环境准备
[[email protected] ~]$ uname -a
Linux redhat3 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]$ sqlplus / as sysdba
set pagesize 999

SQL*Plus: Release 11.2.0.4.0 Production on Fri Mar 16 05:13:19 2018

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

创建专门的表空间、用户和数据表,用于进行试验。
create tablespace rmdtest datafile ‘/u01/app/oracle/oradata/inf/rmdtest01.dbf‘ size 50m extent management local uniform size 1m segment space management auto;

create user rmtest identified by rmtest default tablespace rmdtest;
grant resource, connect to rmtest;
grant select any dictionary to rmtest;

conn rmtest/rmtest
create table rm_tab as select * from dba_objects;
insert into rm_tab select * from rm_tab;

select tablespace_name, bytes/1024/1024 M from dba_segments where owner=‘RMTEST‘ and segment_name=‘RM_TAB‘;

2、开始实验
删除数据文件。
[[email protected] inf]$ rm rmdtest01.dbf

删除之后,借助文件描述符,我们还是可以查询的。
SQL> SQL> select count(*) from rmtest.rm_tab;

COUNT(*)
----------
173304
查找dbwr进程,确定进程编号。
[[email protected] inf]$ ps -ef | grep dbw
oracle 2537 1 0 04:24 ? 00:00:00 ora_dbw0_inf
oracle 3313 2925 0 05:33 pts/0 00:00:00 grep dbw
使用lsof –p确定文件描述符信息。
[[email protected] inf]$ lsof -p 2537
oracle 2537 oracle 256u REG 253,0 10043392 651611 /u01/app/oracle/oradata/inf/control01.ctl
oracle 2537 oracle 257u REG 253,0 10043392 651613 /u01/app/oracle/fast_recovery_area/inf/control02.ctl
oracle 2537 oracle 258uW REG 253,0 817897472 651602 /u01/app/oracle/oradata/inf/system01.dbf
oracle 2537 oracle 259uW REG 253,0 566239232 651604 /u01/app/oracle/oradata/inf/sysaux01.dbf
oracle 2537 oracle 260uW REG 253,0 471867392 651606 /u01/app/oracle/oradata/inf/undotbs01.dbf
oracle 2537 oracle 261uW REG 253,0 9183232 651608 /u01/app/oracle/oradata/inf/users01.dbf
oracle 2537 oracle 262uW REG 253,0 2252349440 655877 /u01/app/oracle/oradata/inf/inf01.dbf
oracle 2537 oracle 264uW REG 253,0 81797120 651634 /u01/app/oracle/oradata/inf/temp01.dbf
oracle 2537 oracle 265uW REG 253,0 52436992 657854 /u01/app/oracle/oradata/inf/rmdtest01.dbf (deleted)

注意:lsof是描述文件描述符最好的工具,其中包括FD列。我们从dbwr的连接中,找到了rmdtest01.dbf的信息行。其中FD=265uW。这个265就表示了连接文件的名称。
联合dbwr的进程编号2537,我们在目录/proc/2537/fd中找到所有的文件符。
[[email protected] inf]$ cd /proc/2537/fd
[[email protected] fd]$
[[email protected] fd]$ pwd
/proc/2537/fd
[[email protected] fd]$ ls -l
total 0
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Mar 16 05:35 1 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 10 -> /u01/app/oracle/11.2.0.4/dbs/lkINF
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 11 -> /u01/app/oracle/11.2.0.4/rdbms/mesg/oraus.msb
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 12 -> socket:[20147]
l-wx------ 1 oracle oinstall 64 Mar 16 05:35 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 256 -> /u01/app/oracle/oradata/inf/control01.ctl
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 257 -> /u01/app/oracle/fast_recovery_area/inf/control02.ctl
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 258 -> /u01/app/oracle/oradata/inf/system01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 259 -> /u01/app/oracle/oradata/inf/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 260 -> /u01/app/oracle/oradata/inf/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 261 -> /u01/app/oracle/oradata/inf/users01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 262 -> /u01/app/oracle/oradata/inf/inf01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 264 -> /u01/app/oracle/oradata/inf/temp01.dbf
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 265 -> /u01/app/oracle/oradata/inf/rmdtest01.dbf (deleted)
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 6 -> /u01/app/oracle/11.2.0.4/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 7 -> /proc/2537/fd
lr-x------ 1 oracle oinstall 64 Mar 16 05:35 8 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Mar 16 05:35 9 -> /u01/app/oracle/11.2.0.4/dbs/hc_inf.dat

这个265对应的文件还存在,就是已经被删除的那个rmdtest01.dbf文件。进行拷贝出来。
[[email protected] fd]# cp 265 /u01/app/oracle/oradata/inf/rmdtest01res.dbf
[[email protected] inf]$ pwd
/u01/app/oracle/oradata/inf
[[email protected] inf]$ ll
total 4318668
-rw-r----- 1 oracle oinstall 10043392 Mar 16 05:52 control01.ctl
-rw-r----- 1 oracle oinstall 2252349440 Mar 16 05:30 inf01.dbf
-rw-r----- 1 oracle oinstall 52429312 Jan 29 06:54 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Mar 16 05:30 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Mar 16 05:51 redo03.log
-rw-r----- 1 oracle oinstall 52436992 Mar 16 05:50 rmdtest01res.dbf
-rw-r----- 1 oracle oinstall 566239232 Mar 16 05:47 sysaux01.dbf
-rw-r----- 1 oracle oinstall 817897472 Mar 16 05:37 system01.dbf
-rw-r----- 1 oracle oinstall 81797120 Mar 14 10:32 temp01.dbf
-rw-r----- 1 oracle oinstall 5251072 Dec 22 10:36 test01.dbfbak
-rw-r----- 1 oracle oinstall 471867392 Mar 16 05:47 undotbs01.dbf
-rw-r----- 1 oracle oinstall 9183232 Mar 16 05:30 users01.dbf

拷贝出来之后,最好进行一定转换。先将其offline,之后进行控制文件中的rename动作,最后recover和online操作。具体流程常见笔者专门的文章

SQL> select TABLESPACE_NAME,FILE_ID,STATUS,FILE_NAME,BYTES/1024/1024 from dba_data_files;

TABLESPACE_NAME FILE_ID STATUS FILE_NAME BYTES/1024/1024
-------------------- ---------- --------- ------------------------------------------------------------ ---------------
RMDTEST 7 AVAILABLE /u01/app/oracle/oradata/inf/rmdtest01.dbf 50
USERS 4 AVAILABLE /u01/app/oracle/oradata/inf/users01.dbf 8.75
UNDOTBS1 3 AVAILABLE /u01/app/oracle/oradata/inf/undotbs01.dbf 450
SYSAUX 2 AVAILABLE /u01/app/oracle/oradata/inf/sysaux01.dbf 540
SYSTEM 1 AVAILABLE /u01/app/oracle/oradata/inf/system01.dbf 780
INF 5 AVAILABLE /u01/app/oracle/oradata/inf/inf01.dbf 2148

SQL> alter database datafile 7 offline;

Database altered.

SQL> alter database rename file ‘/u01/app/oracle/oradata/inf/rmdtest01.dbf‘ to ‘/u01/app/oracle/oradata/inf/rmdtest01res.dbf‘;

Database altered.

SQL> recover datafile 7;
Media recovery complete.
SQL> alter database datafile 7 online;

Database altered.

使用rman中的recovery advisor工具,来判断错误是否存在。
[[email protected] inf]$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on Fri Mar 16 05:55:20 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

connected to target database: INF (DBID=2613824471)

RMAN> list failure;

using target database control file instead of recovery catalog
no failures found that match specification

原文地址:https://www.cnblogs.com/bicewow/p/10314753.html

时间: 2024-10-07 01:28:51

Linux下利用文件描述符恢复的成功失败实验的相关文章

Linux下基于文件描述符的文件操作(非缓冲)

1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权

Linux中的文件描述符与打开文件之间的关系

1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个新的文件,它的文件描述符会是3.POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号

每天进步一点点——Linux中的文件描述符与打开文件之间的关系

转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个

【Linux驱动】文件描述符以及相关知识

1.文件描述符 Linux操作系统中,几乎所有的设备都被抽象成为设备文件.因此,当我们想对设备进行操作的时候可以直接去操作其相应的设备文件.设备文件即是文件,要想对文件进行操作,无非就是:打开文件.关闭文件.写入数据.读出数据等,它们分别对应的函数有open(),close(),write(),read(),就以其中的open()函数做一个分析.open函数的作用是打开一个文件. (1)它的定义:int open( const char * pathname, int flags); int o

【翻译自mos文章】在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)

在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log) 参考原文: Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1) 适用于: Oracle Database - Enterprise Edition - Version 8.1.7.0 to 11.2.0.3 [Release 8.1.7 to 11.2] Linu

(转)Linux中的文件描述符

本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果

Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件.宏FD_ZERO.FD_SET.FD_CLR.FD_ISSET中"FD"即为file descriptor的缩写,下面来一一进行介绍. 首先介绍一个重要的结构体:fd_set,它会作为下面某些函数的参数而多次用到,fd_set可以理解为一个集合,这个集合中存放的是文件描述符(

Linux系统编程--文件描述符的复制dup()和dup2()【转】

本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 d

Linux系统编程——文件描述符的复制:dup()和dup2()

dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向