恢复错误删除的oracle数据文件(1)

电脑杂谈  发布时间:2020-04-22 08:13:07  来源:网络整理

skyline fly文件_fly文件_如何打开fly文件

在生产环境中,的数据文件将被错误地删除. 如果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

如何打开fly文件_fly文件_skyline fly文件

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

如何打开fly文件_fly文件_skyline fly文件

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

意外删除数据文件的恢复原理

skyline fly文件_fly文件_如何打开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参数

fly文件_如何打开fly文件_skyline fly文件

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...