误删除数据文件
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
确实存在,但可能会有不完全恢复,需要认真检查下数据。
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
确实存在,但可能会有不完全恢复,需要认真检查下数据。
相关文章推荐
- 数据恢复:在 Linux 上恢复删除了的文件
- 误删除innodb ibdata数据文件-之恢复
- oracle 查看数据文件、删除文件、增加临时空间大小
- window下备份数据库到LinuxFTP服务器上并自动删除7天前数据备份文件
- Oracle数据库数据文件rm -rf误删除后恢复
- 安卓学习笔记---如何保存数据到SharePreference里面,获取所有sp文件以及删除文件
- Oracle数据恢复 - Linux / Unix 误删除的文件恢复
- 喜欢误删除文件怎么恢复数据呢
- android 使用SharedPreferences对数据存储/删除/读取/文件删除
- 删除文件及文件夹,接收安卓json数据,select框函数封装
- SQL 备份数据 脚本 -添加到作业 步骤里面 可删除历史天文件
- Oracle7.X 回滚表空间数据文件误删除处理方法
- Filesystem查询文件系统之删除数据。
- 《JavaWeb---简单应用---练习JDBC,JSTL》---上传Excel文件,利用工具包解析,将数据储存到数据库中,可以查询删除
- Oracle因删除库数据文件导致服务无法启动的处理方法
- 删除数据文件后在dba_data_files中仍旧遗留数据
- 在没有备份情况下误删除数据文件的恢复
- FileChanel 快速移动文件删除原文件中的数据
- 删除表空间,数据文件也删除后,但操作系统层面上空闲空间不见增加。
- 苹果文件系统数据删除后数据恢复技术难度大