您的位置:首页 > 其它

误删除数据文件

2012-06-16 11:30 197 查看
前几天做了一个感觉很迷惑的实验,步骤如下:

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

确实存在,但可能会有不完全恢复,需要认真检查下数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: