正德厚生,臻于至善

Oracle 11g备份与恢复

第一部分:手工备份与恢复
第一章:备份恢复概述
一)数据库故障类型:
1)user process failure:   pmon 自动处理
2)instance failure:    smon 自动处理
3)user errors :   需要dba通过备份恢复或闪回技术解决
4)media failure:只能通过备份和日志恢复
二)备份和恢复计划
1)根据生产环境的恢复周期,制定详细的备份计划,然后严格执行
2)对备份,要在一定的时间内利用测试环境,进行故障恢复的练习
三)备份恢复分类
1)逻辑备份与恢复-- 面向object
①传统的导入导出:exp/imp:
②数据泵导入导出:expdp/impdp
逻辑备份就是热备数据库对象某一时刻状态,不能运用在media failure上,逻辑备份的恢复就是还原备份,没有recover的概念。
2)物理备份与恢复-- 面向media failure
①手工备份与恢复,也叫用户管理的备份与恢复(UMAN),通过OS 的命令,完成备份与还原,然后再运用日志进行恢复。
②自动备份与恢复,利用oracle 的备份恢复工具RMAN,使还原与恢复过程自动完成,可以备份恢复ASM FILE。
物理备份从方式上可以有一致性备份(冷备)和非一致性备份(热备)
完整的备份策略应该以物理备份为主,逻辑备份为辅(用于备份一些重要的表)
3)闪回技术-- 面向人为的逻辑错误
不需要利用备份。一种利用undo数据或闪回日志的快速恢复技术。可以针对不同层面问题进行逻辑恢复,11g支持七种flashback方式。
四)完全恢复与不完全恢复
media failure后,需要运用日志进行recover。
1)完全恢复:
利用完整备份或部分备份,可以将datafile恢复到failure前得最后一次commit,不会出现数据丢失。
2)不完全恢复
需要运用完整备份和日志将database恢复到过去的某个时间点(或SCN),有数据丢失。
五)归档与非归档
1)归档模式:redo log 写入 archive log
2)非归档模式:没有archive log, redo log file循环覆盖
当处于非归档模式下时,在丢失数据文件后唯一的选择是执行完整的数据库还原,而不能进行recover。
第二章:手工备份与恢复
一)相关命令
1)备份和还原都使用OS命令(数据库是文件系统),如linux中的cp
2)恢复用sqlplus命令:recover
二)备份前进行检查:
1)检查需要备份的数据文件
SQL> select name from v$datafile;
SQL> select file_id,file_name,tablespace_name from dba_data_files;
2)检查要备份的控制文件
SQL> select name from v$controlfile;

3)在线redo日志可以不做备份
三)dbv检查坏块
在手工备份前,应该检查datafile 是否有坏块,备份完后对备份也要做检查。
对某个datafile做坏块检查
$ dbv file=/u01/oradata/prod/users01.dbf feedback=50
DBVERIFY - 开始验证: FILE = /u01/oradata/prod/users01.dbf
.......
四)冷备的注意事项:
1)必须干净的关闭数据库,以保证数据一致性。
SQL> shutdwon immediate;
2)在OS下必须备份所有数据文件(完整备份)
3)在OS下必须备份控制文件(至少备份一个)
4)非归档备份还原策略
恢复时还原所有备份,重建所有在线日志, 没有recover步骤。
SQL> startup mount
SQL> alter database clear unarchived logfile group n;(n为所有在线日志组)
SQL> alter database open;
五)手工非一致性备份(热备份)
1)在备份前要进入热备模式,备份后要结束热备模式
执行begin backup 设置备份模式(在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn为起点)
对只读的表空间不能做热备份,临时表空间不需要备份,特别强调:NOARCHIVE模式下不支持手工热备。
对整个数据库设置热备模式:SQL> alter database begin backup
对整个数据库结束热备模式:SQL> alter database end backup;
对单个表空间设置热备模式:SQL> alter tablespace users begin backup;
对单个表空间结束热备模式:SQL> alter tablespace users end backup;
2)手工热备利用v$backup 监控      
例;
SQL> alter tablespace test begin backup;
SQL> select file#,checkpoint_change# from v$datafile_header;
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            2414314
         2            2414314
         3            2414314
         4            2414314
         5            2414314
         6            2430480   在备份期间,scn被冻结,当检查点发生时不受影响,它是恢复阶段运用日志的起点。
         7            2414314

SQL> select * from v$backup;
     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- -------------------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 ACTIVE                        2430480 2012-07-30 11:07:19    
         7 NOT ACTIVE                  0
STATUS 是ACTIVE,表示可以备份相应的数据文件。
$cp test01.dbf test01.bak
SQL> alter tablespace test end backup;
SQL> select * from v$backup;
备份完毕,尽快执行end backup
如果在end backup之前发生数据库abort,那么可以在下次启动到mount时end backup,从而完成实例恢复。
六)split block(fractured block)问题
一个Oracle block一般包含多个OS block,,当手工热备时,OS的cp单位不是Oracle block而是OS block,而Oracle的DBWR又可能不时的从内存中刷新Oracle block(脏块)到磁盘上,如此,OS级的拷贝便可能造成:一个Oracle Block是由不同的版本组成,比如未被DBWR刷新Header block 加上另一部分被刷新的foot block,这样cp出来的Oracle blcok就是split block。

数据库的一致性是不允许oracle block是split的, split block 实际上属于logical corruption Oracle采取的办法是:在backup mode后,如果发现首次DBWR要写脏块,则将该块被刷新之前的镜像数据记录到redo buffer,这样,虽然cp后的文件里仍然含有split block,而当需要恢复时,日志会前滚该块的前镜像,以保证所有被恢复的oracle block最终是一个完整的版本。

这就是我们常常发现在热备时日志文件会急剧增大的原因。

RMAN备份不会造成split block。 RMAN备份时以oracle block为读取单元,并查验块的一致性,如果不一致会重复读,三次失败,将标注该块为逻辑坏块。

第三章:手工完全恢复
一)基本概念
1)完全恢复的步骤
   1)restore: OS拷贝命令还原所有或部分datafile
   2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复
2)完全恢复可以基于三个级别
    recover database:   所有或大部分datafile损坏,一般是在mount状态完成
    recover tablespace:   非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成
    recover datafile:   单一或少量数据文件损坏,可以在mount或open 状态完成
3)什么是关键文件
如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!
哪些文件是关键文件:①system01 file,②undotbs file,③control file,④current log file
4)恢复过程可以查看的视图:
   1)v$recover_file   查看需要恢复的datafile
   2)v$recovery_log   查看recover 需要的redo 日志
   3)v$archvied_log   查看已经归档的日志
二)适用场景
1)recover database (所有或大部分数据文件损坏,mount或open下进行)
OS:使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)
SQLPLUS:
①recover database;
②alter database open;

2)recover tablespace (针对表空间的非关键数据文件损坏,一般是open下进行
OS:使用cp 还原该表空间XXX下的所有数据文件
SQLPLUS:
①alter tablespace XXX offline immediate;
②recover tablespace XXX;
③alter tablespace XXX online;

3)recover datafile    (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)
第一种情形
OS:使用cp 还原相关的关键数据文件(mount)
SQLPLUS:
①recover datafile 6,8;
②alter database open;
第二种情形
OS:使用cp 还原相关的非关键数据文件(open)
SQLPLUS:
①alter database datafile 6,8 offline;
②recover datafile 6,8;
③alter database datafile 6,8 online;

三)示例
前提: 有一套datafile全备, 使用当前控制文件, 自上次备份以来的归档日志和当前联机日志是完整的。

示例1:recover database (如果是system01.dbf损坏只能在mount下恢复。)
sys:
SQL> select * from scott.test;
        ID
----------
         1

