Oracle数据库运行时rm误删文件的解决方法

网上可以看到不少有关oracle运行时误删数据文件的讨论,对于使用rm操作系统命令删除的文件,可以通过copy文件描述符来恢复文件,当然这种方式的前提还是数据库还在运行。

但在DB还在运行时直接copy文件描述符来恢复文件,这样操作其实有几个问题:

  1. copy过程中需要额外的存储空间
  2. 如果误删的文件包括system表空间,在checkpoint发起之前,所有copy操作必须完成,否则来不及copy的数据文件将会因为实例终止而完全丢失,还在copy中数据文件无效;即使不包括system表空间,也需要在checkpoint之前完成copy,否则copy下来的数据文件头可能损坏
  3. 如果误删的文件包括online redo或undo,这种方式很可能无效
  4. 恢复数据文件的操作必须将对应的表空间下线或关闭数据库,这势必影响线上业务

深入思考一下,数据库进程读写数据文件,是通过文件描述符(以下简称FD)来操作硬盘上对应的数据文件的。既然这些误删的数据文件当前还可以在内存中读写,通过FD操作文件,而且这些误删的数据文件本身占用的空间也并没有释放出来,那是否可以通过某种类似undelete的方式将FD的内容保留会原先的硬盘上呢?

其实github上有多个项目就是实现这个的,包括fdlink、vfs-undelete等。但这些方案也有问题:

  1. 需要编译内核模块来实现。但是这一点,这个要求就比较高,毕竟服务器上一般是不会安装内核源代码的,而且即使要下载也需要时间。
  2. 需要root权限
  3. 实际效果难说。我实测下来,centos5.6的系统,默认内核2.6.18-238.el5, 删除单个数据文件,用fdlink和vfs-undelete都不能成功恢复。

所以这个方法基本不可行。

那是否还有其他方式呢?其实再深入思考下,既然FD还能完全操作这些误删的数据文件,完全可以把FD直接当做数据文件来处理。为了保持原来的数据文件路径不变,我们可以建立一个soft link,把数据文件链接回FD,这样所有的oracle进程也就可以找到数据文件,这样误删操作也不会影响到正常业务进行。

但这样做的问题又来了,毕竟FD不是硬盘上的文件,DB或系统重启、断电都会使FD失效,误删的数据文件还是会可能丢失,而直接copy FD生成的数据文件又有本文开头说的那些问题,怎么操作才能兼顾呢?

解决这个问题其实也并不麻烦。只要了解FD的特性,只要还有进程持有该FD,对应的数据文件内容就就可以读写。我们可以使用tail命令来始终占用这个FD,那么即使DB关闭或者数据文件offline了,这个FD对应的数据文件内容还是可以读取的,而因为DB已经关闭或数据文件已经offline了,自然这些数据文件也就没有写操作了,此时copy出来的数据文件才是干净安全的。

下面是对这个过程一个演示(test表在表空间users01.dbf上,重要操作加亮显示):

$ ls
bbed.par    control01.ctl  filelist.txt  redo01.log  redo03.log    system01.dbf  undotbs01.dbf
bifile.bbd  example01.dbf  log.bbd       redo02.log  sysaux01.dbf  temp01.dbf    users01.dbf
$ ps -ef|grep dbw
oracle     574  5117  0 10:48 pts/1    00:00:00 grep dbw
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Nov 4 10:48:09 2014

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

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 1870647296 bytes
Fixed Size                  2229424 bytes
Variable Size             452987728 bytes
Database Buffers         1409286144 bytes
Redo Buffers                6144000 bytes
Database mounted.
Database opened.
SQL> select count(*) from test;

COUNT(*)
----------
    618237

$ ll
total 2218432
-rw-r--r-- 1 oracle oinstall        74 Oct 30 12:04 bbed.par
-rw-r--r-- 1 oracle oinstall     18432 Oct 30 13:48 bifile.bbd
-rw-r----- 1 oracle oinstall   9814016 Nov  4 10:48 control01.ctl
-rw-r----- 1 oracle oinstall 362422272 Nov  4 10:48 example01.dbf
-rw-r--r-- 1 oracle oinstall       259 Oct 30 12:03 filelist.txt
-rw-r--r-- 1 oracle oinstall      1725 Oct 30 13:48 log.bbd
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo03.log
-rw-r----- 1 oracle oinstall 639639552 Nov  4 10:48 sysaux01.dbf
-rw-r----- 1 oracle oinstall 943726592 Nov  4 10:48 system01.dbf
-rw-r----- 1 oracle oinstall  20979712 Nov  4 10:48 temp01.dbf
-rw-r----- 1 oracle oinstall  57679872 Nov  4 10:48 undotbs01.dbf
-rw-r----- 1 oracle oinstall  83894272 Nov  4 10:48 users01.dbf
$ rm -f users01.dbf 

