
在生产环境中,的数据文件将被错误地删除. 如果SA无法理解,则的日志为redo01.log,或者在进行cp备份后将其删除. 没有dbf后缀等,很容易被误删除
如果rm在操作系统级别上被误认为是及时发现的,则仍然可以将其保存. 这是一个示例:
1. 查询版本以及是否采用归档模式
SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production PL/SQL Release 11.1.0.7.0 - Production CORE 11.1.0.7.0 Production TNS for Linux: Version 11.1.0.7.0 - Production NLSRTL Version 11.1.0.7.0 - Production SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /archivelog Oldest online log sequence 1 Next log sequence to archive 1 Current log sequence 1
2. 飞行用户创建表飞行,飞行表中的记录数为1128432

SQL> conn fly/fly Connected. SQL> create table fly as select * from dba_objects; Table created. SQL> insert into fly select * from fly; 70527 rows created. SQL> / 141054 rows created. SQL> / 282108 rows created. SQL> / 564216 rows created. SQL> commit; Commit complete. SQL> select count(*) from fly; COUNT(*) ---------- 1128432
3. 查看飞行用户默认表空间的数据文件,并使用操作系统命令rm删除飞行用户默认表空间下的所有数据文件
SQL> conn sys/oracle as sysdba Connected. SQL> select default_tablespace from dba_users where username='FLY'; DEFAULT_TABLESPACE ------------------------------ USERS SQL> col file_name format a80 SQL> set linesize 200 SQL> select file_name from dba_data_files where tablespace_name='USERS'; FILE_NAME -------------------------------------------------------------------------------- /home/oracle/oradata/fly/datafile/users02.dbf /home/oracle/oradata/fly/datafile/user03.dbf SQL> host rm /home/oracle/oradata/fly/datafile/users02.dbf SQL> host rm /home/oracle/oradata/fly/datafile/user03.dbf
4. 在fly用户下创建表fly007并报告错误. 请注意,用于创建表的SQL语句应及时执行几次. 在这里,仅user02.dbf数据文件不存在. 在接下来的恢复中,我们确定要考虑到几个数据文件被误删除了
SQL> conn fly/fly Connected. SQL> create table fly007 as select * from dba_objects; create table fly007 as select * from dba_objects * ERROR at line 1: ORA-01116: error in opening database file 20 ORA-01110: data file 20: '/home/oracle/oradata/fly/datafile/users02.dbf' ORA-27041: unable to open file Linux-x86_64 Error: 2: No such file or directory Additional information: 3

5. 检查文件是否仍通过某些进程打开
fly007:~ # lsof | grep /home/oracle/oradata/fly/datafile/users02.dbf oracle 22297 oracle 32uW REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted) oracle 22301 oracle 42u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted) oracle 22309 oracle 30u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted) oracle 22317 oracle 32u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted)
6. 的dbwr进程将打开所有数据文件,包括控制文件fly文件,并检查dbwr进程的PID是否为22297
fly007:~ # ps -ef | grep dbw0 | grep -v grep oracle 22297 1 0 21:21 ? 00:00:00 ora_dbw0_fly
意外删除数据文件的恢复原理

当进程打开文件时,只要该进程仍保持文件打开状态,即使该文件被删除,该进程仍可以读写打开文件时提供给它的文件描述符. / proc目录包含反映内核和进程树的各种文件. / proc目录挂载了一个映射到内存中的区域fly文件,因此这些文件和目录在磁盘上不存在,因此,当我们读写这些文件时,实际上是从内存中获取它们的相关信息. 与lsof有关的大多数信息都存储在以进程的PID命名的目录中,即,具有PID 1116的进程的信息包含在/ proc / 1116中. 每个进程目录中都有各种文件,这些文件可以使应用程序仅了解进程的内存空间,文件描述符列表,磁盘上文件的符号链接以及其他系统信息. lsof程序使用此信息以及有关内核内部状态的其他信息来生成其输出. 因此lsof可以显示诸如进程的文件描述符和相关文件名之类的信息. 也就是说,我们可以通过访问进程的文件描述符找到有关文件的相关信息.
当系统中的文件被意外删除时,只要此时系统中有一些正在访问该文件的进程,那么我们就可以通过lsof从/ proc目录中还原文件的内容
7. 进入dbwr进程的fd(文件描述符)目录,您需要确定删除的数据文件是否只有一个user02.dbf,结果不是,其中10、25、32是fd(文件描述符))
fly007:~ # cd /proc/22297/fd fly007:/proc/22297/fd # ls -l | grep delete lrwx------ 1 oracle oinstall 64 Dec 6 21:26 10 -> /home/oracle/product/11g/db/dbs/lkinstfly (deleted) lrwx------ 1 oracle oinstall 64 Dec 6 21:26 25 -> /home/oracle/oradata/fly/datafile/user03.dbf (deleted) lrwx------ 1 oracle oinstall 64 Dec 6 21:26 32 -> /home/oracle/oradata/fly/datafile/users02.dbf (deleted) fly007:/proc/22297/fd # ls -l /home/oracle/oradata/fly/datafile/user03.dbf /bin/ls: /home/oracle/oradata/fly/datafile/user03.dbf: No such file or directory
8. 将相应的文件描述符复制到意外删除的数据文件的绝对路径. 以下使用root复制,注意添加-p参数

fly007:/proc/22297/fd # cp -p 32 /home/oracle/oradata/fly/datafile/users02.dbf fly007:/proc/22297/fd # cp -p 25 /home/oracle/oradata/fly/datafile/user03.dbf
9. 在中执行recoverdatafile恢复操作,没有数据丢失,完全恢复
fly007:/proc/22297/fd # su - oracle oracle@fly007:~> sqlplus /nolog SQL*Plus: Release 11.1.0.7.0 - Production on Fri Dec 6 21:56:45 2013 Copyright (c) 1982, 2008, Oracle. All rights reserved. SQL> conn sys/oracle as sysdba Connected. SQL> alter database datafile '/home/oracle/oradata/fly/datafile/users02.dbf' offline; Database altered. SQL> alter database datafile '/home/oracle/oradata/fly/datafile/user03.dbf' offline; Database altered. SQL> recover datafile '/home/oracle/oradata/fly/datafile/users02.dbf'; Media recovery complete. SQL> recover datafile '/home/oracle/oradata/fly/datafile/user03.dbf'; Media recovery complete. SQL> alter database datafile '/home/oracle/oradata/fly/datafile/users02.dbf' online; Database altered. SQL> alter database datafile '/home/oracle/oradata/fly/datafile/user03.dbf' online; Database altered. SQL> conn fly/fly Connected. SQL> select count(*) from fly; COUNT(*) ---------- 1128432 SQL> create table fly007 as select * from dba_objects; Table created.
意外删除数据文件后,如果关闭,则dbw0进程消失. 如果没有连续打开意外删除的文件的过程,则无法通过此方法恢复. 因此,如果存在问题,如果您不确认这种情况的复杂程度,请不要随便关闭. 重新启动通常是毫无意义的,甚至是致命的. 另外,如果控制文件是rm,则无法以这种方式恢复
同时,通过Linux rm删除了数据文件,甚至归档日志也全部删除了. 只要不崩溃并且dbw0进程仍然存在,就可以完全还原数据. 是否有存档日志都没有关系,但是是否打开存档存在差异. 随后的讨论继续讨论在操作系统级别恢复意外删除的数据文件
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-184539-1.html
這個是水軍吧
阿斗还是阿斗