误删除数据文件-无归档处理方法

误删除数据文件实验(linux+10g)
1、新建表空间TEST、表T
create tablespace test datafile 
  '/u01/app/oracle/oradata/PROD/test01.dbf' size 10m autoextend off,
  '/u01/app/oracle/oradata/PROD/test02.dbf' size 10m autoextend off;
  
SYS@ PROD>select file_name,tablespace_name,bytes/1024/1024,status,autoextensible from dba_data_files;
FILE_NAME                                          TABLESPACE_NAME      BYTES/1024/1024 STATUS                      AUTOEXTEN
-------------------------------------------------- -------------------- --------------- --------------------------- ---------
/u01/app/oracle/oradata/PROD/system01.dbf          SYSTEM                                     700 AVAILABLE                   YES
/u01/app/oracle/oradata/PROD/sysaux01.dbf          SYSAUX                                     600 AVAILABLE                   YES
/u01/app/oracle/oradata/PROD/undotbs01.dbf         UNDOTBS1                                   200 AVAILABLE                   YES
/u01/app/oracle/oradata/PROD/users01.dbf           USERS                                        5 AVAILABLE                   YES
/u01/app/oracle/oradata/PROD/test01.dbf            TEST                                        10 AVAILABLE                   NO
/u01/app/oracle/oradata/PROD/test02.dbf            TEST                                        10 AVAILABLE                   NO
6 rows selected.

SYS@ PROD>create table t tablespace test as select * from dba_objects;
Table created.

SYS@ PROD>insert into t select * from t;
13084 rows created.
SYS@ PROD>/

SYS@ PROD>select owner,segment_name,tablespace_name,bytes/1024/1024 from dba_segments where segment_name ='T' ;
OWNER                          SEGMENT_NAME                             TABLESPACE_NAME                BYTES/1024/1024
------------------------------ ---------------------------------------- ------------------------------ ---------------
SYS                            T                                        TEST                                        18

SYS@ PROD>select count(*) from t;   
  COUNT(*)
----------
    105200

2、删除数据文件

[oracle@fyl PROD]$ rm test02.dbf              ----删除数据文件
[oracle@fyl PROD]$ ls -ltr test*
-rw-r----- 1 oracle dba 10493952 Sep  4 14:22 test01.dbf

此时查询数据库
SYS@ PROD>select count(*) from t;   
  COUNT(*)
----------
    105200
 3、恢复   
查询成功,没有报错,原因为数据库打开时,这个数据文件已经打开了,把它删除,这时OS并不会真正删除,只是标记为已经被删除。Linux下,可以用lsof |grep delete,查看到这些标记为被删除的文件。这些文件,想再Open已经是不可能的了。但原来某个进程已经Open了,可以继续使用,文件的空间不会被释放。等到进程Close文件时(如果删除了数据文件,也就是Offline文件、或关库时),这些标记为被删除的文件,空间真正的释放。
数据文件误删了,还没有备份该怎么办?步骤如下:

[oracle@fyl PROD]$ lsof | grep delete | grep test
oracle    6143    oracle   25uW     REG  253,0  10493952   3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted)
oracle    6149    oracle   23u      REG  253,0  10493952   3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted)
oracle    6176    oracle   18u      REG  253,0  10493952   3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted)
oracle    6176    oracle   19u      REG  253,0  10493952   3804376 /u01/app/oracle/oradata/PROD/test02.dbf (deleted)

从上面的信息可以看到 PID 6143(oracle)打开文件的文件描述符为 25,然后使用如下命令
[oracle@fyl PROD]$  cat  /proc/6143/fd/25  >   /u01/app/oracle/oradata/PROD/test02.dbf

[oracle@fyl PROD]$ ls -ltr test*
-rw-r----- 1 oracle dba 10493952 Sep  4 14:41 test01.dbf
-rw-r----- 1 oracle dba 10493952 Sep  4 14:41 test02.dbf
然后
shutdown immediate
startup;
recover datafile 6;

OK
4、ASM管理的文件,正在使用的数据文件时不能删除的

ASMCMD> ls
SYSAUX.261.845726017
SYSTEM.260.845725985
TEST.265.857386677
UNDOTBS1.262.845726043
USERS.264.845726073
ASMCMD> 

ASMCMD> 
ASMCMD> rm TEST.265.857386677
ORA-15032: not all alterations performed
ORA-15028: ASM file '+ORADATA/fyl/datafile/TEST.265.857386677' not dropped; currently being accessed (DBD ERROR: OCIStmtExecute)
5、裸设备的数据文件,最大可能是删除了连接,重建即可

6、当在11g做这个实验,同样建表空间TEST,表T,删除一个数据文件,等待几分钟后,查看alter日志

Thu Sep 04 14:27:55 2014
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ckpt_6147.trc:
ORA-01171: datafile 6 going offline due to error advancing checkpoint
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/test02.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
Thu Sep 04 14:27:56 2014
Shutting down instance (abort)
License high water mark = 5
USER (ospid: 6394): terminating the instance
Instance terminated by USER, pid = 6394
Thu Sep 04 14:27:56 2014
Instance shutdown complete

猜测是数据库CKPT进程checkpoint不能完成,然后offline了datafile 6,但是数据库offline之后为什么被pid = 6394 terminated了呢???
##############
#备份重于一切!#
##############

7、关于删除表空间数据文件件问题
alter database datafile ... offline drop:
在非归档模式下,可以使用... offline drop,在归档模式下,使用... offline. 该命令不会删除数据文件,只是将数据文件的状态更改为recover。 offline drop命令相当于把一个数据文件至于离线状态,它的scn不在变化,不会再向它写入任何数据;但是原有存在这个文件中对象和数据还可以继续使用,online需要恢复。 数据文件的相关信息还会存在数据字典和控制文件中。因此在使用这个命令后,通过修改控制文件将它删除,数据库在启动时就会报文件丢失的错误,并且会在数据字典中产生一个MISGXXXXX的纪录。因此,以一个数据文件是无法被直接从数据库中删除掉的。

如果需要减少表空间的数据文件,可以采用以下办法:
export除表空间的内容:expdp ... tablespaces=xxx;
使用include content子句删除表空间:drop tablespace xxx include contents;
重见表空间,使之不包括需要去除掉的数据文件;
import表空间的所有数据对象。

alter tablespace xxx drop datafile 'xxxx111'
该语句只能是datafile online的时候才可以使用。如果说对应的数据文件已经是offline for drop,那么仅针对 dictionary managed tablespaces 可用,并且要求datafile为空。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值