数据误删除是作为初级运维人员常常遇到的“低级错误”,一些有经验的老手有时也在疲劳、不冷静的情况下“马失前蹄”。一旦误删除数据文件,尽快采用影响最小、最迅速的手段恢复数据库是第一要务。
恢复数据的方法很多,比如冷热备份、闪回数据库等等,如果是直接从操作系统os层面删除数据文件,在linux/unix环境下,有一些优选手段可以使用。其中之一就是文件描述符(file description)。
--------------------------------------分割线 --------------------------------------
推荐阅读:
rman 配置归档日志删除策略
oracle基础教程之通过rman复制数据库
rman备份策略制定参考内容
rman备份学习笔记
oracle数据库备份加密 rman加密
--------------------------------------分割线 --------------------------------------
1、聊聊file description
不同的操作系统,在实现cpu管理、内存管理和存储文件管理的时候,采用不同的方式手段。
在linux和unix里面,采用文件描述符进行文件管理。一个进程要打开文件,是调用操作系统内核功能,,内核返回一个文件描述符。对文件的读写操作也通过这个描述符进行操作。操作系统删除一个文件的时候,是要确定文件所有文件描述符都是释放掉之后,才会最后删除。
我们的误操作,如果是发生在正在运行的数据库系统中,文件虽然在操作系统上删除不可见了。但是数据库oracle进程中还会保有一些存在的文件描述符,借用这些文件描述符,我们是可能找到文件信息,来恢复数据文件的。
所以,一旦发生了误删除动作,切忌三点:心态冷静、断开应用、维护现场不关库。
但是,在实际中,这种可以快速恢复的技术,并不是百分之百成功的。使用文件描述符恢复数据需要数据库不能关闭、数据库进程不能“自动剔除”数据文件等。本文从两个实验着手,介绍一下操作方法和前提。
2、实验环境搭建
我们选择linux 2.6内核和oracle 11g进行试验。注意:在生产环境下,绝对不能进行这样的实验。进行试验的时候,也需要完备的备份。
[oracle@bspdev ~]$ uname -a
linux bspdev.localdomain 2.6.18-308.el5 #1 smp tue feb 21 20:05:41 est 2012 i686 i686 i386 gnu/linux
sql> select * from v$version;
banner
--------------------------------------------------------------------------------
oracle database 11g enterprise edition release 11.2.0.1.0 - production
pl/sql release 11.2.0.1.0 - production
core 11.2.0.1.0 production
tns for linux: version 11.2.0.1.0 - production
nlsrtl version 11.2.0.1.0 – production
创建专门的表空间、用户和数据表,用于进行试验。
sql> create tablespace rmdtest datafile '/u01/oradata/wilson/datafile/rmdtest01.dbf' size 1000m
2 extent management local uniform size 1m
3 segment space management auto;
tablespace created
sql> create user rmtest identified by rmtest default tablespace rmdtest;
user created
sql> grant resource, connect to rmtest;
grant succeeded
sql> grant select any dictionary to rmtest;
grant succeeded
sql> create table rm_tab as select * from dba_objects;
table created
sql> insert into rm_tab select * from rm_tab;
72731 rows inserted
sql> commit;
commit complete
数据表t,在实验环境的表空间文件里面。
sql> select tablespace_name, bytes/1024/1024 m from dba_segments where owner='rmtest' and segment_name='rm_tab';
tablespace_name m
------------------------------ ----------
rmdtest 17
确保有一份好的备份!
rman> list backup;
list of backup sets
===================
bs key type lv size device type elapsed time completion time
------- ---- -- ---------- ----------- ------------ ---------------
135 full 1.39g disk 00:03:13 02-feb-14
bp key: 135 status: available compressed: no tag: tag20140202t012300
(篇幅原因,有省略……)
piece name:
piece name: /u01/flash_recovery_area/wilson/autobackup/2014_02_02/o1_mf_s_838430779_9gtckx4s_.bkp
spfile included: modification time: 02-feb-14
spfile db_unique_name: wilson
control file included: ckp scn: 5370719 ckp time: 02-feb-14
