误删数据文件

前几天做了一个感觉很迷惑的实验,步骤如下:
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> 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
确实存在,但可能会有不完全恢复,需要认真检查下数据。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26738398/viewspace-1058548/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26738398/viewspace-1058548/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值