导航

5. 用户管理的完全恢复

Posted on 2008-09-12 10:16  毅无涯  阅读(361)  评论(0编辑  收藏  举报

用户管理的完全恢复是指当数据文件出现介质失败时,使用OS 命令复制数据文件备份,并使用SQL 恢复命令应用归档日志和重做日志,最终将数据文件恢复到失败点的状态。因为用户管理的恢复需要借助OS 命令转储备份文件,所以也被称为OS 完全恢复。通过使用OS 完全恢复,可以确保数据库不会丢失任何数据。注意,完全恢复只适用于ARCHIVELOG 模式。

 

5.1 完全恢复简介

5.1.1 诊断数据文件介质失败

1. 在关闭状态下诊断数据文件介质失败

当数据库处于关闭状态时,如果数据文件被误删除或者数据文件所在磁盘损坏,那么在打开数据库时后台进程DBWR 会将错误信息写入其跟踪文件,并且在屏幕上显示如下错误信息。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              62915940 bytes
Database Buffers          100663296 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'D:\DEMO\USERS01.DBF'

 

2. 在OPEN 状态下诊断数据文件丢失或损坏

当数据库处于OPEN 状态时,如果数据文件出现介质失败,那么系统发出检查点时,ORACLE 会自动脱机相应的数据文件。

SQL> conn scott/tiger;
已连接。
SQL> select * from emp;
select * from emp
              *
第 1 行出现错误:
ORA-00376: 此时无法读取文件 4
ORA-01110: 数据文件 4: 'D:\DEMO1\USERS01.DBF'

 

3. 在OPEN 状态下诊断数据块损坏

当数据库处于OPEN 状态时,若数据文件的某个或某些数据块发生损坏,并且SQL 操作没有涉及到损坏数据块,那么不会显示任何错误信息;如果SQL 操作访问到损坏数据块,那么服务器进程会终止SQL 操作,将损坏数据块的信息写入ALERT 文件和用户进程跟踪文件,并且在屏幕上显示如下错误信息:

SQL> select * from emp;
select * from emp1
              *
ERROR 位于第一行:
ORA-01578: ORACLE 数据块损坏(文件号4,块号 34)
ORA-01110: 数据文件 4: 'D:\DEMO\USERS01.DBF'

 

5.1.2 转储数据文件到其他磁盘

当执行恢复操作时,ORACLE 会根据控制文件所记载的信息来定位数据文件。如果数据文件备份被复制到其他磁盘,那么为了使得控制文件可以准确定位该数据文件备份,必须修改控制文件所记载的相应数据文件信息。当数据库处于MOUNT 状态时,DBA 可以改变任何数据文件的位置;当数据库处于OPEN 状态时,DBA 可以改变除SYSTEM 表空间之外所有其他表空间的数据文件位置。

1. 在MOUNT 状态下改变数据文件位置

MOUNT 状态下可以改变任何数据文件的位置,但该命令主要用于改变SYSTEM 表空间的数据文件位置。注意,在执行ALTER DATABASE RENAME FILE 命令之前,必须确保已经将数据副本复制到目标位置。

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              62915940 bytes
Database Buffers          100663296 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。

SQL> conn / as sysdba
已连接。
SQL> host copy d:\demo\system01.dbf d:\demo1\system01.dbf

SQL> alter database rename file 'd:\demo\system01.dbf' to 'd:\demo1\system01.dbf' ;

数据库已更改。

 

2. 在OPEN 状态下改变数据文件位置

当数据库处于OPEN 状态时,既可以使用ALTER TABLESPACE RENAME DATAFILE 命令改变数据文件位置,也可以使用ALTER DATABASE RENAME FILE 命令改变数据文件位置。要注意以下事项:

  • 当数据库处于OPEN 状态时,不能改变SYSTEM 表空间的数据文件位置。
  • 在修改数据文件位置之前,必须确保已经将副本文件复制到目标位置。
  • 在修改数据文件位置之前,必须首先使表空间或数据文件脱机。

SQL> alter database datafile 'd:\demo\users01.dbf' offline;

数据库已更改。

SQL> host copy d:\demo\users01.dbf d:\demo1\users01.dbf;

SQL> alter tablespace users rename datafile 'd:\demo\users01.dbf' to 'd:\demo1\users01.dbf';

表空间已更改。

 

5.1.3 完全恢复命令

当使用用户管理的完全恢复时,在将数据文件备份复制到目标位置之后,还需要使用RECOVER DATABASE、RECOVER TABLESPACE 或 RECOVER DATAFILE 三种命令应用归档日志和重做日志。

1. RECOVER DATABASE

用于恢复数据库的多个数据文件。只能在MOUNT 状态下运行。此命令是SQL *Plus 命令,对应的SQL 恢复命令是ALTER DATABASE RECOVER DATABASE。

SQL> recover database
完成介质恢复。

2. RECOVER TABLESPACE

用于恢复一个或多个表空间的所有数据文件。只能在OPEN 状态下运行。此命令是SQL *Plus 命令,对应的SQL 恢复命令是ALTER DATABASE RECOVER TABLESPACE。

SQL> recover tablespace users;
完成介质恢复。

3. RECOVER DATAFILE

用于恢复一个或多个数据文件。可以在MOUNT 和OPEN 状态下运行。执行此命令时,既可以指定数据文件名称,也可以指定数据文件编号。此命令是SQL *Plus 命令,对应的SQL 恢复命令为ALTER DATABASE RECOVER DATAFILE。

SQL> recover datafile 1;
完成介质恢复。

SQL> recover datafile 'd:\demo\system01.dbf';
完成介质恢复。

4. 比较RECOVER DATABASE 、RECOVER TABLESPACE 和 RECOVER DATAFILE 命令以使用RECOVER DATAFILE 命令

RECOVER DATABASE :MOUNT 状态,大量数据文件出现介质失败

RECOVER TABLESPACE :OPEN 状态,特定表空间的数据文件全部损坏

RECOVER DATAFILE :MOUNT 和 OPEN 状态,数据文件较少或特定表空间的部分数据文件损坏(可适用于RECOVER DATABASE 和 RECOVER TABLESPACE 两种情况)。

 

5.1.4 应用归档日志

当执行用户管理的完全恢复时,需要应用归档日志和重做日志的事务变化。此时,如果归档日志所记载的事务变化在重做日志中仍然存在,那么服务器进程会直接应用重做日志的事务变化,而不会应用归档日志的事务变化。应用归档日志时,DBA 既可以按照ORACLE 的建议应用归档日志,也可以指定归档日志文件名。另外,如果完全恢复所需的归档日志在特定目录下全部存在,那么可以使用服务器进程自动应用归档日志。

1. 使用ORACLE 建议的归档日志位置。

执行恢复命令时,如果不指定归档位置,那么ORACLE 会提供建议应用的归档日志。

SQL> recover datafile 1;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

2. 指定归档日志位置

如果在默认位置下不存在归档日志,那么当执行完全恢复时,可以指定归档日志位置。

SQL> recover from 'c:\demo\archive' datafile 4;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL} 

 

