误删 oracle 数据文件的恢复

虽然一再小心,但是还是发生人为误删除数据库文件.简单步骤,或许关键时刻可以帮大忙.
 
环境:CENTOS 6.5
模拟误操作:

    数据库在正常运行,人工直接rm 掉了数据文件。

--1.测试环境情况:

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

select file_name from dba_data_files;
/u01/app/oracle/oradata/orcl/test.dbf

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 星期四 3月 5 15:55:14 2015

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

连接到:
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> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

开启数据库归档

archive log list;

数据库日志模式             非存档模式
自动存档             禁用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     3002
当前日志序列           3004

mkdir /u01/arch

alter system set log_archive_dest_1='location=/u01/arch' scope=spfile;

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 1.0088E+10 bytes
Fixed Size		    2261928 bytes
Variable Size		 1644170328 bytes
Database Buffers	 8422162432 bytes
Redo Buffers		   19595264 bytes
数据库装载完毕。
SQL> alter database archivelog;

数据库已更改。

SQL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            /u01/arch
最早的联机日志序列     3002
下一个存档日志序列   3004
当前日志序列           3004
SQL> alter database open;

数据库已更改。

SQL> select open_mode from v$database;

OPEN_MODE
------------------------------------------------------------
READ WRITE

--2.新建测试数据

select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/users01.dbf

SQL> create tablespace wind datafile  '/u01/app/oracle/oradata/orcl/wind01.dbf' size 200m;

SQL> create user wind  identified by   wind01 default tablespace wind;

SQL> grant connect,resource,dba to wind;

$ sqlplus wind/wind01

create table t1
(
sid int not null primary key,
sname varchar2(10)
)
tablespace wind;

--循环导入数据
declare
        maxrecords constant int:=100000;
        i int :=1;
    begin
        for i in 1..maxrecords loop
          insert into t1 values(i,'ocpyang');
        end loop;
    dbms_output.put_line(' 成功录入数据! ');
    commit;
    end;
/

select count(*) from t1;

  COUNT(*)
----------
    100000

--3.模拟删除数据

SQL> col tablespace_name for a20
SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME      STATUS
-------------------- ---------------------------
SYSTEM		     ONLINE
SYSAUX		     ONLINE
UNDOTBS1	     ONLINE
TEMP		     ONLINE
USERS		     ONLINE
TTSPACE 	     ONLINE
OCPYANG 	     ONLINE
OCPYANGINDEX	     ONLINE
LOBOCPYANG	     ONLINE
LOBOCPYANG01	     ONLINE
LOBOCPYANG02	     ONLINE

TABLESPACE_NAME      STATUS
-------------------- ---------------------------
WIND		     ONLINE

rm -rf /u01/app/oracle/oradata/orcl/wind01.dbf

ls  /u01/app/oracle/oradata/orcl/ | grep wind

SQL> show user;
USER 为 "WIND"
SQL> select count(*) from t1;

  COUNT(*)
----------
    100000

SQL> desc t1
 名称                                    是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 SID					   NOT NULL NUMBER(38)
 SNAME						    VARCHAR2(10)

SQL> delete from t1 where sid>99000;

已删除1000行。

SQL> commit;

提交完成。

SQL> select count(*) from t1;

  COUNT(*)
----------
     99000

--4.恢复
ps -eaf|grep dbw0 |grep -v grep
oracle    1928     1  0 15:59 ?        00:00:00 ora_dbw0_orcl

SQL> col tablespace_name for a20
SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME      STATUS
-------------------- ---------------------------
SYSTEM		     ONLINE
SYSAUX		     ONLINE
UNDOTBS1	     ONLINE
TEMP		     ONLINE
USERS		     ONLINE
TTSPACE 	     ONLINE
OCPYANG 	     ONLINE
OCPYANGINDEX	     ONLINE
LOBOCPYANG	     ONLINE
LOBOCPYANG01	     ONLINE
LOBOCPYANG02	     ONLINE

TABLESPACE_NAME      STATUS
-------------------- ---------------------------
WIND		     ONLINE

cd /proc/1928/fd

ll

lr-x------ 1 oracle oinstall 64 Mar  5 16:20 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Mar  5 16:20 1 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 10 -> /u01/app/oracle/product/11.2.0/db_1/dbs/lkORCL
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 11 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
l-wx------ 1 oracle oinstall 64 Mar  5 16:20 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 256 -> /u01/app/oracle/oradata/orcl/control01.ctl
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 257 -> /u01/app/oracle/fast_recovery_area/orcl/control02.ctl
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 258 -> /u01/app/oracle/oradata/orcl/system01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 259 -> /u01/app/oracle/oradata/orcl/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 260 -> /u01/app/oracle/oradata/orcl/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 261 -> /u01/app/oracle/oradata/orcl/users01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 262 -> /u01/app/oracle/oradata/orcl/ttspace01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 263 -> /u01/app/oracle/oradata/orcl/ocpyang01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 264 -> /u01/app/oracle/oradata/orcl/ocpyangindex01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 265 -> /u01/app/oracle/oradata/orcl/lobocpyang01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 266 -> /u01/app/oracle/oradata/orcl/lobocpyang0101.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 267 -> /u01/app/oracle/oradata/orcl/lobocpyang0202.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 268 -> /u01/app/oracle/oradata/orcl/temp01.dbf
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 269 -> /u01/app/oracle/oradata/orcl/wind01.dbf (deleted) --注
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 6 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 7 -> /proc/1928/fd
lr-x------ 1 oracle oinstall 64 Mar  5 16:20 8 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Mar  5 16:20 9 -> /u01/app/oracle/product/11.2.0/db_1/dbs/hc_orcl.dat

