恢復的原理,請查看關於該恢復主題的第一篇博文:
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>