3. 自动应用归档日志

如果完全恢复所需的归档日志都存放在特定目录中,那么可以使用服务器进程自动应用归档日志。自动应用归档日志有三种方法:

  • 在提示语法下指定AUTO

 SQL> recover datafile 4;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto

  • 在开始恢复之前设置自动恢复选项

SQL> set autorecovery on
SQL> recover datafile 4

  • 在恢复命令中指定自动恢复选项

SQL> recover automatic datafile 4;
完成介质恢复。

5.1.5 查看恢复文件

1. 列出需要恢复的数据文件

SQL> select file#,error,change# from v$recover_file;

     FILE# ERROR                   CHANGE#
---------- -------------------- ----------
         4                          799995

 

2. 列出日志历史信息

SQL> select * from v$loghist;

   THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TIME     SWITCH_CHANGE#
---------- ---------- ------------- -------------- --------------
         1          1        534907 02-9月 -08             543144
         1          2        543144 02-9月 -08             575915
         1          3        575915 04-9月 -08             600053
         1          4        600053 06-9月 -08             600058
         1          5        600058 06-9月 -08             602888
         1          6        602888 07-9月 -08             602908
         1          7        602908 07-9月 -08             624288
         1          8        624288 07-9月 -08             644475
         1          9        644475 07-9月 -08             664673
         1         10        664673 07-9月 -08             795591
         1         11        795591 09-9月 -08             795634
         1         12        795634 09-9月 -08             797096
         1         13        797096 09-9月 -08             799800

 

3. 列出恢复要使用的归档日志

SQL> select sequence#,archive_name from v$recovery_log;

SEQUENCE# ARCHIVE_NAME
---------- --------------------------------------------------
        14 D:\DEMO\ARCHIVE\14_1_664374623.LOG
        15 D:\DEMO\ARCHIVE\15_1_664374623.LOG
        16 D:\DEMO\ARCHIVE\16_1_664374623.LOG
        17 D:\DEMO\ARCHIVE\17_1_664374623.LOG
        18 D:\DEMO\ARCHIVE\18_1_664374623.LOG
        19 D:\DEMO\ARCHIVE\19_1_664374623.LOG
        20 D:\DEMO\ARCHIVE\20_1_664374623.LOG
        21 D:\DEMO\ARCHIVE\21_1_664374623.LOG
        22 D:\DEMO\ARCHIVE\22_1_664374623.LOG
        23 D:\DEMO\ARCHIVE\23_1_664374623.LOG
        24 D:\DEMO\ARCHIVE\24_1_664374623.LOG
        25 D:\DEMO\ARCHIVE\25_1_664374623.LOG
        26 D:\DEMO\ARCHIVE\26_1_664374623.LOG
        27 D:\DEMO\ARCHIVE\27_1_664374623.LOG

已选择14行。

 

5.2 在MOUNT 状态下恢复数据文件

MOUNT 状态下恢复SYSTEM 表空间数据文件步骤如下:

(1) 装载数据库。

(2) 确定需要恢复的数据文件。

(3) 使用cp 或 copy 命令复制数据文件备份。

(4) 恢复数据文件。

(5) 打开数据库。 


SQL> startup force mount
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              71304548 bytes
Database Buffers           92274688 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL> host del d:\demo\system01.dbf

SQL> alter database open
  2  ;
alter database open
*
第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'D:\DEMO\SYSTEM01.DBF'

SQL> select file#,error from v$recover_file;

     FILE# ERROR
---------- -----------------------------------------------------------------
         1 FILE NOT FOUND

SQL> alter database rename file 'd:\demo\system01.dbf' to 'd:\demo3\system01.dbf';

数据库已更改。

