误删除数据文件

前几天做了一个感觉很迷惑的实验,步骤如下:
sys@ORCL> col name format a30
sys@ORCL> select file#,ts#,name from v$datafile;

     FILE#        TS# NAME
---------- ---------- ------------------------------
         1          0 /opt/ora10g/oradata/orcl/syste
                      m01.dbf

         2          1 /opt/ora10g/oradata/orcl/undot
                      bs01.dbf

         3          2 /opt/ora10g/oradata/orcl/sysau
                      x01.dbf

         4          4 /opt/ora10g/oradata/orcl/users
                      01.dbf

         5          6 /opt/ora10g/youhua/user_256k_d
                      at_01.dbf

         6          7 /opt/ora10g/oradata/orcl/eygle
                      01.dbf

6 rows selected.

sys@ORCL> conn scott/tiger                    
Connected.
scott@ORCL> create table t (id number) tablespace eygle;

Table created.
sys@ORCL> col file_name for a30
sys@ORCL> col tablespace_name for a20
sys@ORCL>  
sys@ORCL> 
sys@ORCL> select a.tablespace_name,file_name,table_name 
  2  from dba_tables a,dba_data_files b
  3  where a.tablespace_name=b.tablespace_name
  4  and   table_name='T';

TABLESPACE_NAME      FILE_NAME                      TABLE_NAME
-------------------- ------------------------------                   ------------------------------
EYGLE                /opt/ora10g/oradata/orcl/eygle       T
                      01.dbf
表已创建在eygle.dbf数据文件中,就在此时我故意删除了这个数据文件
[oracle@rac1 orcl]$ rm -f eygle01.dbf 
此时再往T表插入数据:
scott@ORCL> insert into t values(1);

1 row created.

scott@ORCL> commit;

Commit complete.

scott@ORCL> conn / as sysdba
Connected.
sys@ORCL> alter system checkpoint;

System altered.
数据会成功,并没有报错,在这里就有了疑问,那数据存到哪里去了呢?
其实在数据库打开时,这个数据文件已经打开了,你把它删除了,这时OS并不会真正删除,只是标记为已经被删除。Linux下,可以用lsof |grep delete,查看到这些标记为被删除的文件。这些文件,想再Open已经是不可能的了。但原来某个进程已经Open了,可以继续使用,文件的空间不会被释放。等到进程Close文件时(如果删除了数据文件,也就是Offline文件、或关库时),这些标记为被删除的文件,空间真正的释放。
问题已经搞清楚了,可是数据文件误删了,还没有备份该怎么办呢?步骤如下:
[oracle@rac1 orcl]$ lsof |grep eygle01.dbf
然后会显示
oracle    15810  oracle   24uW     REG        8,1   5251072   1688383 /opt/ora10g/oradata/orcl/eygle01.dbf (deleted)
从上面的信息可以看到 PID 15810 (oracle)打开文件的文件描述符为 24,然后使用如下命令
[oracle@rac1 orcl]$ cat  /proc/15810/fd/24  >  /opt/ora10g/oradata/orcl/eygle01.dbf
接下来就要看看数据库能不能再次正常启动了!
sys@ORCL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL> startup 
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size             117442804 bytes
Database Buffers           46137344 bytes
Redo Buffers                2973696 bytes
Database mounted.
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/opt/ora10g/oradata/orcl/eygle01.dbf'
报错了,需要介质恢复(数据库要处于归档模式)
sys@ORCL> recover datafile 6
Media recovery complete.
sys@ORCL> alter database open;
查看T表是否存在
sys@ORCL> conn scott/tiger
Connected.
scott@ORCL> desc t;
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                             NUMBER
确实存在,但可能会有不完全恢复,需要认真检查下数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值