$ ps -ef|grep ora_dbw
oracle     628     1  0 10:48 ?        00:00:00 ora_dbw0_KV
oracle     773  5117  0 10:48 pts/1    00:00:00 grep ora_dbw$ ll /proc/628/fd   
total 0
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Nov  4 10:48 1 -> /dev/null
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 10 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 11 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 12 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_KV.dat
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 13 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 14 -> /proc/628/fd
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 15 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 16 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_KV.dat
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 17 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkKV
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 18 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
l-wx------ 1 oracle oinstall 64 Nov  4 10:48 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 256 -> /u01/app/oracle/oradata/KV/control01.ctl
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 257 -> /u01/app/oracle/fast_recovery_area/KV/control02.ctl
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 258 -> /u01/app/oracle/oradata/KV/system01.dbf
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 259 -> /u01/app/oracle/oradata/KV/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 260 -> /u01/app/oracle/oradata/KV/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 261 -> /u01/app/oracle/oradata/KV/users01.dbf (deleted)
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 262 -> /u01/app/oracle/oradata/KV/example01.dbf
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 263 -> /u01/app/oracle/oradata/KV/temp01.dbf
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 6 -> /dev/null
lrwx------ 1 oracle oinstall 64 Nov  4 10:48 7 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_KV.dat
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 8 -> /dev/null
lr-x------ 1 oracle oinstall 64 Nov  4 10:48 9 -> /dev/null
$ tail -n +0 -f /proc/628/fd/261 >/dev/null  &
[1] 785
$ !sqlplus
sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Nov 4 10:49:36 2014

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

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

SQL> alter system checkpoint;
alter system checkpoint
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 792
Session ID: 142 Serial number: 5

SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
                                                                   
$ tac /u01/app/oracle/diag/rdbms/kv/KV/trace/alert_KV.log |less
Instance terminated by CKPT, pid = 636
Dumping diagnostic data in directory=[cdmp_20141104104959], requested by (instance=1, osid=636 (CKPT)), summary=[abnormal instance termination].
CKPT (ospid: 636): terminating the instance due to error 63999
System State dumped to trace file /u01/app/oracle/diag/rdbms/kv/KV/trace/KV_diag_611.trc
System state dump requested by (instance=1, osid=636 (CKPT)), summary=[abnormal instance termination].
Tue Nov 04 10:49:59 2014
Additional information: 3
Linux-x86_64 Error: 2: No such file or directory
ORA-27041: unable to open file
ORA-01110: data file 4: ‘/u01/app/oracle/oradata/KV/users01.dbf‘
ORA-01116: error in opening database file 4
ORA-63999: data file suffered media failure
Errors in file /u01/app/oracle/diag/rdbms/kv/KV/trace/KV_ckpt_636.trc:
Additional information: 3
Linux-x86_64 Error: 2: No such file or directory
ORA-27041: unable to open file
ORA-01110: data file 4: ‘/u01/app/oracle/oradata/KV/users01.dbf‘
ORA-01116: error in opening database file 4
ORA-63999: data file suffered media failure
Errors in file /u01/app/oracle/diag/rdbms/kv/KV/trace/KV_ckpt_636.trc:
Tue Nov 04 10:49:58 2014
CJQ0 started with pid=27, OS id=726
Tue Nov 04 10:48:23 2014
Starting background process CJQ0
space available in the underlying filesystem or ASM diskgroup.
database for recovery-related files, and does not reflect the amount of
user-specified limit on the amount of space that will be used by this
db_recovery_file_dest_size of 20000 MB is 8.36% used. This is a
Tue Nov 04 10:48:22 2014
ARC0: Becoming the heartbeat ARCH
ARC0: STARTING ARCH PROCESSES COMPLETE
ARC3: Archival started
ARC2: Archival started
Completed: ALTER DATABASE OPEN
QMNC started with pid=24, OS id=697
Tue Nov 04 10:48:21 2014
Starting background process QMNC
replication_dependency_tracking turned off (no async multimaster replication found)
No Resource Manager plan active
Database Characterset is WE8MSWIN1252
SMON: enabling tx recovery
Verifying 11g file header compatibility for tablespace encryption completed
Verifying file header compatibility for 11g tablespace encryption..
Undo initialization finished serial:0 start:429462324 end:429462404 diff:80 (0 seconds)
[676] Successfully onlined Undo Tablespace 2.
ARC3 started with pid=23, OS id=693
Tue Nov 04 10:48:20 2014