SQL> recover datafile 1;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 803033 (在 09/10/2008 10:37:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\15_1_664374623.LOG
ORA-00280: 更改 803033 (用于线程 1) 在序列 #15 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\14_1_664374623.LOG'

ORA-00279: 更改 803456 (在 09/10/2008 10:43:29 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\16_1_664374623.LOG
ORA-00280: 更改 803456 (用于线程 1) 在序列 #16 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\15_1_664374623.LOG'

ORA-00279: 更改 817043 (在 09/11/2008 11:13:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\17_1_664374623.LOG
ORA-00280: 更改 817043 (用于线程 1) 在序列 #17 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\16_1_664374623.LOG'

ORA-00279: 更改 817114 (在 09/11/2008 11:13:42 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\18_1_664374623.LOG
ORA-00280: 更改 817114 (用于线程 1) 在序列 #18 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\17_1_664374623.LOG'

ORA-00279: 更改 817121 (在 09/11/2008 11:14:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\19_1_664374623.LOG
ORA-00280: 更改 817121 (用于线程 1) 在序列 #19 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\18_1_664374623.LOG'

ORA-00279: 更改 817236 (在 09/11/2008 11:14:31 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\20_1_664374623.LOG
ORA-00280: 更改 817236 (用于线程 1) 在序列 #20 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\19_1_664374623.LOG'

已应用的日志。
完成介质恢复。
SQL> alter database open;

数据库已更改。

 

5.3 在OPEN 状态下恢复关闭后意外丢失的数据文件

(1) 装载数据库。

(2) 确定需要恢复的数据文件。

(3) 使数据文件脱机。

(4) 打开数据库。

(5) 复制数据文件备份。

(6) 恢复数据文件。

(7) 使数据文件联机。

SQL> startup force mount;
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              71304548 bytes
Database Buffers           92274688 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL> host del d:\demo\users01.dbf;

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'D:\DEMO\USERS01.DBF'

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> select file#,error from v$recover_file;

     FILE# ERROR
---------- -----------------------------------------------------------------
         4 FILE NOT FOUND

SQL> alter database datafile 4 offline;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> host copy d:\demo1\users01.dbf d:\demo\users01.dbf

SQL> recover datafile 4;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 803033 (在 09/10/2008 10:37:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\15_1_664374623.LOG
ORA-00280: 更改 803033 (用于线程 1) 在序列 #15 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\14_1_664374623.LOG'

ORA-00279: 更改 803456 (在 09/10/2008 10:43:29 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\16_1_664374623.LOG
ORA-00280: 更改 803456 (用于线程 1) 在序列 #16 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\15_1_664374623.LOG'

ORA-00279: 更改 817043 (在 09/11/2008 11:13:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\17_1_664374623.LOG
ORA-00280: 更改 817043 (用于线程 1) 在序列 #17 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\16_1_664374623.LOG'

ORA-00279: 更改 817114 (在 09/11/2008 11:13:42 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\18_1_664374623.LOG
ORA-00280: 更改 817114 (用于线程 1) 在序列 #18 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\17_1_664374623.LOG'

ORA-00279: 更改 817121 (在 09/11/2008 11:14:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\19_1_664374623.LOG
ORA-00280: 更改 817121 (用于线程 1) 在序列 #19 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\18_1_664374623.LOG'

ORA-00279: 更改 817236 (在 09/11/2008 11:14:31 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\20_1_664374623.LOG
ORA-00280: 更改 817236 (用于线程 1) 在序列 #20 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\19_1_664374623.LOG'

已应用的日志。
完成介质恢复。
SQL> alter database datafile 4 online;

数据库已更改。

 

5.4 在OPEN 状态下恢复打开时意外丢失的数据文件

(1) 确定需要恢复的数据文件。

(2) 使数据文件脱机。

(3) 复制数据文件备份。

(4) 恢复表空间或数据文件。

(5) 使表空间或数据文件联机。

 
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              71304548 bytes
Database Buffers           92274688 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(1) from scott.test;
select count(1) from scott.test
                           *
第 1 行出现错误:
ORA-00376: 此时无法读取文件 4
ORA-01110: 数据文件 4: 'E:\USERS01.DBF'

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> select file#,error from v$recover_file;

     FILE# ERROR
---------- -----------------------------------------------------------------
         4 FILE NOT FOUND

SQL> alter database datafile 4 offline;

数据库已更改。

SQL> host copy d:\demo1\users01.dbf e:\users01.dbf

SQL> select file#,error from v$recover_file;

     FILE# ERROR
---------- -----------------------------------------------------------------
         4

SQL> recover datafile 4;
ORA-00279: 更改 799995 (在 09/10/2008 09:17:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\14_1_664374623.LOG
ORA-00280: 更改 799995 (用于线程 1) 在序列 #14 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 803033 (在 09/10/2008 10:37:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\15_1_664374623.LOG
ORA-00280: 更改 803033 (用于线程 1) 在序列 #15 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\14_1_664374623.LOG'

ORA-00279: 更改 803456 (在 09/10/2008 10:43:29 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\16_1_664374623.LOG
ORA-00280: 更改 803456 (用于线程 1) 在序列 #16 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\15_1_664374623.LOG'

ORA-00279: 更改 817043 (在 09/11/2008 11:13:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\17_1_664374623.LOG
ORA-00280: 更改 817043 (用于线程 1) 在序列 #17 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\16_1_664374623.LOG'

ORA-00279: 更改 817114 (在 09/11/2008 11:13:42 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\18_1_664374623.LOG
ORA-00280: 更改 817114 (用于线程 1) 在序列 #18 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\17_1_664374623.LOG'

ORA-00279: 更改 817121 (在 09/11/2008 11:14:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\19_1_664374623.LOG
ORA-00280: 更改 817121 (用于线程 1) 在序列 #19 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\18_1_664374623.LOG'

ORA-00279: 更改 817236 (在 09/11/2008 11:14:31 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\20_1_664374623.LOG
ORA-00280: 更改 817236 (用于线程 1) 在序列 #20 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\19_1_664374623.LOG'

ORA-00279: 更改 817393 (在 09/11/2008 11:14:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\21_1_664374623.LOG
ORA-00280: 更改 817393 (用于线程 1) 在序列 #21 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\20_1_664374623.LOG'

已应用的日志。
完成介质恢复。
SQL> col name format a50
SQL> select name,status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
D:\DEMO\SYSTEM01.DBF                               SYSTEM
D:\DEMO\UNDOTBS01.DBF                              ONLINE
D:\DEMO\SYSAUX01.DBF                               ONLINE
E:\USERS01.DBF                                     OFFLINE
D:\DEMO\QUERY.DBF                                  ONLINE

SQL> alter database datafile 'e:\users01.dbf' online;

数据库已更改。

SQL> select count(1) from scott.test;

  COUNT(1)
----------
   1200000

 

5.5 在OPEN 状态下恢复未备份数据文件

(1) 装载数据库。

(2) 确定需要恢复的数据文件。

(3) 使数据文件脱机。

(4) 打开数据库。

(5) 重新建立数据文件。

(6) 恢复数据文件。

(7) 使数据文件联机。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              71304548 bytes
Database Buffers           92274688 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> create tablespace user01 datafile 'd:\demo\user01.dbf' size 500M;

表空间已创建。

SQL> create table scott.test01
  2  (
  3      code nvarchar2(20),
  4      name nvarchar2(20)
  5  )
  6  tablespace user01;

表已创建。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del d:\demo\user01.dbf

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              71304548 bytes
Database Buffers           92274688 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'D:\DEMO\USER01.DBF'

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> select file#,error from v$recover_file;

     FILE# ERROR
---------- -----------------------------------------------------------------
         6 FILE NOT FOUND

SQL> alter database datafile 6 offline;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> alter database create datafile 'd:\demo\user01.dbf';

数据库已更改。

SQL> recover datafile 6;
ORA-00279: 更改 848418 (在 09/11/2008 18:10:45 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\26_1_664374623.LOG
ORA-00280: 更改 848418 (用于线程 1) 在序列 #26 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 848634 (在 09/11/2008 18:14:41 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\DEMO\ARCHIVE\27_1_664374623.LOG
ORA-00280: 更改 848634 (用于线程 1) 在序列 #27 中
ORA-00278: 此恢复不再需要日志文件 'D:\DEMO\ARCHIVE\26_1_664374623.LOG'

已应用的日志。
完成介质恢复。
SQL> alter database datafile 6 online;

数据库已更改。