完全恢复-介质恢复

恢复阶段

1、损坏或丢失文件从备份中还原

2、从归档和在线日志文件必要的被应用来改变数据,回滚块也在这时生成,这个称为前滚或恢复缓存

3、数据库可能包含提交、不提交的改变数据

4、回滚块被使用于任何未提交的数据被回滚,这个称为回滚或事务恢复

5、数据库现在为恢复状态

无开启归档模式恢复

A、好处:

执行简单,出错率低

恢复时间就是还原所有的文件花费的时间

B、不利:

数据丢失,必须手工应用

整个数据库被还原到关闭备份的最后一个时间点

 

带有重做日志文件的备份非归档的恢复

SQL>SHUTDOWN ABORT

还原数据:

UNIX: cp /BACKUP/*  /databases/db01/ORADATA

NT: copy d:\disk1\backup\*.*  d:\disk1\data\

复制完成,开启实例

CONN /AS SYSDBA

STARTUP

 

不带有重做日志文件的备份非归档的恢复

关闭数据库

 shutdown immediate

还原数据文件和控制文件

数据文件的恢复 cp /db01/backup/*dbf /ORADATA/*

控制文件恢复 cp /db01/backup/*.ctl /ORADTA

没有备份在线日志,无法应用在线日志

recover database until cancel

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-00338: 日志 1 (用于线程 1) 比控制文件更新
ORA-00312: 联机日志 1 线程 1: 'D:\ORADATA\ORCL\REDO01.LOG'


SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open restlogs;
alter database open restlogs
                    *
第 1 行出现错误:
ORA-02288: 无效的 OPEN 模式


SQL> alter database open resetlogs;

数据库已更改。

  

查看数据字典-哪个文件需要恢复

 

V$RECOVER_FILE决定哪个文件需要恢复

V$ARCHIVED_LOG罗列全部的归档日志

V$RECOVERY_LOG罗列全部归档日志需要恢复的

SQL> create tablespace tbs datafile '/u01/test01.dbf' size 100M;

表空间已创建。

#在归档模式下

alter DATABASE  datafile '/u01/test01.dbf' offline;

#不在归档下

alter DATABASE  datafile '/u01/test01.dbf' offline DROP ;

SQL> select * from v$recover_file;

FILE# ONLINE ONLINE_STA ERROR CHANGE# TIME
---------- ---------- ---------- ---------- ---------- ---------------
5 OFFLINE OFFLINE 1093567 05-4月 -15

ERROR列有两种可能

为NULL错误为止

如果恢复不需要OFFLINE NORMAL

CHANGE#列返回SCN从恢复开始

例子阐述:归档模式下


SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

我只有3组日志组,最旧的会被替换掉。

在查看v$recovery_log
SQL> select * from v$recovery_log;

   THREAD#  SEQUENCE# TIME           ARCHIVE_NAME
---------- ---------- -------------- ------------------------------
         1          3 02-4月 -15     D:\FLASH_RECOVERY_AREA\ORCL\AR
                                     CHIVELOG\2015_04_06\O1_MF_1_3_
                                     BL4WZX0Z_.ARC

说明:v$log之前sequence=3的已经被替换了,只能在归档在恢复

SQL> alter database datafile 7 online;
alter database datafile 7 online
*
第 1 行出现错误:
ORA-01113: 文件 7 需要介质恢复
ORA-01110: 数据文件 7: 'D:\ORADATA\ORCL\GULL01.DBF'


SQL> recover datafile 7;
ORA-00279: 更改 1129093 (在 04/02/2015 21:26:50 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_3_%U_.ARC
ORA-00280: 更改 1129093 (用于线程 1) 在序列 #3 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
已应用的日志。
完成介质恢复。

SQL> alter database datafile 7 online;

数据库已更改。

备注说明:
也可以使用 直接使用recover automatic datafile 7;

再次把归档备份的另外的目录下,可以采用指定归档文件的位置恢复


SQL> recover automatic datafile 7;
ORA-00279: 更改 1143303 (在 04/06/2015 20:11:52 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_%U_.ARC
ORA-00280: 更改 1143303 (用于线程 1) 在序列 #6 中
ORA-00278: 此恢复不再需要日志文件
'D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_BL4Y290Z_.ARC'
ORA-00308: 无法打开归档日志
'D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_BL4Y290Z_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
filename
ORA-00308: 无法打开归档日志 'filename'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\O1_MF_1_6_BL4Y290Z_.ARC
已应用的日志。
完成介质恢复。
SQL>



 

可以通过v$datafile_header的checkpoint_change#到v$archived_log.FIRST_CHANGE#和next_change#,确定需要恢复那些归档

  

RECOVER 命令的使用

A、在mount状态下

recover [AUTOMATIC] database或recover [AUTOMATIC] datafile '/u01/test01.dbf';

B、数据库打开下的恢复

recover [AUTOMATIC] tablespace users或recover [AUTOMATIC] datafile 3;

AUTOMATIC自动应用归档日志和重做日志文件,不使用AUTOMATIC只会应用重做日志

 

更改普通数据文件(不是系统用的)的目录

SQL> alter database datafile 7 offline;

数据库已更改。

SQL> alter database rename file 'D:\ORADATA\ORCL\GULL01.DBF' to 'D:\ORADATA\GULL
01.DBF'
  2  ;

操作系统中拷贝文件的指定的目录

SQL> recover datafile 7;
完成介质恢复。
SQL> alter database datafile 7 online;

数据库已更改。

系统文件的恢复

在使用过程无法使系统数据文件脱机

SQL> alter database datafile 1 offline;
alter database datafile 1 offline
*
第 1 行出现错误:
ORA-01541: 系统表空间无法脱机; 如有必要请关闭

 需要更改系统文件system的路径,只能在mount状态下进行。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

操作系统数据文件拷贝

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

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             234883972 bytes
Database Buffers          369098752 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> alter database datafile 1 offline;

数据库已更改。

SQL> alter database rename file 'D:\ORADATA\ORCL\SYSTEM01.DBF' to 'D:\ORADATA\SY
STEM01.DBF';

数据库已更改。

SQL> alter database datafile 1 oNline;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL>

数据文件丢失无备份的恢复数据文件

如数据库关闭状态下,数据库MOUNT状态下,使数据文件(无备份)OFFLINE,打开数据库,用户只能使用这个表空间。

如数据库在打开状态,立即把对应的表空间offline状态

 

SQL> alter TABLESPACE GULL OFFLINE IMMEDIATE;

表空间已更改。


SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME
---------- ------- ------- -------------------- ---------- --------------
         7 OFFLINE OFFLINE FILE NOT FOUND                0
         8 OFFLINE OFFLINE                         1147508 06-4月 -15



SQL> alter database create datafile 'D:\ORADATA\GULL01.DBF';

数据库已更改。


SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                   CHANGE# TIME
---------- ------- ------- -------------------- ---------- --------------
         7 OFFLINE OFFLINE UNKNOWN ERROR            579936 03-3月 -15
         8 OFFLINE OFFLINE                         1147508 06-4月 -15

归档文件需要都在才能恢复
SQL> recover automatic tablespace gull;

表空间在线

alter tablespace gull online;

  

只读表空间的恢复

1、备份之前的表空间是read-only,现在还是read-only。

这样恢复不需要任何的redo log

SQL> alter tablespace gull read only;

表空间已更改。

把表空间的数据文件gull01备份

SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

把之前备份的gull01直接替换

不需要做任何恢复就可以使用

  2、表空间现在是read-wirte,备份是通过read-only,需要应用redo和归档

 

SQL> create tablespace gull datafile 'd:\oradata\gull01.dbf' size 20M;

表空间已创建。

SQL> alter tablespace gull read only;

表空间已更改。

备份数据文件gull01

SQL> alter tablespace gull read write;

表空间已更改。

SQL> conn gull/oracle
已连接。
SQL> create table test0408 as select *from  dba_objects;

表已创建。

SQL> alter system checkpoint;

系统已更改。

SQL> alter system checkpoint;

系统已更改。

SQL> alter system checkpoint;

系统已更改。

SQL> alter system switch;
alter system switch
                  *
第 1 行出现错误:
ORA-01900: 需要 LOGFILE 关键字


SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> alter database datafile 7 online;
alter database datafile 7 online
*
第 1 行出现错误:
ORA-01113: 文件 7 需要介质恢复
ORA-01110: 数据文件 7: 'D:\ORADATA\GULL01.DBF'


SQL> recover automatic datafile 7;
完成介质恢复。
SQL> alter database datafile 7 online;

数据库已更改。

SQL> select count(*) from  test0408;

  COUNT(*)
----------
     50365

SQL>

  3、现在为read-only,之前为read-write

先要把对应的文件改为offline,在恢复

SQL> create table test040801 as select *from  dba_objects;

表已创建。

SQL> alter tablespace gull read only;

表空间已更改。

SQL> create table test040802 as select *from  dba_objects;
create table test040802 as select *from  dba_objects
                                         *
第 1 行出现错误:
ORA-01647: 表空间 'GULL' 是只读, 无法在其中分配空间


SQL> alter tablespace gull read write;
alter tablespace gull read write
*
第 1 行出现错误:
ORA-01122: 数据库文件 7 验证失败
ORA-01110: 数据文件 7: 'D:\ORADATA\GULL01.DBF'
ORA-01208: 数据文件是旧的版本 - 不能访问当前版本


SQL> recover datafile 7;
ORA-00283: 恢复会话因错误而取消
ORA-01124: 无法恢复数据文件 7 - 文件在使用中或在恢复中
ORA-01110: 数据文件 7: 'D:\ORADATA\GULL01.DBF'


SQL> alter database datafile 7 offline;

数据库已更改。

SQL> recover automatic datafile 7;
完成介质恢复。
SQL> alter tablespace gull read write;
alter tablespace gull read write
*
第 1 行出现错误:
ORA-01135: DML/query 访问的文件 7 处于脱机状态
ORA-01110: 数据文件 7: 'D:\ORADATA\GULL01.DBF'


SQL> alter database datafile 7 online;

数据库已更改。

SQL> alter tablespace gull read write;

表空间已更改。

SQL> select count(*) from test040801;

  COUNT(*)
----------
     50366

SQL>

  

 

posted @ 2015-04-11 11:15  gull  Views(2197)  Comments(0Edit  收藏  举报