完全恢复-介质恢复

恢复阶段

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>

  

时间: 2024-10-03 22:13:01

完全恢复-介质恢复的相关文章

物理写的判断 & 介质恢复 & 实例恢复 & 增量检查点

物理写的检测: select  * from v$sysstat where lower(name) like 'physical writes%';  physical writes 8 9 119             //我一共写了多少块 select * from v$sysstat where upper(name) like 'DBW%'; 104 DBWR checkpoint buffers written 8 173 12  //通过检查点写了多少块. 那你就可以用  buf

RMAN数据库恢复之对数据库进行完全介质恢复

RMAN数据库恢复之对数据库进行完全介质恢复环境:控制文件和参数文件SPFILE及归档文件.重做日志文件都在.其它数据文件丢失.恢复方法:使用之前创建的全库备份进行恢复1.删除数据文件: SQL> SHUTDOWN IMMEDIATE; 数据库已经关闭. 已经卸载数据库. ORACLE 例程已经关闭. SQL> HOST DEL D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF SQL> HOST DEL D:\APP\ADMINISTRATO

【转】基于RMAN实现坏块介质恢复(blockrecover)

本文转自:乐沙弥的世界 对于物理损坏的数据块,我们可以通过RMAN块介质恢复(BLOCK MEDIA RECOVERY)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据块.恢复整个数据库或数据文件那不是大炮用来打蚊子,有点不值得!但前提条件是你得有一个可用的RMAN备份存在,因此,无论何时备份就是一切.本文演示了产生坏块即使用RMAN实现坏块恢复的全过程. 1.创建演示环境 SQL> select * from v$version where rownum<2;

数据文件被删除,介质恢复测试

实验如下: user数据文件被删除状况下,介质恢复 首先备份user数据文件 alter tablespace user begin backup;复制user数据文件 alter tablespace user end backup: 删除user用户 shutdown abort startup  报错ORA-01157或者ORA-01110 select file#,change# from v$recover_file; 在看一下非INACTIVE状态在线日志的低位SCN;select

Oracle实例的恢复、介质恢复( crash recovery)( Media recovery)

实例的恢复( crash recovery) 什么时候发生Oracle实例恢复? shutdown abort; 数据库异常down掉(机器死机,掉电...) 实例恢复的原因是数据有丢掉,使用redo数据恢复 实例恢复是一个自动的过程,不需要人工干预. 控制文件就是为了检查一致性,如果不一致就会实例恢复 实例恢复发生在那个阶段? sql>startup nomount(读取spfle) ,启动实例,oracle给自己分了一些内存,oracle的内存起来,这个时候没有实例恢复. SQL> sta

11G新特性 -- 块介质恢复性能增强(block media recovery)

块介质恢复性能增强(block media recovery) :只是恢复受损的块.不需要将受损的数据文件offline.针对受损的数据块,使用备份中好的数据块进行restore和recover,避免了对整个数据文件的restore和recover. 前提条件:必须开启闪回数据库功能. 在oracle 10g中,blockrecover命令可以执行块介质恢复.在oracle 11g中,新的命令recover ... block代替了blockrecover.recover ... block会在

oracle介质恢复和实例恢复的异同

1.概念 ? ? REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制.实际上REDO LOG的存在是为两种场景准备的: 实例恢复(INSTANCE RECOVERY): 介质恢复(MEDIA RECOVERY). ? ? 实例恢复的目的是在数据库发生故障时,确保BUFFER CACHE中的数据不会丢失,不会造成数据库的不一致: 介质恢复的目的是当数据文件发生故障时,能够恢复数据. 虽然这两种恢复使用的机制类似的,但是这两种恢复也有着十分本质的不同,这一点也是很多DBA经常

大话RAC介质恢复---只有备份文件的恢复

场景:Oracle 10g RAC:数据文件.控制文件.联机日志.参数文件都使用ASM,归档到ASM.完整备份后,删除所有控制文件.联机日志.数据文件:最后利用备份进行不完全恢复. 1.模拟灾难场景(略) 2.恢复步骤 1.将数据库启动到nomount状态 SQL>startup nomount 2.用RMAN从自动备份中恢复控制文件,在某个实例中执行 RMAN>restore controfile from '存储备份文件的备份集'; 3.挂载数据库 RMAN>sql'alter da

大话RAC介质恢复---联机日志损坏

对联机日志的损坏要根据日志状态进行分析,联机日志一般会有Current.Active和Inactive三种状态.Inactive状态不会造成数据丢失.而Active和Current状态的日志一般会造成数据的丢失.根据v$log.status判断受损日志的状态. a.如果是Inactive状态的日志损坏,把该组日志drop就可以.因为每个thread至少要有两组日志,所以在删除前要先添加一组. b.如果是ACTIVE/CURRENT状态,则要进行一下操作: 1.关闭所有实例 2.在受损实例上,启动