在这个状态下先在OS下做一个数据文件和控制文件的冷备。
SQL> shutdown immediate
[oracle@prod ~] $cp /u01/oradata/prod/*.dbf  /u01/back1
[oracle@prod ~] $cp /u01/oradata/prod/*.ctl  /u01/back1
[oracle@prod ~] $startup
SQL> insert into scott.test values(2);
SQL> commit;
SQL> insert into scott.test values(3);
SQL> select * from scott.test;
        ID
----------
         2
         3    这条记录未提交,恢复时会回滚掉
         1

1)模拟介质失败
[oracle@prod ~]$ rm /u01/oradata/prod/system01.dbf   数据库在打开的情况下就删除关键文件
[oracle@prod ~]$ rm /u01/oradata/prod/users01.dbf
[oracle@prod ~]$ rm /u01/oradata/prod/example01.dbf
$sqlplus / as sysdba   换个session登录,然后关闭数据库
SQL> shutdown abort   数据库直接abort了

2)启动database,报错!
SQL> startup
SQL> select file#,error from v$recover_file;

3)还原损坏的三个数据文件
[oracle@prod ~]$ cp /u01/back1/system01.dbf /u01/oradata/prod
[oracle@prod ~]$ cp /u01/back1/users01.dbf /u01/oradata/prod
[oracle@prod ~]$ cp /u01/back1/example01.dbf /u01/oradata/prod

4)比较控制文件和数据文件头的SCN
SQL> select file#,checkpoint_change# from v$datafile;
SQL> select file#,checkpoint_change# from v$datafile_header;
SQL> recover database;
SQL> select file#,checkpoint_change# from v$datafile;

5)打开数据库
SQL> alter database open;
6)验证
SQL> select * from scott.test;
        ID
----------
         2
         1

示例2:recover tablespace(状态:database open)
针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复
模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

恢复表空间(删除了tablespace下的所有的datafile)

1)了解一下当前状态,在test表空间上建立scott.t1表,
SQL> conn scott/scott
SQL> create table t1 (id int) tablespace test;
SQL> insert into t1 values(1);
SQL> commit;
SQL> select * from t1;
NAME
--------------------------------------------------
1

2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件
[oracle@prod ~]$ rm /u01/oradata/prod/test01.dbf

3)查证该表空间上的表不可访问了
SQL> alter system flush buffer_cache;   清除data buffer
SQL> conn / as sysdba   换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!
SQL> select * from scott.t1;

4)看看scn的情况
SQL> select file#,checkpoint_change# from v$datafile;
SQL> select file#,checkpoint_change# from v$datafile_header;

5)将test表空间offline
SQL> alter tablespace test offline immediate;   immediate使表空间能立即脱机,不需要Oracle对任何数据文件做检查

6)数据库open下,使用备份还原这个表空间下的所有数据文件
[oracle@prod ~]$ cp /u01/back1/test01.dbf /u01/oradata/prod
7)恢复tablespace
SQL> recover tablespace test;

8)使表空间online
SQL> alter tablespace test online;   此时数据库状态一直是open的

9)验证
SQL> select * from scott.t1;
ID
--------------------------------------------------
1

示例3:recover datafile(database mount或open状态)
恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

1)模拟环境:
SQL> insert into scott.t1 values(2);    插入一行记录是为了使t1和备份有区别
SQL> commit;
SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2

SQL> delete scott.t1;   注意:删掉了t1但并没有提交,老值在UNDO里。并且记了日志(这点非常关键)。

2)在open 状态下删除datafile
[oracle@prod ~]$ rm /u01/oradata/prod/undotbs01.dbf

3)关闭数据库
SQL> shtudown abort

4)启动数据库mount
SQL> startup
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 3: '/u01/oradata/prod/undotbs01.dbf'

5)还原并恢复UNDO数据文件
[oracle@prod prod]$ cp /u01/back1/undotbs01.dbf ./
SQL> recover datafile 3;
完成介质恢复。

6)打开数据库(会完成UNDO表空间数据的回滚)
SQL> alter database open;
数据库已更改

7)验证
SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2

第四章:手工不完全恢复
一)基本概念
1)不完全恢复的特点:
  ①必须关库,在mount下运行重做日志。
  ②必须以sysdba身份连接进行不完全恢复。
  ③让整个database 回到过去某个时间点,该时间点之后的数据没有被恢复(丢失)。

2)不完全恢复(Incomplete recover) 适用环境:
  ①在过去的某个时间点重要的数据被破坏。
  ②最小化备份测试。
  ③在做完全恢复时,丢失了部分归档日志或当前online redo log(考点)
  ④当误删除了表空间时(使用备份的控制文件)

3)不完全恢复的基本类型:
  ①基于时间点(until time)   使整个数据库恢复到过去的一个时间点前
  ②基于scn(until change)   使整个数据库恢复到过去的某个SCN前
  ③基于cancel (until cancel)   使整个数据库恢复到归档日志或当前日志的断点前
  ④基于误删除表空间(使用备份的controlfile)   使整个数据库恢复到误删除表空间前
二)不完全恢复的步骤
1)利用logminer 工具,找出在某个时间点所作的DDL 或DML 误操作(包括:时间点、scn、sql语句)
2)做当前数据库的最新全备。
3)使用还原点前的备份还原数据文件,
4)运用日志恢复所有数据文件,前滚至需要的时间点前停止。
5)使用resetlogs方式打开数据库。

三)使用当前控制文件做不完全恢复
示例1: 恢复过去某个时间点误删除的table(基于时间点的不完全恢复)
1)环境:scott用户在test表空间下有个t1表
SQL> conn scott/scott
SQL> select * from t1;
        ID
----------
         1
         2

2)误删除了t1表,并purge了。
SQL> drop table t1 purge;
SQL> select * from v$log;
SQL> alter system switch logfile;
SQL> /
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/u01/disk1/prod/arch_1_782662700_131.log
/u01/disk1/prod/arch_1_782662700_132.log
/u01/disk1/prod/arch_1_782662700_133.log   drop table t1 purge的日志条目切换到此归档日志里了。
/u01/disk1/prod/arch_1_782662700_134.log
/u01/disk1/prod/arch_1_782662700_135.log

3)通过logmr 找出误操作的ddl命令的timestamp 或 san,然后做一个不完全恢复。
①建目录、设置参数
$>mkdir -p /home/oracle/logmnr
SQL> alter system set utl_file_dir=’/home/oracle/logmnr’ scope=spfile;
SQL> startup force;
SQL> show parameter utl_file_dir
NAME                                         TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                            string      /home/oracle/logmnr
②指定logmnr目录
SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
③添加第一条日志条目
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/prod/arch_1_782662700_133.log',options=>dbms_logmnr.new);
④添加后续日志条目
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/prod/arch_1_782662700_134.log',options=>dbms_logmnr.addfile);
⑤解析日志条目
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
⑥查看v$logmnr_contents视图
SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time,sql_redo from v$logmnr_contents WHERE lower(sql_redo) like 'drop table%';
USERNAME     SCN         TIME                 SQL_REDO
------------------------------ ---------- ------------------------------ -----------------------------------------------
SCOTT        1918000        2012-08-01 17:28:29      drop table t1 purge;
⑦关闭lognmr
SQL> execute dbms_logmnr.end_logmnr;

4)关闭数据库,删除所有dbf,准备做不完全恢复
SQL> shutdown abort

[oracle@prod ~]$ cd /u01/oradata/prod
[oracle@prod ~]$ rm *.dbf

5)还原所有备份的数据文件
[oracle@prod ~]$ cp /u01/back1/*.dbf ./

6)根据log miner提供的信息,做基于时间点的不完全恢复

SQL> startup
SQL> recover database until time '2012-08-01 17:28:29';
ORA-00279: change 1917581 generated at 07/18/2012 16:46:34 needed for thread 1
ORA-00289: suggestion : /u01/disk1/prod/arch_1_782662700_133.log
ORA-00280: change 1917581 for thread 1 is in sequence #133
17:33:17 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.

7)resetlogs方式打开数据库
SQL> alter database open resetlogs;

8)验证
SQL> select * from scott.t1;
        ID
----------
         1
         2

9)看看在resetlogs后,日志sequence重置了。
SQL> select * from v$log;

示例2:当前日志组损坏,造成数据库崩溃。
session 1
SQL> create table scott.t1(id int);
SQL> insert into scott.t1 values(1);
SQL> commit;
SQL> alter system archive log current;
SQL> insert into scott.t1 values(2);
SQL> commit;
SQL> select * from scott.t1;
        ID
----------
         1   这条已经归档
         2    这条在当前日志中,没有归档

SQL> select group#,sequence#,status from v$log;
    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         22 CURRENT   查v$logfile知道group1是redo01.log
         2         20 INACTIVE
         3         21 ACTIVE

session 2
[oracle@cuug prod]$ rm redo01.log
session 1
SQL> shutdown abort
session 2
[oracle@cuug prod]$ rm *.dbf
[oracle@cuug prod]$ cp /u01/back1/*.dbf ./   还原所有数据文件备份

session 1
SQL> startup
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员 ORA-00312:
联机日志 1 线程 1: '/u01/oradata/prod/redo01.log'

SQL> recover database until cancel;
ORA-00279: 更改 1016334 (在 04/08/2016 15:45:03 生成) 对于线程 1 是必需的 ORA-00289:
建议: /u01/arch/prod/arch_1_904564083_22.log   一定要确认一下这个日志是否是当前日志。
ORA-00280: 更改 1016334 (用于线程 1) 在序列 #22 中
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL> alter database open resetlogs;
SQL> select * from scott.t1;
        ID
----------
         1

四)使用备份控制文件做不完全恢复
1)为什么会使用备份的控制文件?
①当前控制文件全部损坏。
②当控制文件全部损坏+数据文件损坏
2)使用备份的控制文件恢复数据库的语法:
recover database until [time|change] using backup controlfile;
[time|change]是可选的,就是说如果条件满足,仍然可以做到完全恢复。
接下来会有如下选项:
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
此语法的出现是由于控制文件和当前日志不一致,当前日志的scn总是最新的,而控制文件可能是旧的或尚未更新的(类似shutdwon abort操作)。
AUTO:   根据v$archived_log和在归档目的已经存在的归档日志前滚恢复,但不包括前滚current log;
filename:   不在v$archived_log中的日志,指控制文件中受损的归档记录或current log
CANCEL:   退出。

3)使用backup controlfile子句的恢复数据库之后,一律要使用alter database open resetlogs打开数据库。

示例1
环境:当前控制文件损坏,数据文件损坏,有数据文件全备,但之后增加了表空间,并备份了配套的控制文件。
模式:所有数据文件备份(老)------(新建表空间abcd)-----备份控制文件(次新)------日志文件(新)
分析:新建表空间数据文件损坏, 全备里没有该数据文件的备份,控制文件有abcd的描述,当前控制文件又丢失,只能用备份的控制文件恢复。

1)环境:
SQL> select * from v$tablespace;
SQL> select GROUP#,SEQUENCE#,STATUS from v$log;

    GROUP#  SEQUENCE#   STATUS   
---------- ----------------- ------------- --------------------------------------------------------------
     1         7            CURRENT
     2         5            INACTIVE
     3         6            INACTIVE

SQL> create tablespace abcd datafile '/u01/oradata/prod/abcd01.dbf' size 5m;
SQL> create table scott.a1 (name char(10)) tablespace abcd;
SQL> insert into scott.a1 values('a');
SQL> commit;
SQL> select * from scott.a1;
NAME
----------
a

SQL> alter system switch logfile;

2)备份控制文件
SQL> alter database backup controlfile to '/u01/oradata/prod/con.bak1';

3)模拟abcd01.dbf损坏和所有ctl损坏
[oracle@prod ~]$rm /u01/oradata/prod/abcd01.dbf   数据库open状态,删除abcd01.dbf数据文件
SQL> alter system flush buffer_cache;   db buffer 清空
SQL> conn / as sysdba   换个session查看 a1表物理读失败
SQL> select * from scott.a1;

[oracle@prod ~]$ rm *.ctl

4)关闭数据库
SQL> shutdown abort;

5)恢复所有数据文件备份,准备做不完全恢复
[oracle@prod ~]$ cd /u01/oradata/prod
[oracle@prod ~]$ rm *.dbf
[oracle@prod ~]$ cp /u01/back1/*.dbf ./
[oracle@prod ~]$ cp con.bak1 control01.ctl
[oracle@prod ~]$ cp con.bak1 control02.ctl
[oracle@prod ~]$ cp con.bak1 control03.ctl

SQL> startup
SQL> col name for a50;
SQL> select file#,checkpoint_change#,name from v$datafile;
     FILE# CHECKPOINT_CHANGE# NAME
---------- ------------------ --------------------------------------------------
         1            6676574 /u01/oradata/prod/system01.dbf
         2            6676574 /u01/oradata/prod/sysaux01.dbf
         3            6676601 /u01/oradata/prod/abcd01.dbf
         4            6676574 /u01/oradata/prod/user01.dbf
         5            6676574 /u01/oradata/prod/example01.dbf
         6            6676574 /u01/oradata/prod/test01.dbf
         7            6676574 /u01/oradata/prod/undotbs01.dbf
SQL> select file#,checkpoint_change#  from v$datafile_header;
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            6676343
         2            6676343
         3                  0
         4            6676343
         5            6676343
         6            6676343
         7            6676343
可以看出:
①file3 在控制文件里记录是abcd01.dbf,而与之对应的数据文件3是不存在的,
②备份的数据备份的scn比控制文件scn还老。

6)使用备份控制文件恢复
SQL> recover database using backup controlfile;
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 3: '/u01/oradata/prod/abcd01.dbf'
ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 3: '/u01/oradata/prod/abcd01.dbf'
此错是因为老备份里没有abcd表空间,但只要控制文件里记录了abcd就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。

SQL> alter database create datafile '/u01/oradata/prod/abcd01.dbf';
SQL> recover database using backup controlfile;   再次使用备份控制文件恢复
ORA-00308: 无法打开归档日志 '/u01/disk1/prod/arch_1_804846837_9.log'
ORA-27037: 无法获得文件状态
Linux Error: 2: No such file or directory
Additional information: 3

archive日志前滚结束了,但当前日志里还有信息需要恢复
注意: 对于这个例子来说,一定要看清提示:如果提示的不是归档的日志(是当前日志),则要直接要输入filename 而不能输入auto,否则open时会失败。

SQL> recover database using backup controlfile;   再次使用备份控制文件恢复
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oradata/prod/redo03.log   哪一个日志是当前日志,需要尝试。
已应用的日志。
完成介质恢复。

7)resetlogs打开数据库

SQL> alter database open resetlogs;

8)验证
SQL> select * from scott.a1;
NAME
----------------------------------------
a

示例2:
环境:当前控制文件损坏,新建表空间在备份控制文件之后
模式:全备(老)-----备份控制文件(次新)-----新建表空间abcd------日志文件(新)
分析:整个恢复过程中datafile结构有了变化,变化发生在备份控制文件之后,新增了表空间abcd。控制文件备份里没有此表空间记录,但日志里有。
1)环境
SQL> drop tablespace abcd including contents and datafiles;
SQL> alter database backup controlfile to '/u01/oradata/prod/con.bak';
控制文件备份中没有abcd表空间
SQL> create tablespace abcd datafile '/u01/oradata/prod/abcd01.dbf' size 5m;
SQL> create table scott.r1 (id int) tablespace abcd ;
SQL> insert into scott.r1 values(1);
SQL> commit;

SQL> select * from v$tablespace;
SQL> select * from scott.r1;
        ID
----------
         1

SQL> select GROUP#,SEQUENCE#,STATUS from v$log;
    GROUP#    SEQUENCE#     STATUS
---------- ---------- --------------- ----------------------------------------------------
    1                1         CURRENT
    2                0         UNUSED
    3                0         UNUSED

2)模拟新建数据文件损坏
[oracle@prod ~]rm abcd01.dbf
SQL> alter system flush buffer_cache;
SQL> conn / as sysdba
SQL> select * from scott.r1;

3)关闭数据库
SQL> shutdown abort

4)还原所有数据文件,以老控制文件替换当前控制文件
[oracle@prod ~]$ cd /u01/oradata/prod
[oracle@prod ~]$ rm *.ctl
[oracle@prod ~]$ rm *.dbf
[oracle@prod ~]$ cp /u01/back1/*.dbf ./
[oracle@prod ~]$ cp con.bak2 control01.ctl
[oracle@prod ~]$ cp con.bak2 control02.ctl
[oracle@prod ~]$ cp con.bak2 control03.ctl

5)启动数据库
SQL> startup
ORACLE 例程已经启动。
......
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

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

6)使用备份控制文件恢复数据库
SQL> recover database using backup controlfile;
ORA-00279: 更改 6676343 (在 01/16/2013 14:11:39 生成) 对于线程 1 是必需的
ORA-00289: 建议: /u01/disk1/prod/arch_1_804846837_4.log
ORA-00280: 更改 6676343 (用于线程 1) 在序列 #4 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oradata/prod/redo01.log
ORA-00283: 恢复会话因错误而取消
ORA-01244: 未命名的数据文件由介质恢复添加至控制文件
ORA-01110: 数据文件 3: '/u01/oradata/prod/abcd01.dbf'
ORA-01112: 未启动介质恢复

SQL> select file#,checkpoint_change#,name from v$datafile;
     FILE# CHECKPOINT_CHANGE# NAME
---------- ------------------ --------------------------------------------------
         1            6678002 /u01/oradata/prod/system01.dbf
         2            6678002 /u01/oradata/prod/sysaux01.dbf
         3            6677999 /u01/oracle/dbs/UNNAMED00003   这是从日志回写到控制文件中的名字,需要重命名
         4            6678002 /u01/oradata/prod/user01.dbf
         5            6678002 /u01/oradata/prod/example01.dbf
         6            6678002 /u01/oradata/prod/test01.dbf
         7            6678002 /u01/oradata/prod/undotbs01.dbf

SQL> select file#,checkpoint_change# from v$datafile_header;
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            6678002
         2            6678002
         3                  0   这里需要建立一个空的数据文件。
         4            6678002
         5            6678002
         6            6678002
         7            6678002

7)建立数据文件并对控制文件中未知的数据文件重命名
SQL> alter database create datafile '/u01/oracle/dbs/UNNAMED00003' as '/u01/oradata/prod/abcd01.dbf';
上面的命令一石二鸟,自动完成了两个动作
①加了一个数据文件abcd01.dbf,
②重命名控制文件UNNAMED00003为abcd01.dbf

SQL> select file#,checkpoint_change#,name from v$datafile;
     FILE# CHECKPOINT_CHANGE# NAME
---------- ------------------ --------------------------------------------------
         1            6678002 /u01/oradata/prod/system01.dbf
         2            6678002 /u01/oradata/prod/sysaux01.dbf
         3            6677999 /u01/oradata/prod/abcd01.dbf
         4            6678002 /u01/oradata/prod/user01.dbf
         5            6678002 /u01/oradata/prod/example01.dbf
         6            6678002 /u01/oradata/prod/test01.dbf
         7            6678002 /u01/oradata/prod/undotbs01.dbf

SQL> recover database using backup controlfile;

8)resetlogs打开数据库
SQL> alter database open resetlogs;

9)验证
SQL> select * from scott.r1;
        ID
----------
         1
第二部分:数据库闪回技术

第一章:闪回技术介绍
一)flashback 的功能:1)利用undo data已提交还未被覆盖的数据,2)flashback log  使database 可以恢复到过去某个时间点,可以作为不完全恢复的补充。

二)flashback分类:
   1)flashback drop
   2)flashback query
   3)flashback data archive
   4)flashback table
   5)flashback version query
   6)flashback transaction
   7)flashback database

第二章:七种闪回技术示例:
一)闪回drop
又名闪回删除(PPT-II-299)
1)理解回收站(recyclebin)
从管理的角度为每个用户“分配”一个回收站,但这个回收站并不实际开辟空间(只是个逻辑容器),当drop table时(非purge),原来的表所使用的段中的数据并没有真正的删除。实际上是把table的段名以回收站方式重命名。该段所在表空间不足需要扩展时,回收站中的信息会被自动清除。

示例:
SQL> show parameter recyclebin  
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      ON 

当初始化参数recyclebin为on时,每个用户都有了自己的回收站
如果参数设为off 就取消了用户的回收站,那么当你drop table就相当于purge了。

SQL> create tablespace test datafile '/u01/oradata/prod/test01.dbf' size 1m;
SQL> create table scott.t1(id int) tablespace test;
SQL> select segment_name from dba_segments where tablespace_name='TEST';   查看test表空间下有了一个段
SEGMENT_NAME
T1
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST';   看这个段有多少空闲空间

SUM(BYTES)
----------
    917504

SQL> insert into scott.t1 values(1);
SQL> insert into scott.t1 select * from scott.t1;   将表空间撑满
/
/
第 1 行出现错误:
ORA-01653: 表 SCOTT.T1 无法通过string (在表空间 TEST 中) 扩展
SQL> select count(*) from scott.t1;
  COUNT(*)
----------
     65536
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST';   没有空闲空间
SQL> drop table scott.t1;
SQL> select segment_name from dba_segments where tablespace_name='TEST';
SEGMENT_NAME
---------------------------------------------------------------------------------
BIN$4KZBTYTKocDgQAB/AQAKRA==$0

SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST';
SUM(BYTES)
----------
    983040
请看,TEST表空间中的空闲空间又回来了,这说明如果test表空间不够时,这部分空闲空间是可以被重新利用的,实际上即使你设置了表空间autoextend特性,Oracle 会先使用recyclebin,若空间还不够,再考虑autoextend.

SQL> create table scott.emp1 tablespace test as select * from scott.emp;   挤占test表空间
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST';
SUM(BYTES)
----------
    917504
SQL> select segment_name from dba_segments where tablespace_name='TEST'; 
SEGMENT_NAME
---------------------------------------------------------------------------------
EMP1
t1表的数据已经被冲掉了,使用闪回删除无法找回了。

2)关于回收站中的对象的闪回和清除
闪回和清除的顺序不同
闪回使用LIFO (后进先出)
清除使用FIFO (先进先出)
假设回收站里有两个t1表,看以下两条语句:
SQL> flashback table t1 to before drop;   闪回的是最新的那个t1表。
SQL> purge table t1;   清除的是最旧的那个t1表。

如果想避免混淆,可以直接给出回收站里的表名
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0";

SQL> purge recyclebin;   清空回收站

3)如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名.
SQL> flashback table t1 to before drop rename to test_old;

4)system 表空间的对象没有回收站,所以在sys下缺省使用system表空间时,drop table会直接删除对象

5)如果一个表上面有索引和约束,drop后再闪回表,索引和约束还在吗?
create table t (id int,name char(10));
alter table t add constraint pk_t primary key(id);
insert into t values (1,'sohu');
insert into t values (2,'sina');
commit;
SQL> select * from t;
        ID NAME
---------- ----------
         1 sohu
         2 sina

看一眼约束和索引
SQL> select * from user_indexes;
SQL> select * from user_constraints;

SQL> drop table t;   表被drop到回收站,再看一眼约束和索引

SQL> select * from user_indexes;   索引不见了
SQL> select * from user_constraints;   约束有,但乱码(除外键约束外)

SQL> flashback table t to before drop;

再看约束和索引
SQL> select * from user_indexes;   索引回来了,有效(考点),但乱码
SQL> select * from user_constraints;   约束也在,有效(考点),但乱码

分别重命名索引和约束
SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t;
SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t;

二)闪回查询
flashback query:(用于DML 误操作并且commit)(PPT-II-257)
1)要点:
利用在undo tablespace 里已经提交的undo block(未被覆盖),可以查询表的过去某个时间点的数据。
通过设置undo_retention参数设置前镜像的保留时间。
查询的语法:
select   …    as of scn | timestamp

2)示例:
sys:
create table scott.student (sno int,sname char(10),sage int);
insert into scott.student values(1,'Tom',21);
insert into scott.student values(2,'Kite',22);
insert into scott.student values(3,'Bob',23);
insert into scott.student values(4,'Mike',24);
commit;
/
SQL> select * from scott.student;

SQL> select current_scn from v$database;   取scn 1
SQL> delete scott.student where sno=1;
SQL> commit;
SQL> select * from scott.student;

SQL> select current_scn from v$database;   取scn 2
SQL> update scott.student set sage=50;
SQL> commit;
SQL> select * from scott.student;

SQL> select * from scott.student as of scn1;   闪回查询到scn1;
SQL> select * from scott.student as of scn2;   闪回查询到scn2;
三)闪回数据归档
(FLASHBACK DATA ARCHIVE--11g新特性)(PPT-II-286-295)(TOTAL RECALL)
1)概念:
无限期的存储表行数据,通过后台进程FBDA,捕捉必要的数据并将其保存在归档上,然后可以使用常规闪回查询命令(as of)查询需要的数据,但闪回可以回朔到多年以前。闪回数据归档可以看成是闪回查询时间的延伸。
2)要点:
①首先要有一个(或多个)表空间存放归档表,可以加上配额,使用与原表同一表空间在技术上是可行的,但Oracle建议它们与常规的数据分开存放更好。
②先要建立一个归档名(方案),作为一个数据库的对象,可以为它指定default属性,含义是把所有要归档的表都建立在该缺省的归档名下。
③可以根据需要建立多个闪回归档名(方案),这取决于你需要多少种不同的保留时间。可以调整保留时间,一旦超过了保留期限,后台进程FDBA将自动删除该表历史记录,也可以在保留期内手动进行删除操作。
④关于两个权限:
     flashback archive administer             授予用户创建,修改或删除闪回归档名(方案)
     flashback archive                     授予用户对表进行归档。
⑤启用表的闪回归档需要使用alter table 表名 flashback archive 归档名
⑥闪回归档enable也有个前提条件,表空间要ASSM管理和以及undo_management=auto 否则修改表时报ORA_55614错误
⑦关于闪回归档的视图:
     DBA_FLASHBACK_ARCHIVE   描述配置的归档
     DBA_FLASHBACK_ARCHIVE_TS   列出使用的表空间
     DBA_FLASHBACK_ARCHIVE_TABLES   查看归档的表

3)示例:
示例1:DBA建一个表空间用于闪回数据归档,然后将闪回数据归档作为一个对象创建并授权。
sys:
create tablespace fda datafile '/u01/oradata/prod/fda01.dbf' size 5m;
create flashback archive fla1 tablespace fda quota 2m retention 1 year;
grant flashback archive on fla1 to scott;

用户将自己的表定义为闪回归档
scott:
SQL> alter table emp1 flashback archive fla1;

可以做些DML操作在使用闪回查询(as of)验证。
11gR1上尝试做一些DDL操作会报错(11gR2上已改进了,PPT-II-291):
scott:
alter table emp1 drop column comm;
truncate table emp1;
ORA-55610: 针对历史记录跟踪表的 DDL 语句无效。

drop table emp1;(11gR2上也不行)

取消归档保护
sys:
SQL> select * from dba_flashback_archive;   查看有哪些归档名
SQL> select * from dba_flashback_archive_ts;   查看归档使用表空间的信息
SQL> select * from dba_flashback_archive_tables;   查看表emp1和归档名的关系
SQL> alter table scott.emp1 no flashback archive;   将表scott.emp1从闪回归档中取消

SQL> select segment_name,segment_type from dba_segments where tablespace_name='FDA';
SEGMENT_NAME                                                                     SEGMENT_TYPE
-------------------------------------------------------------------------------- ------------------
SYS_FBA_DDL_COLMAP_75222                                                 TABLE
SYS_FBA_TCRV_75222                                                               TABLE
SYS_FBA_HIST_75222                                                               TABLE PARTITION
SYS_FBA_TCRV_IDX_75222                                                           INDEX

示例2:通过一道考题我们来实验一下,什么是default归档方案:
题目:
Note the output of the following query;
SQL> SELECT flashback_archive_name, status FROM dba_flashback_archive;
FLASHBACK_ARCHIEVE_NAME      STATUS
FLA1

You executed the following command to enable Flashback Data Archive on the
EXCHANGB_PATE table:
ALTER TABLE exchange_rate FLASHBACK ARCHIEVE;
What is the outcome of this command?
A.The table uses the default Flashback Data Archive.
B.The Flashback Data Archive Is created In the SYSAUX tablespace.
C.The Flashback Data Archive is created in the same tablespace where the tables are stored.
D.The command generates an error because no flashback Data Archive name is specified and there is no default Flashback Data Achieve.

答案:d
SQL> conn / as sysdba
SQL> alter flashback archive fla1 set default;
SQL> select FLASHBACK_ARCHIVE_NAME,STATUS from dba_flashback_archive;
FLASHBACK_ARCHIVE_NAME                                                           STATUS
-------------------------------------------------------------------------------- -------
FLA1                                                                           DEFAULT

SQL> alter table scott.emp1 flashback archive;   不用指定归档名,emp1绑定了FLA1(DEFAULT)。       
SQL> select * from dba_flashback_archive_tables;

删除闪回归档(方案)
SQL> drop flashback archive fla1;   sys用户操作
设置闪回数据归档有两个先决条件:1)使能automatic undo managent 2)tablespace要ASSM的。

四)闪回表
1)要点:
闪回表通常是把表的状态回退到以前的某个时刻或者SCN上。(其实向前向后都能闪)。自动恢复相关的属性,包括索引、触发器等。前提是对表启用行移动。
语法:    
flashback table <table_name> to timestamp | scn

2)示例:
SQL> delete student;
SQL> commit;
SQL> alter table student enable row movement;
SQL> flashback table student to scn XXXXX
注意:
①sys的表不能闪回。
②必须使能行移动。
③缺省下,闪回表的过程中有关的trigger都关闭。
④闪回表有index是被维护的
⑤物化视图下不许闪回表操作

五)闪回版本查询
1)要点:
闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中数据变化的细节,(PPT-II-260)
10g的闪回版本查询可以对时间段内数据表的每行变化(不同版本)进行查询。
2)语法:
select   …  from  …   versions  between
其中,select后面可以选择伪列,来获得事务的开始、结束时间、SCN号、事务XID号等。

3)示例:
首先要追加日志
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA

scott:
create table t3 (id int, name char(10));
insert into t3 values(1,'tim');
insert into t3 values(2,'mike');
insert into t3 values(3,'brain');
insert into t3 values(4,'cade');
commit;  

SQL> update t3 set name='nelson' where id=4;
SQL> commit;
SQL> delete t3 where id=2;
SQL> commit;
SQL> update t3 set id=id+100;
SQL> commit;

看看t3表经历的时间变化

SQL> select versions_startscn, versions_endscn, versions_xid, versions_operation,id,name from scott.t3 versions between
 scn minvalue and maxvalue;

SQL> select versions_xid, versions_operation,id, name from t3 versions between scn minvalue and maxvalue;
考点:
①闪回版本查询不能用于外部表、临时表或V$视图。原因是这些对象都不生成撤销数据。(临时表的撤销是基于session的)。
②闪回版本中的内容不包括未提交的DML语句。
六)闪回事务
1)要点:
闪回事务查询可以提供撤销undo语句。从flashback_transaction_query 这个视图里查询引起数据变化的事务,和撤销事务的SQL语句(PPT-II-270)
也就是查询operation 和 undo_sql列。可以和闪回版本查询结合起来使用。
2)示例:
sys:
SQL> desc flashback_transaction_query;
SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('事务号');

接上例:
SQL> select undo_sql from flashback_transaction_query where xid='03000800F3010000';
UNDO_SQL
--------------------------------------------------------------------------------
update "SYS"."T3" set "ID" = '4' where ROWID = 'AAANByAABAAAO/yAAD';
update "SYS"."T3" set "ID" = '3' where ROWID = 'AAANByAABAAAO/yAAC';
update "SYS"."T3" set "ID" = '1' where ROWID = 'AAANByAABAAAO/yAAA';
执行上面语句,原操作(update t3 set id=id+100;)就撤销了

注意
①Enable Supplemental Logging 并且数据库版本10.0 compatibility
②查询flashback_transaction_query视图需要SELECT ANY TRANSACTION权限。

七)闪回数据库
1)概念:
不需要备份,它通过闪回日志将数据库整体回退到某个时间点。
闪回数据库针对的是逻辑错误,如果数据库发生了物理损坏或介质丢失,闪回数据库将无能为力,闪回数据库不能完全代替传统不完全恢复(考点)
使用闪回数据库,需要开启闪回日志,闪回日志存放在闪回恢复区里。

一旦启用了闪回数据库,某些块的映像会从db buffer 复制到 SGA的一个新的存储区域中,即闪回缓冲区,然后再由后台进程(Recover Write RVWR)将此闪回恢复区的内容刷新到磁盘和闪回日志。这一切并没有改变LGWR的常规作用。与重做日志不同的是 RVWR不是记录数据库所有变化的日志,而是记录完整块影像的记录。

不同于重做日志,闪回日志不能被多路复用和归档。它们是自动创建和管理的。

2)位置和大小
闪回恢复区(flash recovery area)是一个非常重要的概念, 它不仅存放闪回日志,还有许多与恢复有关的文件,比如,可以存放与RMAN相关的三种自动管理的文件,1.归档日志、2.控制文件自动备份 3.RMAN备份片。当flash recovery area空间不够用,Oracle还可以自动清除一些废弃(obsolete)文件。(PPT-II-49-55)
SQL> show parameter recovery_file
NAME                              TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest               string          /u01/flash_recovery_area
db_recovery_file_dest_size           big integer      2G
设置db_recovery_file_dest之前必须先设置db_recovery_file_dest_size
SQL> show parameter flash
NAME                              TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
闪回日志存放的保留期,缺省值1440,单位是分钟。

3)配置方法
①数据库必须是归档模式
SQL> ARCHIVE LOG LIST
闪回数据库必须配备成归档方式,是因为闪回日志里只记录了快照,这些快照可以使数据库回退到某个SCN点,而回退快照的SCN仅比你指定的SCN提前一点,然后会运用归档日志或当前日志前滚一小段,当到达指定的san时停住。然后在此SCN前resetlogs打开数据库。
②指定闪回恢复区
设置参数db_recovery_file_dest='/u01/flash_recovery_area'
③配置闪回保留时间
设置参数db_flashback_retention_target=1440
注意单位是分钟,缺省1440 相当于24小时
④使能闪回数据库(可以在open下)
SQL> alter database flashback on;   
其结果在/u01/flash_recovery_area/prod/flashback目录下创建了一个.flb的闪回日志文件。
并创建RVWR后台进程
如果要关闭闪回数据库(可以在open下)
SQL> alter database flashback on;
SQL> select flashback_on from v$database;   查看闪回数据库启用或关闭
FLASHBACK_ON
------------------
YES
只是检查RVWR进程和闪回日志是否有了,如果alter database flashback off;闪回日志自动清除。

4)示例
首先进入mount下,配置相关参数,开启闪回数据库日志,然后打开数据库,接下来:
①取当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
    7248690
另一个方法是为scn建立一个保存点
SQL> create restore point abc [guarantee flashback database];
[]选项可保证abc点(SCN)以来的闪回日志一直存在,不受db_flashback_retention_target影响

②删除scott用户
SQL> drop user scott cascade;

③准备到mount下做闪回数据库
SQL> shutdown immediate;
SQL> startup mount exclusive   mount要附加exclusive(独占),意思是其他sysdba不能打开数据库。
SQL> flashback database to scn 7248690;
(对应方法二,SQL> flashback database to restore point abc;)

④只读方式打开,确认scott已经被闪回
SQL> alter database open read only;
SQL> select * from scott.emp;

⑤确认无误后,重新以resetlogs 方式打开数据库(属于不完全恢复)
SQL> startup force;
SQL> alter database open resetlogs;   一旦resetlogs打开,若想再一次做闪回,只能闪回比当前更早的scn(见PPT-315page)。

提醒:要在mount下闪回数据库
SQL> flashback database to timestamp to_char('2012-03-02 19:11:11','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 1264788;
闪回后,打开数据库,第一次最好用只读方式, 看看是否恢复到你希望的那个时间点上去了,如果不是你希望的,还可以重新闪回(前闪/后闪都可以,因为只读方式scn是不会增长的)。
五)其他事项
1)适合或不适合闪回数据库
适合:
①truncate table xxx
②drop table xxx purge
③drop user xxx cascade
不适合:
①使用了备份的控制文件或trace文件
②drop表空间的操作
③段重组后的表,收缩后的数据文件。

2) 使用保存点
SQL> create restore point gold;   保存点gold相当一个标记,记录了当前的SCN
SQL> startup mount
SQL> flashback database to restore point gold;

3)两个视图:
v$flashback_database_log显示所能回退到的最早时间,取决与保留的Flashback Database Log 的多少。
v$flashback_database_stat以一个时间段为一行(大约1小时), 记录单位时间内数据库的活动量。

SQL> select * from v$flashback_database_log;
OLDEST_FLASHBACK_SCN表示能够让你闪回到最早的那个scn点。
SQL> select * from v$flashback_database_stat;         
相比来看,v$flashback_database_log信息对于flash database更有帮助。

第三部分 RMAN备份与恢复

第一章:RMAN基本概念
一)什么是RMAN

1、功能:
1)Recovery MANager,是备份和恢复数据库的管理工具
2)由server process进行备份和恢复
3)rman 备份的文件种类
  ①datafile(database、tablespace、datafile)
  ②controlfile、spfile
  ③archivelog
4)在归档模式下支持非一致性备份(热备)
非归档方式的RMAN只能冷备,并在mount下做,但手工备份在mount下cp出来的备份对于RMAN是不可用的。
非归档方式的RMAN恢复只能还原最后一次备份。
2、特点:
1)不备份数据文件中未分配的块,以及未使用的块。节省时间空间。

2)备份时自动检查数据文件是否有坏块,因为RMAN是ORACLE BLOCK级备份技术
3)不备份临时表空间    
4)可以实现增量备份
5)支持多通道并行工作
6)可以备份ASM文件
3、架构:

1)可连接三类数据库:target database(备份的目标库),catalog database(目录数据库),duplicate database(复制数据库)。
2)存储设备:disk 、tape (sbt 磁带机)存放备份文件的设备
3)channel :目标库和存储设备之间备份恢复通道(服务进程)默认最少启动一个channel,可同时启动多个channel并发操作。
4)server process:用于备份和恢复的进程
5)rman的元数据:记录备份的信息(放在目标库的controlfile 里)
6)catalog database :集中管理、存放备份的元数据,还可以存储备份脚本
7)MML:media manage layer 介质管理层:用于管理磁带机的库文件或驱动
4、连接方法:
1)本地连接
RMAN工具和target database在同一台服务器
[oracle@prod ~]$ rman target /
2)远程连接
RMAN客户端通过ORACLE_NET连接target database 在target database 启动监听,在client配置tnsnames.ora。
C:\>rman target sys/system@prod
5、备份类别:
1)backupset:(备份集)
不备份datafile里从未使用块、可以实现增量备份(可以备份到disk和tape)。可以实施compression, 如果只启用一个channel,默认会把所有备份的datafile放入到一个backupset里,并且生成一个备份片backup piece。
2)image copy(映像文件):
实际上和手工cp 类似的,备份datafile所有的数据块, 不能作为增量备份的基础(即0级增量备份),只能备份到disk ,不能备份到tape,优点是可以省略还原步骤,恢复数据库速度快。

二)RMAN的环境变量
RMAN> show all;
db_unique_name 为 prod 的数据库的 RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/U01/MYRMAN/%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BZIP2'; # default  
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/oracle/dbs/snapcf_prod.f'; # default

解释如下:
第一行:CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
保留策略:用来决定哪些备份是有效的,而哪些备份是淘汰的。
保留策略决定了备份是否为obsolete
obsolete有“淘汰”的意思,一旦某个备份成为obsolete了,RMAN还原备份时就不会选择它了。

有两种保留策略,它们互斥,只能选其一。

1)冗余策略,给定至少需要保留最近的N份备份,更早的obsolete。
例如,如果有三个备份,而冗余数是 2,那么最早的那个备份将被废弃。下面的命令将备份策略设置为 2:
RMAN> configure retention policy to redundancy 2;
2)窗口策略,指定一个时间窗口,此策略将保证必须能恢复此时间段内任一个时刻的数据。
例如,假如我们指定恢复窗口是 7 天,假设今天是星期一,此前存在 3 个全备及归档日志。第一个全备是5天前生成的,第二个全备是十天前生成的,而最早一个全备是15天前备份的,
那么十天前生成的备份及之后的归档日志必须保留,而15天前的那个备份会成为废弃备份(obsolete)(见PPT-II-47)

。

关于此环境变量的几种常见设置:
RMAN> configure retention policy to recovery window of 7 days;   将恢复窗口配置为7 天
RMAN> configure retention policy to none;   备份保持策略失效,此后不会将任何备份集或映像文件为obsolete状态。
RMAN> configure retention policy clear;   将恢复默认的保持策略
RMAN> configure retention policy to recovery window of 5 days;   保证至少有一个备份能恢复到 Sysdate-5 的时间点上,之前的备份将标记为Obsolete
RMAN> configure retention policy to redundancy 3;   至少需要有三个冗余的备份存在,如果多余三个备份以上的备份将标记为冗余

第二行:CONFIGURE BACKUP OPTIMIZATION OFF; # default
备份优化,需要说明的是,这个参数是在做全库备份时才会有效。
如果优化设置打开, 它只用于归档日志,只读或脱机表空间的数据文件,因为这些文件是不会变化的,备份集运行一个优化算法。全库备份时跳过重复的备份文件。
备份优化选项依赖于RETENTION POLICY策略,如果启用优化,在已有足够相同文件副本的情况下(r+1),RMAN将不创建额外的文件副本。
RMAN> configure backup optimization on;

第三行:CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
设备类型有两种,可以是磁盘(DISK),或者磁带(STB),默认为磁盘。

第四行:CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
设置控制文件自动备份
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;  
  off:  默认情况下,在备份system 表空间时,会备份控制文件和spfile
  on:  ①在做任何文件的备份时,会自动备份控制文件和spfile,②数据库的物理结构发生变化时,也自动备份controlfile。
从ORACLE DATABASE 11GR2开始,引入了控制文件自动备份延迟创建的特性。有个隐含参数_controlfile_autobackup_delay来控制这种行为,默认是300秒。

第五行:CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default 
给出控制文件自动备份的路径和命名方式,
缺省是‘%F’,控制文件自动备份将放入flash_recovery_area目录下
也可以指定到其他地方
如: CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/myrman/%F';
关于%:
%告诉RMAN要使用的格式模板,以便备份文件的命名引用预定的格式,如下:
%c 备份片的拷贝数
%D 位于该月中的第几天 (DD)
%M 位于该年中的第几月 (MM)
%F 一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,
%d 数据库名称其中IIIIIIIIII 为该数据库的DBID,YYYYMMDD 为日期,QQ 是一个1-256 的序列
%n 数据库名称,向右填补到最大八个字符
%u 一个八个字符的名称代表备份集与创建时间
%p 该备份集中的备份片号,从1 开始到创建的文件数
%U 一个唯一的文件名,代表%u_%p_%c
%s 备份集的号
%t 备份集时间戳
%T 年月日格式(YYYYMMDD)

第四行和第五行的环境变量是有关系。当第四行开启AUTOBACKUP ON后,控制文件备份将放入第五行指定的的目的地

这样好让RMAN在恢复控制文件备份时能自动找到控制文件备份。即和restore controlfile from autobackup命令配套。

第六行:CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
指定在以后的备份与恢复操作中并行度为2,即同时开启2个通道进行备份与恢复,
此行设置可以和手动定义通道命令配合使用:
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/u01/myrman/%U.bak';
RMAN> CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '/u01/myrman1/%U.bak';
注意:定义备份片的位置使用format子句大致有三种形式,以局部优先级更高为原则:
1)在环境变量里定义,如:
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/u01/myrman/%U.bak';
2)在run块中定义,如:
run{
allocate channel c1 type disk format '/u01/myrman/%s.bak';
};
3)在backup语句中定义,如:
backup datafile 4 format '/u01/myrman/%d_%s.bak';

删除channel环境变量
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK clear;
RMAN> CONFIGURE CHANNEL 2 DEVICE TYPE DISK clear;
并行度和RMAN工作效率有直接关系,这部分内容涉及相关知识点较多,我们在后面章节再讨论。

第七行:CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
备份集也可以有多路复用(但映像文件不可以),最大值4,如为2就备份相同的2份(PPT-II-101),注意:TO STB和TO DISK是独立的。也就是说不能同时以DISK和TAPE多路复用。如果一定要实现duplex到磁盘和磁带, 可使用backup backupset.命令
RMAN> backup copies 2 datafile 4 format '/u01/myrman/%s_dbf','/u01/myrman1/%s_dbf';
手动命令可以覆盖这个变量的设置

第八行:CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
归档日志的多路复用,类似数据文件多路复用

第九行:CONFIGURE MAXSETSIZE TO UNLIMITED; # default
该配置限制通道上备份集的最大尺寸,单位支持 Bytes 、KB、MB、GB,默认值是unlimited,(前面提到过)

第十行:CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

第十一行:CONFIGURE ENCRYPTION ALGORITHM ','; # default
加密,Transparent encryption 透明的加密,带钱夹,Password encryption:不带钱夹,(PPT-II-107)

第十二行:CONFIGURE COMPRESSION ALGORITHM 'BZIP2'; # default
RMAN里的压缩也叫binary compression,这是11g新增的参数 (PPT-II-104-106),  压缩只能是针对backup set,有两种算法:'BZIP2'和
'ZLIB'.不要将RMAN的压缩和外部压缩实用程序混合在一起做(考点)。

第十三行:CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
对于归档文件,一般来说,如果你仅是单实例的话(不是Data Guard环境),全备以前的archivelog就没有什么用处了,可以删除,但很多人
不习惯在这里设置参数,更愿意使用脚本删除归档文件。

第十四行:CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/oracle/dbs/snapcf_prod.f'; # default
rman 控制文件RMAN存储库与catalog做全同步的时候,需要建立一个controlfile的快照,这个参数指定快照存放位置。(PPT-II-74)

三)RMAN的命令格式:
1)交互式 (也叫stand alone方式)
RMAN> shutdown immediate;
RMAN> startup force mount;
RMAN> alter database open;
RMAN> sql 'alter system switch logfile';
RMAN> sql 'select * from scott.emp';   这里做select 没有意义,不显示结果

2)批处理方式(也叫job方式)
RMAN>run {
shutdown immediate;
startup mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/myrman/%d_%s.bak';
alter database open;
release channel c1;
release channel c2;
}

3)基于EM方式(WEB方式)
第二章:RMAN备份功能
一)backupset 备份集
1)完整备份:
①RMAN> backup database format='/u01/myrman/prod_%s.bak' filesperset 3;
②RMAN> backup database plus archivelog delete all input;
说明:备份所有数据文件及控制文件、spfile文件与所有归档日志,并删除旧的归档日志,当delete all input后,控制文件相关信息(v$archived_log)也会被更新。archivelog物理日志也被删除。

③RMAN> backup database format '/u01/myrman/%s_bak' plus archivelog delete input skip inaccessible; (不推荐使用)
说明:backup database 紧接format可以使datafile 的备份片指定到format的目的地,archivelog的备份是根据控制文件中(v$archived_log)中的内容导航的,如果控制文件中记录了而实际归档中又不存在,则会报错,skip inaccessible的含义是跳过物理上缺失的日志文件。
④RMAN> backup as compressed backupset incremental level 0 database;   0级增量备份(压缩),省略differential描述, 默认的就是差异增量备份
⑤RMAN> backup cumulative incremental level 1 database;   1级累计增量备份
因为有了全备,随时可以还原备份,还原点之前的归档日志一般没有就什么用处了,如果想单独还原归档日志备份可以使用:
restore archivelog all;
2)备份表空间:   
RMAN> backup tablespace users format '/u01/myrman/users_%s.bak' tag=userbak;
RMAN> backup tablespace system plus archivelog delete all input;   备份指定表空间及归档日志,并删除旧的归档日志
3)备份数据文件
RMAN> backup datafile 3,5 format '/u01/myrman/%d_%s.bak';   备份数据文件,可以多个,以“,”分开。
4)备份归档日志
RMAN> backup archivelog all delete input;
备份数据文件,控制文件,spfile及归档日志,然后删除所有归档原始文件
delete input和all delete input的区别:如果归档原始文件有多个路径的副本,前者仅删除备份了的归档原始文件。
5)备份控制文件
RMAN> backup current controlfile;
6)备份参数文件
RMAN> backup spfile;
7)备份闪回恢复区
RMAN> backup recovry area;   只能备份到磁带上
8)备份备份集
RMAN> backup backupset 18;   将disk上的backupset备份一份到tape上,注意不产生新的备份集,类似duplex.

二)Image(映像文件)备份
1)两种语法:
①RMAN> copy datafile 4 to '/u01/myrman/users_%s.bak';
②RMAN> backup as copy tablespace 'TEST' format '/u01/myrman/%d_test_%s.bak';   都用backup语法。统一格式

2)列出映像集
RMAN> list datafilecopy all;
RMAN可在不执行restore情况下直接使用映像副本,而backupset在recover前必须先restore。RMAN映像副本备份不包括spfile
3)删除映像集
RMAN> delete datafilecopy 1;

三)增量备份
1)概念
只备份自某次备份以来发生变化的block。(见PPT-II-117)
RMAN在备份时会记录datablock的scn,下次备份时通过比较某次备份数据块上的scn来确定该数据块是否发生变化)

2)两种增量策略:
①差异增量备份(Differential incremental backup):以某次以来同级别或低级别的备份作为基础备份
②累积增量备份(Cumulative incremental backup): 以某次以来比自己级别低的备份作为基础备份
10g以后,增量备份只有0级和1级,原来2级以上的级别可兼容,但不推荐使用。

3)注意事项
①0级增量备份不等同于全备(full backup),全备不能做为增量备份的基础备份。
②如果没有备份过0级备份,那么第一次1级备份(差异或累计)就当做0级备份。
③recover做恢复时如有增量备份,自动优先使用增量备份。
restore database;
recover database;  这一步会优先使用增量备份代替日志前滚

如果非归档情况下使用增量备份,
第二句改成recover database noredo;  意思是使用增量但不应用日志(本来就没日志)

4)块变更跟踪(block change tracking)(从10G开始引入)
1、概念:
增量备份总是小于完整备份,但是备份时节省的时间并不像想象的那样少,原因是增量备份默认的是要扫描整个要备份的数据文件块,以便确定哪些块需要提取,如果想要增量备份能快些,可以使能增量备份的块改变跟踪功能。
块改变跟踪在后台启动一个进程叫CTWR,这个进程向变更跟踪文件中记录每个已更改的块的地址。如果启用了块跟踪,增量备份时就去检查块跟踪文件,这比遍历整个数据文件块要快的多。当然缺点是数据库维护块跟踪文件会付出性能代价,所以实际工作中此特性通常不在生产库上配置,而在DATA GUARD物理备库上配置则比较合适。

2、示例:
①使能块改变跟踪
SQL> alter database enable block change tracking using file '/u01/oradata/prod/change_tracking';
②查看视图信息,确认已启动了CTWR进程, 确认生成了块改变跟踪文件。
SQL> col filename for a50;
SQL> select * from v$block_change_tracking;
③开始0级增量做为基础备份,用时36秒
RMAN> backup incremental level 0 format '/u01/myrman/%s.bak' datafile 2; 
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:36
④开始1级增量备份,用时2秒,时间已经大大缩短.
RMAN> backup incremental level 1 format '/u01/myrman/%s.bak' datafile 2;  
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
⑤关闭块改变跟踪
SQL> alter database disable block change tracking;

考点:使能块改变跟踪后,需要一个相当于incremental level 0 backup做为基础备份(打底)。

5)增量更新备份(PPT-II-168-169)
增量更新特性是以一个image copy为基础,将增量备份应用到这个image copy,在做每日的incremental level 1时, image copy是不断的累积的,好处是这个累积的image copy的scn越来越新,且使用它恢复数据库时不需要还原。

RMAN>
run {
recover copy of database with tag 'incr_update';
backup incremental level 1 for recover of copy with tag 'incr_update' datafile 4;
}

这个例子每天执行一次,结果如何?
第一天,backup命令将创建一个的相当于level 0 的image copy, 因为之前没有这个备份。
第二天,backup命令创建一个level 1的backup set。
第三天以及以后的每一天,recover copy命令将把level 1应用(叠加)到image copy,从而不断的更新它。
将database代替datafile,便可以得到一个具有增量特性的a whole backup。
根据保留策略,如果retention=1, 多余的增量level 1将成为obsolete。
最大的优势是image copy不断的累计,可以省去还原步骤,从而节省了大量恢复数据的时间。

四)数据恢复顾问
DRA(PPT-II-218-225)是一个诊断和恢复数据库的工具,通过两个途径操作,一个是RMAN界面,另一个是EM,它依赖于ADR的自动诊断信息以及Health Monitor
例:
1)先以RMAN备份一个表空间
RMAN>backup tablespace sysaux format '/u01/myrman/%d_%s.bak';
2)关闭数据库,将sysaux01.dbf 删掉,然后启动数据库报错!
SQL> shutdown abort
[oracle@prod~]$ rm sysaux01.dbf
SQL> startup
3)数据库在mount模式下连接rman,
[oracle@prod~]$ rman target /
4)看DRA列出发现的问题
RMAN> list failure;
这时可以尝试使用Change failure 命令可以改变failure的级别,(change failure nnn priority [low|high]);
5)让DRA来诊断一下问题所在
RMAN> advise failure;
6)根据报告决定让DRA修复
RMAN> repair failure;
注意:
①先list failure,然后再advise failure.次序不能错,顺序是list,advise,repair
②所有启动模式下都可以使用DRA, nomount下修复控制文件,mount或open下修复数据文件。
③DRA目前只能在单实例下运行,RAC不可以使用它。

五)Expired状态
1)备份集的状态
①AVAILABLE:可用;
②UNAVAILABLE:不可用;
③EXPIRED:过期(RMAN元数据还
AVAILABLE/UNAVAILABLE的转换使用change命令
RMAN> CHANGE BACKUPSET 1 UNAVAILABLE;
2)Expired的概念:
当备份元数据存在,但OS上物理备份片已经被删除了这时备份集的状态就是Expired。可以通过RMAN的crosscheck命令检查备份片或者image copy是否仍然存在于备份介质上。
RMAN>crosscheck backupset;
RMAN>crosscheck copy;
3)Expired的示例:
将某文件的备份在os下重命名,再使用crosscheck进行检查,然后再复原其命名,观察AVAILABLE--EXPIRED--AVAILABLE过程
4)删除expired备份
RMAN>delete expired backup;
RMAN>delete expired copy;
RMAN备份元数据有,而实际备份没有,这叫expired,也可以反过来,让备份有而元数据没有。这就引入了下面的catalog command

六)编目元数据Catalog command
1)概念:
目的是对RMAN存储库进行编目,有这样一种情形,RMAN元数据受损,只有我们手里只有备份,便可以根据备份的物理路径重新编目RMAN元数据。
这种方法可以将早期的老化的备份,重新(要有磁盘路径)注册到target controlfile中,也可以完成向一个空的RMAN存储库(重做控制文件后)通过catalog命令注册元数据。
2)常见的语法
RMAN>CATALOG BACKUPPIECE '/disk1/backups/backup_820.bak';
RMAN>CATALOG DATAFILECOPY '/disk1/old_datafiles/01_01_2003/users01.dbf';
RMAN>CATALOG ARCHIVELOG '/disk1/arch_logs/archive1_731.log', '/disk1/arch_logs/archive1_732.log';
RMAN>CATALOG START WITH '/disk1/backups/';
可以一次完成一个目录树下的所有文件的注册: 通过提供一个OS路径,RMAN自动导航找到要编目的所有备份片(包括其子目录)
3)示例
将上例删除的expired集恢复原状,即将原来的备份文件注册到控制文件中。
4)删除元数据
RMAN> change backuppiece 11 uncatalog;   11号备份片从RMAN元数据中删掉了,但物理备份xxx.bak还在。
注意:关于备份集的expired和obsolete在概念上是完全不同。
DELETE EXPIRED命令不删除任何文件,它只更新RMAN存储库(元数据), 而DELETE OBSOLETE命令将删除文件并更新存储库。

5)示例:整理v$archived_log视图
1)控制文件中记录的归档情况
SYS@ prod>select name from v$archived_log;
NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/arch/arch_1_880581688_10.log   这条想清理
/u01/arch/arch_1_880581688_12.log   这条想清理
/u01/arch/arch_1_883490264_3.log
/u01/arch/arch_1_883490264_4.log

2)物理的删除想清理的两个归档日志
[oracle@cuug ]$ rm /u01/arch/arch_1_880581688_10.log
[oracle@cuug ]$ rm /u01/arch/arch_1_880581688_12.log

3)清除v$archived_log所有信息
SYS@ prod>execute sys.dbms_backup_restore.resetCfileSection(11);   这个动作会清除控制文件中所有归档的记录
SYS@ prod>select name from v$archived_log;
no rows selected

4)使用catalog注册需要的归档
RMAN> catalog start with '/u01/arch/';

5)查证结果
SYS@ prod>select name from v$archived_log;
NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/arch/arch_1_883490264_4.log
/u01/arch/arch_1_883490264_3.log

第三章:RMAN完全恢复
一)概念
1)recover 恢复:
  ①归档 :完全恢复和不完全恢复
  ②非归档:只能恢复到最后一次备份状态(还原)
2)完全恢复:
先对数据库做一个备份(如果是archived模式就做热备)
换一种形式,我们将下面的run{}写到linux的脚本中,叫做/u01/oradata/prod/myrman.sh
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/myrman/%d_%s.bak';
release channel: c1;
release channel: c2;
}

然后以rman登录时执行这个脚本。语法如下:
$rman target / @/u01/oradata/prod/myrman.sh

另外也可以采用下面的办法
vi /home/oracle/myrman.sh
rman target / <<EOF
backup database format '/u01/myrman/%s.bak';
EOF

$sh /home/oracle/myrman.sh
可以监控RMAN备份,RMAN使用字符串rman 和通道名称填充v$session中client_info列,每个RMAN通道有一行信息, 备份结束后进程信息消失.也可以使用 set command id to 'XXX'做一个标识,再结合v$session观察通道和进程之间的对应关系。

SQL> select sid,spid,client_info from v$process p join v$session s on (p.addr=s.paddr) where client_info like 'rman%';
       SID SPID                     CLIENT_INFO
---------- ------------------------ ----------------------------------------------------------------
       113 12992                    rman channel=ORA_DISK_1
       111 12995                    rman channel=ORA_DISK_2

二)完全恢复范例
范例1:system表空间损坏,使用EM的DRA恢复
1)在线删除system01.dbf
模拟关键表空间损坏,然后启动数据库,报system01.dbf读写错误
[oracle@prod ~]$ rm /u01/oradata/prod/system01.dbf
SQL> startup froce
2)使用EM恢复...
注:如果使用run{}恢复,参考如下:
run{
startup force mount;
restore datafile 1;
recover datafile 1;
alter database open;
}                                                  

范例2:恢复表空间(数据库open状态)。

1)环境
因非关键数据文件介质损坏,需要将其表空间恢复到一个新的物理位置。
create table scott.t1(id int);
insert into scott.t1 values(1);
commit;
2)模拟users表空间损坏,删除数据文件。
[oracle@prod ~]$ rm /u01/oradata/prod/users01.dbf
3)清除db buffer ,查证访问数据文件失败
SQL> alter system flush buffer_cache;   清除后session要重新登录
SQL> alter system checkpoint;   实验中为防备rman登录不正常,可以尝试先做个检查点切换
4)建个新目录
假设介质损坏了,更换需要时间,先把数据文件恢复到一个新的目录下(不同的物理位置)
[oracle@prod ~]$ mkdir /u01/oradata/prod/dir1
5)使用RMAN恢复表空间
RMAN>run{
sql 'alter database datafile 4 offline';
set newname for datafile 4 to '/u01/oradata/prod/dir1/users01.dbf';
restore tablespace users;
switch datafile 4;
recover tablespace users;
sql 'alter database datafile 4 online';
}
说明:
①set newname for 告诉RMAN还原数据文件的新位置在哪里。这个命令在restore前出现。
②switch datafile 更新controlfile,让控制文件使用这个新位置恢复数据。这个命令要在recover前出现。
5)验证
SQL> select * from scott.t1;
        ID
----------
         1
6)待介质更换完成后,可以将表空间迁移回原来位置。
SQL> alter tablespace users offline;
[oracle@prod~]mv /u01/oradata/prod/dir1/users01.dbf /u01/oradata/prod
SQL> alter tablespace users rename datafile '/u01/oradata/prod/dir1/users01.dbf' to '/u01/oradata/prod/users01.dbf';
更新控制文件和数据字典
SQL> alter tablespace users online;   有时候需要recover datafile 4一下
7)再验证
SQL> select * from scott.t1;

范例3:新建表空间(rman备份没有这个表空间),datafile被破坏
1)环境
SQL> create tablespace abcd datafile '/u01/oradata/prod/abcd01.dbf' size 5m;
SQL> create table scott.t2(id int) tablespace abcd;
SQL> insert into scott.t2 values (1);
SQL> commit;
SQL> select * from scott.t2;
        ID
----------
         1
2)删除t2表所在的数据文件
[oracle@prod ~]$rm /u01/oradata/prod/abcd01.dbf
3)清除db buffer,查证访问数据文件失败。
SQL> alter system flush buffer_cache;
4)利用rman 恢复数据文件
注意:rman备份里没有abcd01.dbf
RMAN>run {
sql 'alter database datafile 7 offline';
restore datafile 7;
recover datafile 7;
sql 'alter database datafile 7 online';
}
5)验证
SQL> select * from scott.t2;
        ID
----------
         1
SQL> drop tablespace abcd including contents and datafiles;   为了使数据库和RMAN备份一致

范例4:块介质恢复(BMR)(PPT-II-229-236)

1)概念
如果数据文件只是出现部分数据块损坏,RMAN可以尝试针对坏块进行恢复,就是说不需要恢复整个数据文件,只恢复损坏的数据块。
为了保证数据文件的一致性,块介质恢复是一个完全恢复。
介质损坏,Block format incorrect,checksum无效
逻辑损坏,Oracle internal error,checksum有效
2)检测坏块的方法:
①ANALYZE operations
②dbv
③SQL queries that access the potentially corrupt block
④DBMS_REPAIR
⑤RMAN
3)通过设置参数,当对块读写时进行检查
DB_BLOCK_CHECKSUM   检查disk I/O讹误,缺省TYPICAL。
DB_BLOCK_CHECKING   防止memory和data讹误,缺省FALSE。
DB_LOST_WRITE_PROTECT   lost write 与standy database的延迟永久写有关,缺省TYPICAL。

11g新出了一个参数,顶替了上面三个参数,它就是DB_ULTRA_SAFE(考点)。
该参数可选项:OFF(缺省)|DATA_ONLY|DATA_AND_INDEX

OFF表示,DB_ULTRA_SAFE不起作用了,仍然沿用上面三个参数值的具体指定。
RMAN在BACKUP时,可以监测到损坏的数据块,并且自动将坏块记录V$database_block_corruption中。

如果是某个查询会话击中了坏块,可能会有下面的报错:
ORA-01578: ORACLE DATA BLOCK CURRPTED(FILE #5
赞(0) 打赏
未经允许不得转载:徐万新之路 » Oracle 11g备份与恢复

评论 抢沙发

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫

微信扫一扫

登录

找回密码

注册