無歸檔,無備份,rm誤刪除數據文件恢復(三)

      恢復的原理,請查看關於該恢復主題的第一篇博文:
http://fly1116.blog.51cto.com/8301004/1337681
      在數據庫非歸檔狀態,沒有任何的備份情況下,通過操作系統命令rm,誤刪除了某一個表空間下所有數據文件,要如何恢復呢
      1、數據庫版本11.1.0.7.0和數據庫處於非歸檔狀態

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              No Archive Mode
Automatic archival             Disabled
Archive destination            /archivelog
Oldest online log sequence     31
Current log sequence           33

    2、在fly用戶下創建fly表,在sys用戶下創建表fly_sys,表記錄分別爲:2256800和70525

SQL> conn fly/fly
Connected.
SQL> create table fly as select * from dba_objects;
Table created.
SQL> insert into fly select * from fly;
70525 rows created.
SQL> /
141050 rows created.
SQL> /
282100 rows created.
SQL> /
564200 rows created.
SQL> /
1128400 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from fly;
COUNT(*)
----------
2256800
SQL> conn sys/oracle as sysdba
Connected.
SQL> drop table fly_sys purge;
Table dropped.
SQL> create table fly_sys as select * from dba_objects;
Table created.
SQL> select count(*) from fly_sys;
COUNT(*)
----------
70525

    3、刪除fly表空間下的數據文件

SQL> col file_name format a80
SQL> select file_name from dba_data_files where tablespace_name='FLY';
FILE_NAME
--------------------------------------------------------------------------------
/home/oracle/oradata/fly/datafiles/fly01.dbf
SQL> col file_name format a60
SQL> select file_name from dba_data_files where tablespace_name='FLY';
FILE_NAME
------------------------------------------------------------
/home/oracle/oradata/fly/datafiles/fly01.dbf
SQL> host rm /home/oracle/oradata/fly/datafiles/fly01.dbf
SQL> host ls /home/oracle/oradata/fly/datafiles/fly01.dbf
ls: /home/oracle/oradata/fly/datafiles/fly01.dbf: No such file or directory

    4、fly用戶創建表報錯

SQL> create table fly008 as select * from fly;
create table fly008 as select * from fly
*
ERROR at line 1:
ORA-01116: error in opening database file 7
ORA-01110: data file 7: '/home/oracle/oradata/fly/datafiles/fly01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

    5、停止監聽,kill通過監聽連接過來的進程

oracle@fly007:~> lsnrctl stop
LSNRCTL for Linux: Version 11.1.0.7.0 - Production on 09-DEC-2013 17:02:56
Copyright (c) 1991, 2008, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.46.200.5)(PORT=1521)))
The command completed successfully
oracle@fly007:~> ps aux | grep LOCAL=NO | grep -v grep | awk '{print $2}' | xargs kill -9
oracle@fly007:~>

    6、查看dbw0進程pid,查看哪些數據文件被刪除了,拷貝被刪除的數據文件到原來的位置

oracle@fly007:~> ps aux | grep dbw0 | grep -v grep
oracle    1257  0.1  4.3 3430848 352280 ?      Ss   15:36   0:01 ora_dbw0_apple
oracle@fly007:~> cd /proc/1257/fd
oracle@fly007:/proc/1257/fd> ls -l | grep delete
lrwx------ 1 oracle oinstall 64 2013-12-09 15:55 10 -> /home/oracle/product/11g/db/dbs/lkinstapple (deleted)
lrwx------ 1 oracle oinstall 64 2013-12-09 15:55 27 -> /home/oracle/oradata/fly/datafiles/fly01.dbf (deleted)
oracle@fly007:/proc/1257/fd> cp 27 /home/oracle/oradata/fly/datafiles/fly01.dbf
oracle@fly007:/proc/1257/fd>

    7、對數據文件進行offline,然後recover datafile

SQL> conn sys/oracle as sysdba
Connected.
SQL> alter database datafile '/home/oracle/oradata/fly/datafiles/fly01.dbf' offline; //由於未開歸檔,不能進行offline的操作
alter database datafile '/home/oracle/oradata/fly/datafiles/fly01.dbf' offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled
SQL> alter database datafile '/home/oracle/oradata/fly/datafiles/fly01.dbf' offline drop; //需要使用offline drop
Database altered.
SQL> recover datafile '/home/oracle/oradata/fly/datafiles/fly01.dbf';
Media recovery complete.
SQL> alter database datafile '/home/oracle/oradata/fly/datafiles/fly01.dbf' online;

      8、查看錶的數據,完全恢復

SQL> conn fly/fly
Connected.
SQL> select count(*) from fly;
COUNT(*)
----------
2256800
SQL> conn sys/oracle as sysdba
Connected.
SQL> select count(*) from fly_sys;
COUNT(*)
----------
70525
SQL>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章