$ ll
total 2136420
-rw-r--r-- 1 oracle oinstall        74 Oct 30 12:04 bbed.par
-rw-r--r-- 1 oracle oinstall     18432 Oct 30 13:48 bifile.bbd
-rw-r----- 1 oracle oinstall   9814016 Nov  4 10:49 control01.ctl
-rw-r----- 1 oracle oinstall 362422272 Nov  4 10:48 example01.dbf
-rw-r--r-- 1 oracle oinstall       259 Oct 30 12:03 filelist.txt
-rw-r--r-- 1 oracle oinstall      1725 Oct 30 13:48 log.bbd
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo03.log
-rw-r----- 1 oracle oinstall 639639552 Nov  4 10:49 sysaux01.dbf
-rw-r----- 1 oracle oinstall 943726592 Nov  4 10:49 system01.dbf
-rw-r----- 1 oracle oinstall  20979712 Nov  4 10:48 temp01.dbf
-rw-r----- 1 oracle oinstall  57679872 Nov  4 10:49 undotbs01.dbf
$ ps -ef|grep tail
oracle     785  5117  0 10:49 pts/1    00:00:00 tail -n +0 -f /proc/628/fd/261
oracle     844  5117  0 10:51 pts/1    00:00:00 grep tail
$ ll /proc/785/fd
total 0
lrwx------ 1 oracle oinstall 64 Nov  4 10:52 0 -> /dev/pts/1
l-wx------ 1 oracle oinstall 64 Nov  4 10:52 1 -> /dev/null
lrwx------ 1 oracle oinstall 64 Nov  4 10:50 2 -> /dev/pts/1
lr-x------ 1 oracle oinstall 64 Nov  4 10:52 3 -> /u01/app/oracle/oradata/KV/users01.dbf (deleted)
$ cp  /proc/785/fd/3 users01.dbf
$ ll
total 2218432
-rw-r--r-- 1 oracle oinstall        74 Oct 30 12:04 bbed.par
-rw-r--r-- 1 oracle oinstall     18432 Oct 30 13:48 bifile.bbd
-rw-r----- 1 oracle oinstall   9814016 Nov  4 10:49 control01.ctl
-rw-r----- 1 oracle oinstall 362422272 Nov  4 10:48 example01.dbf
-rw-r--r-- 1 oracle oinstall       259 Oct 30 12:03 filelist.txt
-rw-r--r-- 1 oracle oinstall      1725 Oct 30 13:48 log.bbd
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Nov  4 10:48 redo03.log
-rw-r----- 1 oracle oinstall 639639552 Nov  4 10:49 sysaux01.dbf
-rw-r----- 1 oracle oinstall 943726592 Nov  4 10:49 system01.dbf
-rw-r----- 1 oracle oinstall  20979712 Nov  4 10:48 temp01.dbf
-rw-r----- 1 oracle oinstall  57679872 Nov  4 10:49 undotbs01.dbf
-rw-r----- 1 oracle oinstall  83894272 Nov  4 10:52 users01.dbf
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Nov 4 10:52:39 2014

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

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 1870647296 bytes
Fixed Size                  2229424 bytes
Variable Size             452987728 bytes
Database Buffers         1409286144 bytes
Redo Buffers                6144000 bytes
Database mounted.
Database opened.
SQL> select count(*) from test;

COUNT(*)
----------
    618237

SQL> quit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

时间: 2024-11-05 18:59:34

Oracle数据库运行时rm误删文件的解决方法的相关文章

Oracle数据库运行时rm误删文件的解决方法 (2)-- 通过脚本实现恢复

