恢复的原理,请查看关于该恢复主题的第一篇博文:
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>