16. Performing Database Recovery

确定执行恢复的必要性
访问不同接口(EM以及命令行)
描述和使用可用选项,如RMAN和Data Recovery Advisor
执行恢复
-控制文件(control file)
-重做日志文件(redo log file)
-数据文件(data file)

打开数据库
NoMount: 从ShutDown->NoMount, 读取初始化参数文件(pfile),不检查数据库文件
Mount: 从NoMount->Mount,检查参数文件中所列的控制文件是否存在并且同步,任一控制文件丢失,实例均会返回错误并且保持在NoMount状态
Open: 从Mount->Open,检查控制文件中所列的重做日志组是否至少存在一组,任何丢失的日志组成员均会被记录到警告日志;检查控制文件中所列的没有offline的数据文件是否存在,如果有文件丢失,会报告包含第一个丢失的文件信息的错误,需要检查v$recover_file获取所有丢失的文件
SQL> SELECT name, error
  2  FROM v$datafile
  3  JOIN v$recover_file
  4  USING (file#);

保持数据库在打开状态
介质错误会导致实例错误:如丢失控制文件,丢失重做日志文件的一个组(即使是inactive的组)或者丢失属于SYSTEM和UNDO表空间的一个数据文件
很多时候,实例错误必能全完关闭数据库,在进行恢复之前,需要管理员应用SHUTDOWN ABORT命令

Data Recovery Advisor当前仅支持单实例,不支持RAC。
rman target /
rman> list failure all;

V$IR_FAILURE: Listing of all failures, including closed ones (result of the LIST FAILURE command)
V$IR_MANUAL_CHECKLIST: Listing of manual advice (result of the ADVISE FAILURE command)
V$IR_REPAIR: Listing of repairs (result of the ADVISE FAILURE command)
V$IR_FAILURE_SET: Cross-reference of failure and advise identifiers

数据库恢复
1.丢失一份控制文件
如果控制文件存储在ASM磁盘组,恢复选项如下:
1).使用EM根据向导执行恢复
2).将数据库置于NoMount模式,然后应用RMAN从现有控制文件中恢复
RMAN> restore controlfile from '+DATA/orcl/controlfile/current.260.695209463';
如果控制文件存储在普通文件系统
1).关闭数据库
2).拷贝现有控制文件来替代丢失的控制文件
当控制文件成功恢复之后,打开数据库

2.丢失某重做日志文件组中的一份重做日志文件
从文件组中删除文件,然后重新添加文件
SQL> ALTER DATABASE DROP LOGFILE MEMBER '+DATA/orcl/onlinelog/group_1.261.691672257';
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+DATA' TO GROUP 2;
清空日志组以重建丢失的文件
SQL> ALTER DATABASE CLEAR LOGFILE GROUP #;
SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #;

3.在非归档模式下丢失一份数据文件
1).如果数据库没有关闭,则关闭数据库
2).从备份中恢复整个数据库,包括所有数据文件和控制文件
3).打开数据库
4).让用户重新录入自从上次备份以来所做的改变

4.在归档模式下丢失一份非关键数据文件
在归档模式下,丢失不属于SYSTEM和UNDO表空间的数据文件,仅影响所在数据文件的对象。
1).在EM的维护页面点击执行恢复
2).选择数据文件作为恢复类型(Object Type),然后选择"Restore to current time"
3).添加所有需要恢复的数据文件
4).决定恢复的数据文件位于默认位置或者新的位置(在硬盘或者控制文件丢失的情况下)
5).提交RMAN操作以恢复丢失的文件

实验:普通表空间,比如users,文件丢失的恢复

模拟损坏:
[oracle@oracle ~]$ sqlplus scott/tiger
create table e as select * from emp;

!rm -rf /u01/app/oracle/oradata/orcl/users01.dbf
select * from e;

conn /as sysdba
alter system flush buffer_cache;

conn scott/tiger
select * from e;