根据上篇文章,整个恢复过程可以使用脚本完成,既节约时间,也增加恢复的成功率. 这个方法对误删的数据文件,包括online redo,undo,control file, system或普通数据文件均有效. 整个过程分两部分: 第一部分是通过tail命令hold住文件描述符FD,然后建立数据文件的soft link.完成此步,数据库可正常运行,业务不受影响.但需要防止重启服务器或断电等异常情况,建议此时如果还需继续运行数据库的话,可以通过rman单独对误删的数据文件做备份. 第二部分是在误删的数据

Oracle数据库中scott用户不存在的解决方法

SCOTT用户是我们学习Oracle过程中一个非常重要的实验对象,在我们建立数据库的时候,如果是选择定制模式的话,SCOTT用户是不会默认出现的,不过我们可以通过使用几个简单命令来使这个用户出现.以下是解决方法(基于windows): 1.开始--运行--cmd 输入:sqlplus / as sysdba 连接到数据库 SQL>conn scott/tiger 如果scott不存在,会报ORA-01017的错误,并会断开连接 2.我们以SYS用户重新连接 SQL>conn sys/密码 as

ionic3运行时gradle下载失败的解决方法

1.到官网下载对应的gradle版本,ionic3当前使用的是3.3版本 2.将文件移动至C:\Users\Mango\.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9,然后解压 我的是win10

oracle数据库经常提示27102 out of memory解决方法

网上有很多解决方案,但是我一个也看不懂,不知道写的什么鬼的东西,为什么一句话就能解决的事,非得长篇大论说原理是什么,看得一脸懵逼 我的解决方法入戏 vi /etc/sysctl.conf 修改kernel.shmall(共享内存总量)的值,该值原来为2097152,我把它给为4097152(暂时不知道应该改什么值,但是把这个值变大就对了,我就是随便吧第一位的2改为4,然后问题就自动解决)了,然后sqlplus / as sysdba 执行select status from v$instance

c#用log4Net将日志写入到Oracle数据库,并写入到文件中

原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_37913923/article/details/79072898 1.从官网下载log4net包,安装到项目中: 2.配置文件log4net.config/app.config <?xml version="1.0" encoding=&

Oracle用户密码过期和用户被锁解决方法

[原因/触发因素] 确定是由于oracle11g中默认在default概要文件中设置了"PASSWORD_LIFE_TIME=180天"所导致. [影响和风险] 影响    密码过期后,业务进程连接数据库异常,影响业务使用.    问题发生频率    数据库密码过期后,业务进程一旦重启会提示连接失败. [解决方案] 按照如下步骤进行操作: 1.查看用户的proifle是哪个,一般是default: sql>SELECT username,PROFILE FROM dba_user

[转]Oracle 10g及pro*c相关问题及解决方法(转)

Oracle 10g及pro*c相关问题及解决方法 2008年08月21日 星期四 上午 11:21 最近一直在进行ORACLE 10g和PRO*C的学习. 其中遇到了不少的问题: 现列于此,已备他用. [注:我的linux版本是RHEL 5,Oracle版本是10g] 1.在ORACLE 10g 安装准备的过程中:缺少libXp.so.6依赖 上网搜过不少文章,但是都不是很好的解决 我自己摸索出一个解决方法: 在RHEL5的安装盘中找到libXp-1.0.0-8.i386.rpm,进行安装后,

Oracle 11gR2 用exp无法导出空表解决方法

Oracle 11gR2 用exp无法导出空表解决方法 在11gR2中有个新特性,当表无数据时,不分配segment以节省空间,Oracle 当然在执行export导出时,空表则无法导出,但是还是有解决办法的: 解决方法: 一.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segment.导出时则可导出空表. 二.设置deferred_segment_creation参数 该参数值默认是TRUE,当改为FALSE时,无无是空表还是非空表,

指定mysql的数据库保存路径及忘记root密码的解决方法

在mysql安装目录下的data目录中发现有几个系统目录,把my.ini文件中的datadir值设为此目录. 更改后的主要配置为: [mysqld]basedir=C:/databases/mysqldatadir=D:/databases/mysql/data basedir: 为你数据库程序放置目录 datadir :为你数据库数据目录 重新安装服务,启动服务之后,登录成功. 注:如果想把datadir指定到其他目录,则需要把安装目录下的data目录下的文件与目录拷贝到你所指定的目录下. 总