直接cp该句柄文件名回原位置:

$ pwd
/proc/1928/fd

cp /proc/1928/fd/269  /u01/app/oracle/oradata/orcl/wind01.dbf

NOTE:
由于数据库一直是打开使用的,数据在不断变更则SCN也会不断的变化,
cp数据文件和数据库当前的信息明显不一致,此时需要对数据文件进行recover.

--脱机数据文件
alter database datafile '/u01/app/oracle/oradata/orcl/wind01.dbf' offline;

select count(*) from t1;

第 1 行出现错误:
ORA-00376: 此时无法读取文件 11
ORA-01110: 数据文件 11: '/u01/app/oracle/oradata/orcl/wind01.dbf'

--恢复数据文件
recover datafile '/u01/app/oracle/oradata/orcl/wind01.dbf';

--联机数据文件
alter database datafile '/u01/app/oracle/oradata/orcl/wind01.dbf' online;

select count(*) from t1;

  COUNT(*)
----------
     99000

成功恢复.

----5.简单验证

ls  /u01/app/oracle/oradata/orcl/ | grep wind
wind01.dbf

select count(*) from t1;

  COUNT(*)
----------
     99000

alter system switch logfile;

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 1.0088E+10 bytes
Fixed Size		    2261928 bytes
Variable Size		 1644170328 bytes
Database Buffers	 8422162432 bytes
Redo Buffers		   19595264 bytes
数据库装载完毕。
数据库已经打开。

SQL> insert into t1 values(9999999,'rmfiletest');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t1 where rownum=1 order by sid desc;

       SID SNAME
---------- ------------------------------
   9999999 rmfiletest

时间: 2024-10-05 22:16:12

误删 oracle 数据文件的恢复的相关文章

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数据文件的恢复

归档模式下测试: 一.open状态下物理删除数据文件,关闭情况恢复: SQL> create tablespace test datafile '+DATA/mecbs/datafile/test01.dbf' size 10M; Tablespace created. SQL> conn scott/scott; Connected. SQL> conn /as sysdba Connected. SQL> create user test identified by test

oracle数据文件recover恢复过程

首先查询数据文件状态 select name,status,file# from v$datafile; 2.关闭数据库并停掉监听 shutdown immediate; 3.打开数据库 startup 4.把recover状态数据库离线 15 代表数据文件号 alter database datafile 15 offline; 5.恢复数据文件 recover datafile 15; 不出问题会提示恢复方式输入AUTO即可 6.恢复成功后,把数据文件在线 alter database da

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

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

【oracle】摸拟故障 - 数据文件丢失恢复,SCN的作用。

模拟数据文件丢失恢复,redolog.archivelog.controlfile文件未丢失的情况恢复. 1.  创建一个表空间.用户.分配权限.建表. a)   createtablespace HXW_WEN datafile'D:\ORACLE\ORADATA\HXW168\HXW_WEN_D01.DBF' size5M autoextendonnext1M maxsize20M; b)createuser wen identifiedby zerostudy defaulttablesp

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

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

Oracle dmp文件损坏恢复案例

前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下 一.描述 这个dmp文件是从一个Oracle 9i的数据库上exp出来的,在导入Oracle 11g版本的时候,可能会随机出现两类错误,如下 (1)dmp文件导入的时候,一直停留在某张表上不动,两三天都是这样,导入操作无法进行,如下 导入了                                                             0 行 . . 正在导入表    

Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

PRM 全称为ParnassusData Recovery Manager ,由 诗檀软件自主研发,拥有独立的软件著作权. PRM可以独立于Oracle软件运行,直接从Oracle数据文件中抽取表上的数据. 当以下几种场景中,都可以用上PRM: 无备份或者备份不可用情况下,数据表被意外truncate掉或者DROP掉 由于数据库损坏,导致的数据打不开 无法OPEN 数据块存在损坏,Oracle无法读取出数据 数据文件存在损坏,或者数据文件头信息不一致 等等 以上这些问题中,用户均可以考虑使用PR

收缩Oracle数据文件

最近有网友提到收缩Oracle数据文件的问题,这是DBA经常碰到的一个常见问题.通常我们需要收缩相应的数据文件以减少来自磁盘空间的压力以及提高数据库的整体性能.但这并非对于所有情形都是适用的,尤其是生产环境.因为生产环境数据清洗相当较少,因此空间浪费也比较小,而且一旦收缩之后又要重新自动扩展数据文件,浪费系统资源.对于UAT,DEV环境,多DB,磁盘空间压力大的情形,收缩一下非常有必要.勒紧裤带过日子也是常有的事情,哈哈.总之收缩数据文件会使得磁盘空间得以释放以及加快数据迁移,RMAN备份等.本