当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-06-04

    本文导语: 数据误删除是作为初级运维人员常常遇到的“低级错误”,一些有经验的老手有时也在疲劳、不冷静的情况下“马失前蹄”。一旦误删除数据文件,尽快采用影响最小、最迅速的手段恢复数据库是第一要务。 恢复数据的方法很...

数据误删除是作为初级运维人员常常遇到的“低级错误”,一些有经验的老手有时也在疲劳、不冷静的情况下“马失前蹄”。一旦误删除数据文件,尽快采用影响最小、最迅速的手段恢复数据库是第一要务。
 
恢复数据的方法很多,比如冷热备份、闪回数据库等等,如果是直接从操作系统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
 
 

下面进行两次实验过程,模拟运行状态下数据文件被删除的场景。注意:由于操作系统差异性,Windows下是不会出现“运行打开的文件被删除”的场景的。所以,在Linux/AIX中,更容易出现误删除的情况。
 
 

3、一次“不成功”的实验
 
 

首先是一次不成功的实验。运维生产环境中,我们的原则永远是稳定。危险不确定的事情场景,一定要避免。哪怕不做、不修、不优化,也不要让业务系统的可用性去冒险。
 
实验环境中,我们总能够发现很多知识和现象。首先,我们尝试删除数据文件,确认文件位置。
 
 

[oracle@bspdev ~]$ cd /u01/oradata/WILSON/datafile/
 
[oracle@bspdev datafile]$ ls -l | grep rmdtest01.dbf

-rw-r----- 1 oracle oinstall 1048584192 Feb  2 02:14 rmdtest01.dbf
 
 

删除文件。
 
 

[oracle@bspdev datafile]$ rm rmdtest01.dbf

[oracle@bspdev datafile]$ ls -l
 
total 8121892
 
-rw-r----- 1 oracle oinstall  10493952 Feb  2 02:14 mvtbltest01.dbf
 
(篇幅原因,有省略……)
 
-rw-r--r-- 1 oracle oinstall  10493952 Feb  2 02:14 tts_simple01.dbf
 
 

注意:此时数据文件虽然从OS中删除,但是我们依然可以查询到数据!
 
 

SQL> select count(*) from rmtest.rm_tab;
 
  COUNT(*)
 
----------
 
    145462
 
 

对于这种现象,笔者认为两种可能性,一是buffer cache中的缓存数据信息,可以支持这种查询动作。另一种可能性,就是由于文件描述符的存在,让数据文件没有被真正删除,还以某种方式存在于系统中,支持dbwr查询。
 
 

证明两种猜想,对buffer cache进行清理。
 
 

SQL> alter system flush buffer_cache;
 
System altered
 
 

SQL> alter system flush shared_pool;
 
System altered
 
 

--依然可以查询结果
 
SQL> select count(*) from rmtest.rm_tab;
 
  COUNT(*)
 
----------
 
    145462
 
 

但是,如果数据库以某种方式,发现了文件被删除,比如check point动作,就会引起很多自动化动作出现。

更多详情见请继续阅读下一页的精彩内容:


    
 
 

您可能感兴趣的文章:

  • 如何判断文件描述符合法?(Linux+C)
  • Linux打开的文件描述符必须手动close吗
  • 紧急求救:在LINUX下如何根据错误代码,查出对应的错误描述?
  • Linux下脚本如何实现以下功能描述?求救高手脚本问题
  • Linux 提供的基于文件描述符的定时器接口
  • linux2.6内核最大文件描述字是多少呢?select(maxfd)中maxfd能到10000么?
  • java/j2ee iis7站长之家
  • 升级linux内核时,2.6.21.5内核编译成功,但启动时出现panic,请看问题详细描述!
  • 鸟哥的linux私房菜里面说道mv这个命令加-f可以直接替换,这里有问题,描述如下
  • ssh登录linux,在命令行界面在每行的开头都有固定的标签头,如何修改? (标题太短请进来看详细的描述)
  • linux下如何编程得到网卡的硬件描述,如得到某块网卡为“3Com 3c590/3c595....”
  • LINUX编程关于文件描述符和FILE *指针可否从一个进程传递给另一个进程的问题
  • 安装LINUX系统时创建分区失败 请指教
  • Linux的DNS正向成功,反向解析失败,望指教!
  • linux启动失败了,求救。
  • linux dabian系统 ssh连接失败
  • Linux上SERVER 和vc上CLIENT的通信connect失败!
  • 高手求救,在windows下访问linux服务器时使用如\192.168.100.1,但是访问失败,问在linux上要怎么设置啊
  • linux启动时auditd启动失败怎么办?
  • linux下cvs链接失败问题
  • Linux系统下,启动HTTP服务为什么老是失败啊?
  • Linux 9.0+865G,只能上到640×480,Intel官方站点的最新驱动安装失败,那位有驱动?
  • linux自动获取ip失败
  • linux下原始套接字创建失败
  • linux 下用open()函数在根目录下打开或创建文件失败
  • linux启动加载时有几个挂载文件系统失败,请高手指教!
  • 想写个shell脚本configure和make一个Linux Kernel怎么判断成功还是失败呢?
  • Linux下安装包失败
  • linux分区转换fat32失败?
  • Windows下telnet成功、Linux下telnet失败?
  • vm虚拟机安装linux失败
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 先安装了redhat linux ,后来安装了windows,如何恢复redhat linux ?
  • linux如何恢复系统
  • 能不能不重装linux而恢复引导进入linux?
  • Linux文件恢复工具 gET iT i sAY
  • 重装windows后,如何恢复Linux?
  • linux系统格式化后,能否恢复。
  • 请较如何恢复WinMe+Linux双启动问题
  • 如何恢复被linux覆盖的原Windows下数据?
  • linux下如何恢复文件系统?
  • linux数据恢复问题
  • linux系统恢复??
  • 如何恢复linux下ext2/3的硬盘数据
  • 救命:在linux下有什么办法恢复刚刚删除的数据?
  • 如何自己制做LINUX系统恢复DVD光盘
  • XP重装Linux没有做启动盘,能恢复吗?
  • radhat linux 启动不了,怎么恢复阿。
  • linux在rm -rf后能恢复吗?
  • linux 文件系统的恢复
  • linux tmp自动清除的恢复
  • linux恢复
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,