conn /as sysdba
alter database datafile 4 offline;

!cp -v /u01/app/oracle/backup/hotbk/users01.dbf /u01/app/oracle/oradata/orcl
recover datafile 4;

alter database datafile 4 online;

conn scott/tiger
select * from e;

发现e表没有丢失,完全恢复

实验:未备份的数据文件丢失的恢复

conn /as sysdba
create tablespace t datafile '/u01/app/oracle/oradata/orcl/t01.dbf' size 1M;

conn scott/tiger
create table t tablespace t as select * from dept;

!rm -rf /u01/app/oracle/oradata/orcl/t01.dbf

SQL>conn /as sysdba
SQL>alter system flush buffer_cache;

SQL>alter database datafile 6 offline;
SQL>alter database create datafile 6;--根据控制文件创建数据文件

SQL>select creation_change# from v$datafile where file#=6;--发现恢复的起点是这个文件的创建scn

SQL>recover datafile 6;--直接应用联机redo进行恢复
SQL>select group#, sequence#, status, first_change# from v$log;

SQL>select checkpoint_change# from v$datafile_header where file#=6;
SQL>select checkpoint_change#, last_change# from v$datafile where file#=6;

SQL>alter database datafile 6 online;--一致,online成功

5.在归档模式下丢失一份关键数据文件
1).如果数据库没有关闭,关闭数据库(SHUTDOWN ABORT)
2).Mount数据库
3).执行4中的相同步骤以恢复丢失的文件
4).打开数据库

实验: system表空间的数据文件丢失

模拟破坏:

sqlplus / as sysdba
create table big_t as select * from dba_objects;

!rm -rf /u01/app/oracle/oradata/orcl/system01.dbf
alter system flush buffer_cache;

恢复:关闭数据库,启动到mount:由于不能正常关闭,只能杀进程:
[oracle@oracle u01]$ ps -ef | grep dbw
oracle 4410 1 0 08:20 ? 00:00:00 ora_dbw0_orcl
oracle 4620 4478 0 08:27 pts/2 00:00:00 grep dbw
[oracle@oracle u01]$ kill -9 4410

startup
select file#,error,change#,time from v$recover_file;

查看检查点scn:
ORA10G>select checkpoint_change#, last_change# from v$datafile where file#=1;
ORA10G>select checkpoint_change# from v$datafile_header where file#=1;

将system表空间的备份拷贝至文件所在的位置:
!cp -v /u01/app/oracle/backup/hotbk/system01.dbf /u01/app/oracle/oradata/orcl
alter database open; --error

select checkpoint_change#, last_change# from v$datafile where file#=1;
select checkpoint_change# from v$datafile_header where file#=1;
CHECKPOINT_CHANGE#
------------------
1162060

通过备份点找到恢复时应用的第一个归档日志文件:

ORA10G>select name from v$archived_log where 1162060 between FIRST_CHANGE# and NEXT_CHANGE#;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/archivelog/1_59_816604382.dbf

recover datafile 1;
auto

alter database open;

select count(*) from big_t;

发现big_t仍然存在,是完全恢复

实验:undo表空间文件丢失的恢复

模拟损坏:
create table e as select * from emp;
!rm -rf /u01/app/oracle/oradata/orcl/undotbs01.dbf

conn /as sysdba
alter system flush buffer_cache;

conn scott/tiger
update e set sal=sal+100;

关闭数据库并启动到Mount
conn /as sysdba
shutdown abort
startup mount

将数据文件拷回相应位置
!cp -v /u01/app/oracle/backup/hotbk/undotbs01.dbf /u01/app/oracle/oradata/orcl/

恢复数据文件
recover datafile 2;
auto

alter database open;
conn scott/tiger
select * from tab;

实验:所有数据文件全部丢失

模拟损坏:
SQL>conn scott/tiger
create table e as select * from emp;
SQL>exit

