在归档模式下,恢复一个被offline drop的datafile的方法

本文演示了如何在Oracle 11g数据库归档模式下,通过离线删除(datafile offline drop)并重新恢复一个数据文件的过程。文章详细记录了使用SQL*Plus进行的一系列操作,包括将数据文件置为离线状态、切换日志文件、应用归档日志进行恢复等步骤。

参考自:
HOW TO RECOVER OFFLINE DROPPED DATAFILE IN ARCHIVELOG MODE (文档 ID 286355.1)

如下的实验基于oracle 11.2.0.4 linux x86-64bit完成

[oracle@rhel63single u02]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 15 20:33:17 2015
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u02/arch
Oldest online log sequence     126
Next log sequence to archive   128
Current log sequence           128
SQL> select file_id from dba_data_files;

   FILE_ID
----------
         4
         3
         2
         1
         5
         6
         7
         8
         9
        10
        11

11 rows selected.

SQL> select name from v$dbfile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/test/users01.dbf
/u01/app/oracle/oradata/test/undotbs01.dbf
/u01/app/oracle/oradata/test/sysaux01.dbf
/u01/app/oracle/oradata/test/system01.dbf
/u01/app/oracle/oradata/test/ten01.dbf
/u01/app/oracle/oradata/test/tb_test_01.dbf
/u01/app/oracle/oradata/test/ts1.dbf
/u01/app/oracle/oradata/test/ts2.dbf
/u01/app/oracle/oradata/test/test01.dbf
/u01/app/oracle/oradata/test/test_uni_sz_2m_01.dbf
/u01/app/oracle/oradata/test/test_uni_sz_1m_01.dbf

11 rows selected.

SQL> set lines 290
SQL> col file_name format a60
SQL> select FILE_NAME,file_Id from v$dbfile;

FILE_NAME                                                       FILE_ID
------------------------------------------------------------ ----------
/u01/app/oracle/oradata/test/users01.dbf                              4
/u01/app/oracle/oradata/test/undotbs01.dbf                            3
/u01/app/oracle/oradata/test/sysaux01.dbf                             2
/u01/app/oracle/oradata/test/system01.dbf                             1
/u01/app/oracle/oradata/test/ten01.dbf                                5
/u01/app/oracle/oradata/test/tb_test_01.dbf                           6
/u01/app/oracle/oradata/test/ts1.dbf                                  7
/u01/app/oracle/oradata/test/ts2.dbf                                  8
/u01/app/oracle/oradata/test/test01.dbf                               9
/u01/app/oracle/oradata/test/test_uni_sz_2m_01.dbf                   10
/u01/app/oracle/oradata/test/test_uni_sz_1m_01.dbf                   11

11 rows selected.

SQL> alter database datafile 9 offline drop;

Database altered.

SQL> select file#, status from v$datafile where file#='9';

     FILE# STATUS
---------- -------
         9 RECOVER

SQL> select file#, status from v$datafile_header where file#='9';

     FILE# STATUS
---------- -------
         9 OFFLINE

SQL> alter system switch logfile ;

System altered.

SQL> /

System altered.

SQL> /
/
/

System altered.

SQL> 
System altered.

SQL> 

System altered.

SQL> SQL> 
SQL> 
SQL> /

System altered.

SQL> 
SQL> 
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u02/arch
Oldest online log sequence     132
Next log sequence to archive   134
Current log sequence           134
SQL> recover datafile 9;
ORA-00279: change 3155176 generated at 02/15/2015 20:34:05 needed for thread 1
ORA-00289: suggestion : /u02/arch/1_128_807882551.dbf
ORA-00280: change 3155176 for thread 1 is in sequence #128


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto --------------->敲入auto
Log applied.
Media recovery complete.
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1        133   52428800        512          1 YES INACTIVE               3155684 15-FEB-15      3155687 15-FEB-15
         2          1        134   52428800        512          1 NO  CURRENT                3155687 15-FEB-15   2.8147E+14
         3          1        132   52428800        512          1 YES INACTIVE               3155681 15-FEB-15      3155684 15-FEB-15

SQL> select file#,status from v$datafile where file#=9;

     FILE# STATUS
---------- -------
         9 OFFLINE

SQL> select file#,status from v$datafile_header where file#=9;

     FILE# STATUS
---------- -------
         9 OFFLINE

SQL> alter database datafile 9 online;

Database altered.

SQL> select file#,status from v$datafile where file#=9;

     FILE# STATUS
---------- -------
         9 ONLINE

SQL> 

知识点:
1.The only case in which the offline dropped datafile can not be online is
when you have added to many datafiles in the database after offline drop

2.在非归档模式下,为了让一个datafile 变成offline,必须带drop关键字。
drop关键字不会把datafile从database 中 remove掉。
 To do that, you must drop the tablespace in which the datafile resides. Until you
 do so, the datafile remains in the data dictionary with the status RECOVER or OFFLINE.
   
 若是database处于归档模式,Oracle会忽略掉drop 关键字.

 

### 将损坏的 online 状态 datafile 设置为 offline方法一个数据文件(`.dbf`)处于 `online` 状态,并且出现损坏,但该文件不再需要时,用户可能希望将其标记为 `offline` 以便删除或移除。然而,在 Oracle 中直接对损坏的数据文件执行 `ALTER DATABASE DATAFILE ... OFFLINE` 可能会失败,因为数据库在打开状态下仍然尝试访问该文件。 #### 强制将损坏的数据文件标记为 offline drop Oracle 提供了一个特殊的命令选项:`OFFLINE DROP`,用于处理损坏或不需要恢复的数据文件。此操作不会尝试进行介质恢复,而是直接从控制文件中移除该数据文件的信息,使其脱离数据库管理范围。 使用方式如下: ```sql SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcltest/tbs01.dbf' OFFLINE DROP; ``` 该命令适用于非关键性表空间中的数据文件,例如普通用户表空间[^1]。一旦执行成功,该数据文件将不再参与数据库的正常操作,也不会影响数据库的打开过程。 #### 数据库状态要求与操作流程 由于目标数据文件当前处于 `online` 状态,且数据库可能已经打开,需确保在数据库挂载(mount)模式下执行此操作。具体步骤如下: 1. 关闭数据库实例: ```sql SQL> SHUTDOWN IMMEDIATE; ``` 2. 启动数据库至 mount 模式: ```sql SQL> STARTUP MOUNT; ``` 3. 执行强制 offline drop 命令: ```sql SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcltest/tbs01.dbf' OFFLINE DROP; ``` 4. 打开数据库: ```sql SQL> ALTER DATABASE OPEN; ``` 如果数据库无法正常打开,可考虑使用 `RESETLOGS` 模式强制打开,但这通常涉及归档日志和重做日志的清除,需谨慎操作。 #### 文件系统层面的清理 一旦数据文件被标记为 `OFFLINE DROP`,即可在操作系统层面安全地删除对应的 `.dbf` 文件,而不会影响数据库的一致性。例如: ```bash rm /u01/app/oracle/oradata/orcltest/tbs01.dbf ``` 此操作不会触发任何数据库级别的错误,因为该文件已不再属于数据库结构的一部分。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值