Oracle 数据文件状态变为 recover 的处理方式

时间:2024-05-21 16:37:15

Oracle 数据文件状态变为 recover 的处理方式

在检查Oracle dba_data_files 中数据文件状态时发现 ONLINE_STATUS 的值是 recover,数据库处于归档模式。
假如这种情况刚刚发生,可以尝试如下方式进行处理即可:
alter database datafile 13 offline;
recover datafile 13;
alter database datafile 13 online;
select tablespace_name,file_name,autoextensible,online_status,bytes from dba_data_files;

状态变为 recover 的原因:
是执行了 alter database datafile 13 offline drop 导致,估计是在添加数据文件时写错了名字、放错了位置,或者是底层操作系统执行了误移动、删除数据文件的情况,这条命令并不是真正的删除某个数据文件,而是把一个数据文件置于离线状态。
假如恢复不了那么就需要能确认处于recover状态的数据文件上面是否存有业务数据,如果没有数据则可以选择导出整个表空间的数据,删除表空间重建,然后再把数据导入新的表空间即可;也可以将表空间上的其他对象move到另外一个表空间上,再删除这个有数据文件异常的表空间,然后重建。假如数据文件存有业务数据那么就需要根据实际情况做出相应处理。
注意:对数据文件的删除操作,一定要谨慎,并且一定要通过表空间管理命令来进行,不能直接在操作系统删除。
ALTER TABLESPACE ZZH_TBS DROP DATAFILE '+DATA/ZZH/DATAFILES/zzh_tbs01.dbf';

正确删除表空间的语法:
DROP TABLESPACE users INCLUDING CONTENTS;
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;

在删除表空间数据文件之前,一定要确认数据文件是否为空、确认表空间中是否有回收站内容等:
SELECT DISTINCT B.OWNER, B.SEGMENT_NAME
  FROM DBA_DATA_FILES A, DBA_EXTENTS B
 WHERE A.FILE_ID = B.FILE_ID
   AND A.TABLESPACE_NAME = '&tablespace_name'
   AND A.FILE_NAME = '&datafile_name';
SELECT ORIGINAL_NAME, TYPE, TS_NAME, CAN_PURGE
  FROM DBA_RECYCLEBIN
 WHERE TS_NAME = '&tablespace_name';
注意:如果误操作执行了 alter database datafile 13 offline drop ,最好立即执行下 recover datafile 13 命令,重新启用该数据文件 online。

总结:数据文件 ONLINE_STATUS 状态处于 recover 对数据库的影响
1、假如该数据文件中有数据,那么数据将变得不可访问;
2、重启实例告警日志会一直写该数据文件不可用的异常记录;
3、rman 备份将会失败,如需备份就需要加 skip 跳过不可用的数据文件才能备份成功。如:backup database skip inaccessible;

情况模拟(数据库处于归档模式)
我们创建一个TEST表空间添加一个数据文件进行模拟,模拟处理过程如下:
SQL> select file_id,online_status from dba_data_files where tablespace_name='TEST';

   FILE_ID ONLINE_STATUS
---------- --------------
         5 ONLINE

SQL> alter database datafile 5 offline drop;

数据库已更改。

SQL> select file_id,online_status from dba_data_files where tablespace_name='TEST';

   FILE_ID ONLINE_STATUS
---------- --------------
         5 RECOVER
注意:执行 drop 命令后,数据文件状态变为 RECOVER。

SQL> alter database datafile 5 offline;

数据库已更改。

SQL> recover datafile 5;

完成介质恢复。

SQL> alter database datafile 5 online;

数据库已更改。

SQL> select file_id,online_status from dba_data_files where tablespace_name='TEST';

   FILE_ID ONLINE_STATUS
---------- --------------
         5 ONLINE
在 RECOVER 后 online 数据文件成功,再次查询,状态变为 ONLINE。