[oracle@oracle ~]$ cd $ORACLE_BASE/oradata/orcl
[oracle@oracle orcl]$ rm -rf *dbf

[oracle@oracle orcl]$ sqlplus / as sysdba
SQL>alter system flush buffer_cache;
SQL>conn scott/tiger
SQL>exit

[oracle@oracle orcl]$ ps -ef | grep dbw
oracle 5056 1 0 08:46 ? 00:00:00 ora_dbw0_orcl
oracle 15510 14808 0 10:40 pts/1 00:00:00 grep dbw
[oracle@oracle orcl]$ kill -9 5056

[oracle@oracle orcl]$ sqlplus / as sysdba
SQL>startup

SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl
SQL>recover database;--开始恢复
auto

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

SQL>select checkpoint_change#,last_change# from v$datafile;
SQL>select checkpoint_change# from v$datafile_header;

SQL>alter database open;--因为一致了,所以打开了

SQL>conn scott/tiger
SQL>select * from e;

6. 不完全恢复

实验:基于scn的不完全恢复:

首先模拟损坏:
conn scott/tiger
drop table emp purge;

首先通过日志挖掘,找到误删除的时间点
select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

SQL>execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log')
execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log')
execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log')

启动挖掘:
execute dbms_logmnr.start_logmnr();

查询误删除的scn:
select SCN,SQL_REDO from v$logmnr_contents where SEG_OWNER='SCOTT' AND TABLE_NAME='EMP' and sql_redo like '%drop table emp%';

SQL>shutdown immediate
SQL>startup mount;

SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl--拷贝所有数据文件的备份:
SQL>recover database until change 1236777 --将数据库恢复到误操作的前一时刻
auto

SQL>alter database open resetlogs;

实验:基于cancel的不完全恢复

[oracle@oracle ~]$ sqlplus / as sysdba

SQL>shutdown abort
SQL>startup mount;

SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl

SQL>recover database;--此时进行完全恢复,但是当前日志丢失,所以不能进行完全恢复
auto

SQL>recover database until cancel--实施基于cancel的不完全恢复,数据库只能恢复到丢失的日志
cancel

SQL>alter database open resetlogs;--要以resetlogs的方式打开数据库,发现日志没了,oracle会以控制文件记录的日志文件重建日志文件

实验:使用备份的控制文件的不完全恢复
主要是针对于误删除表空间的不完全恢复:

1)使用现有控制文件进行恢复:

模拟损坏:
SQL>create tablespace tt datafile '/u01/app/oracle/oradata/orcl/tt01.dbf' size 1M;
SQL>conn scott/tiger
SQL>create table tt tablespace tt as select * from dept;

执行全备:
[oracle@oracle u01]$ ./userback.sh

[oracle@oracle u01]$ sqlplus / as sysdba
SQL>drop tablespace tt including contents and datafiles;
SQL>alter system switch logfile;

select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

SQL>execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log')
execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log')
execute dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log')

SQL>exec dbms_logmnr.start_logmnr();
select SCN,SQL_REDO from v$logmnr_contents where sql_redo like '%drop%';
485780

SQL>shutdown immediate
SQL>startup mount

SQL>!cp -v /u01/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl
SQL>recover database until change 485780
auto

SQL>alter database open resetlogs;

SQL>conn /as sysdba
SQL>select tablespace_name,file_name from dba_data_files;

发现tt表空间的文件名已经于之前不一样,因为tt表空间被删除了,控制文件中没有tt表空文件的记录
所以在恢复的过程中oracle自定义了tt表空间文件的名称

需要重新对tt表空间的文件进行命名:
SQL>alter tablespace tt rename datafile '/u01/app/oracle/product/11.2/db_1/dbs/MISSING00006' to '/u01/app/oracle/oradata/orcl/tt01.dbf';

SQL>alter tablespace tt offline;--此时需要恢复

SQL>recover datafile 6;
auto

SQL>alter tablespace tt online;

2)使用备份的控制文件进行恢复:

重新对数据库做备份:
./userback.sh

SQL>drop tablespace tt including contents and datafiles;
SQL>select 'execute dbms_logmnr.add_logfile('''||member||''')' from v$logfile

SQL>exec dbms_logmnr.start_logmnr();
SQL>select SCN,SQL_REDO from v$logmnr_contents where sql_redo like '%drop%';
486128

SQL>shutdown immediate
SQL>startup nomount

SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control01.ctl
SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control02.ctl
SQL>!cp /u01/app/oracle/backup/hotbk/control.bak /u01/app/oracle/oradata/orcl/control03.ctl

SQL>alter database mount;
SQL>!cp -v /u01/app/oracle/backup/hotbk/*dbf /u01/app/oracle/oradata/orcl

SQL>recover database until change 486128 using backup controlfile
auto

SQL>recover database until change 486128 using backup controlfile
cancel

SQL>alter database open resetlogs;
SQL>select tablespace_name,file_name from dba_data_files;

OCA读书笔记(16) - 执行数据库恢复的更多相关文章

  1. OCA读书笔记(15) - 执行数据库备份

    物理备份 -- 数据文件,控制文件,日志文件,参数文件 数据库备份 冷备 -- 归档和非归档均可以 什么时候必须用冷备?1. 数据库的模式为非归档的2. 用于现场保护 冷备的过程:1. 首先查看备份文 ...

  2. OCA读书笔记(14) - 备份和恢复基本概念

    备份恢复概念 如何判断数据库的一致性 在mount状态下,oracle如何判断数据库的一致性 scn:system change number,它是数据库时钟 如何查询当前系统的scn: select ...

  3. OCA读书笔记(4) - 管理数据库实例

    Objectives: •Start and stop the Oracle database and components •Use Oracle Enterprise Manager •Acces ...

  4. OCA读书笔记(7) - 管理数据库存储结构

    7.Managing Database Storage Structures 逻辑结构 数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL&g ...

  5. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

  6. OCP读书笔记(12) - 执行闪回数据库

    闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...

  7. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  8. 在oracle下我们如何正确的执行数据库恢复

    标签:oracle 数据库 恢复 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jiujian.blog.51cto.com/4 ...

  9. OCP读书笔记(9) - 诊断数据库

    数据库恢复顾问 Data Recovery Advisor的命令行选项 1. 启动 RMAN 进程并连接到目标$ rman target=/ 2. 假设发生了某个错误,希望找出原因,使用 list f ...

随机推荐

  1. Java基础03 构造器与方法重载

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...

  2. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  3. BZOJ 1112: [POI2008]砖块Klo1112( BST )

    枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...

  4. C++多继承的好处是增加了弹性和灵活性,Delphi类强迫单继承TObject是为了提供许多强大功能

    要说灵活性,是C++更强.我自己开发已经好几次碰到需要多继承的情况了. 但是Delphi强迫继承TObject,虽然是单继承,但是提供了相当多的强力功能.要说强大,那还是Delphi当仁不让. 摘自& ...

  5. WCF技术剖析之十七:消息(Message)详解(下篇)

    原文:WCF技术剖析之十七:消息(Message)详解(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]< ...

  6. boost uuid 学习笔记

    #include <vector>#include <iostream>#include <boost/uuid/uuid.hpp>#include <boo ...

  7. bottle-session 0.3 : Python Package Index

    bottle-session 0.3 : Python Package Index bottle-session 0.3

  8. 中国还是和AMD走到一起了 但美国会高兴吗(网易科技 卢鑫)

    文/ 网易科技 卢鑫 去年的这个时候,小编写下了一篇<易评:还给AMD一个公正!>——此文由AMD惨不忍睹的第一季度财报展开,谈到了该公司将全部资源押宝2016的现实.如今,2016第一季 ...

  9. HDU 3397 Sequence operation(线段树)

    HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...

  10. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...