Oracle11g备份与恢复
第一部分:手工备份与恢复
第一章:备份恢复概述
一)数据库故障类型:
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,BLOCK #21)
对应的rman恢复命令应该是:
RMAN>blockrecover device type disk datafile 5 block 21;
4)11g新特性增加recover corruption list命令
它和backup validate database配合使用,为的是简化数据文件坏块恢复。
例:
RMAN>BACKUP VALIDATE DATABASE;
RMAN>RECOVER CORRUPTION LIST;
BACKUP VALIDATE DATABAE 不生成备份集,它只是检查坏块,并确认所有数据文件在正确的位置上, 这条命令会在v$backup_corruption和v$database_block_corruption视图中填充检测到的所有讹误数据块。
测试:
SYS@ prod>create tablespace test datafile '/u01/oradata/prod/test01.dbf' size 1m;
SYS@ prod>create table scott.emp1 tablespace test as select * from scott.emp;
SYS@ prod>select * from scott.emp1;
vi -b test01.dbf
:%!xxd
/17000
靠后修改
:%lxxd -r
:wq!
select * from scott.emp1;
*
ERROR at line 1:
ORA-01578: ORACLE 数据块损坏 (文件号 9, 块号 11) ORA-01110:
数据文件 9: '/u01/oradata/prod/test01.dbf'
SYS@ prod>select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
9 11 1 0 CHECKSUM
RMAN> RECOVER CORRUPTION LIST;(或者recover datafile 9 block 11;)
select * from scott.emp1; 成功恢复
例:RMAN> RECOVER CORRUPTION LIST UNITL TIME SYSDATE - 7;
注意:RMAN的块恢复是完全恢复,这里的UNTIL表示的是要使用一周前的备份做还原,它不代表不完全恢复。
5)其他相关知识点:
①BMR是RMAN的一个功能,它是针对物理损坏的block进行的完全恢复,要求数据库是ARCHIVELOG模式。
②RMAN是块级备份,备份时自动检测坏块,缺省下碰到坏块就会中断备份,除非set maxcorrupt
③做BMR有两点前提:一个是数据库要在mount或open下, 另一个是要有坏块所在的数据文件incremental level 0备份。
④闪回日志也可以帮助恢复坏块。
SQL> desc V$DATABASE_BLOCK_CORRUPTION;
RMAN> recover corruption list命令修复的是CORRUPTION_TYPE列记录了MEDIA_CORRUPT的物理坏块。
范例5:归档备份
1)概念:
在Oracle 11g中,可以使用backup … keep命令保留比RMAN备份保留策略所指定的时间更长的备份。它可以构造能保留数年的备份(不被obsolete),归档备份之所能使备份长久保存,关键是使用keep选项覆盖掉了RMAN中缺省的保留策略。(PPT-II-127)
2)语法:
BACKUP ... KEEP {FOREVER|UNTIL TIME 'date_expt'} [RESOTRE POINT rename];
说明:
KEEP FOREVER 永不过期(需要catalog)在Oracle 11g中
KEEP UNTIL TIME 后跟一个时间长度,如表示一年:'sysdate+365'
RESOTRE POINT 的作用记录这次备份的唯一性, rename表示的scn已被记录下来,rename不能重名。
3)示例:
RMAN>
backup datafile 4 format '/u01/myrman/%s_%t.bak'
keep until time 'sysdate+30'
restore point prodbak1;
可以查看RESOTRE POINT rename和scn的对应关系。
RMAN> list restore point all;
SCN RSP 时间 类型 时间 名称
---------------- ------------------- ---------- ------------------- ----
13400758 2014-03-13 10:10:18 prodBAK
注意:
①归档备份不受retention策略影响,也不会由delete obsolete命令自动删除掉。
②归档备份是包含一切的备份,共四种类型:数据文件备份,spfile备份,control备份和归档日志备份。
范例6,使用image copy快速恢复数据文件(不需要restore)(PPT-II-170)
RMAN> backup as copy datafile 4 format '/u01/myrman/%s.bak';
SQL> select file#,name from v$datafile; 看一下控制文件中datafile 4 标识的物理路径
[oracle@prod~]$ rm /u01/oradata/prod/users01.dbf
RMAN> sql 'alter database datafile 4 offline';
RMAN> switch datafile 4 to copy; switch命令更改了控制文件相关信息并触发resync catalog。
RMAN> recover datafile 4;
RMAN> sql 'alter database datafile 4 online';
如果还想恢复原状可以再使用SQL*PLUS
SQL>alter tablespace users offline;
[oracle@prod~]$ mv /u01/myrman/34.dbf /u01/oradata/prod/users01.dbf
SQL>alter tablespace users rename datafile '/u01/myrman/34.dbf' to '/u01/oradata/prod/users01.dbf';
SQL>alter tablespace users online;
第四章:RMAN不完全恢复
一)概念:
RMAN不完全恢复的三个标准模式:基于time、基于scn和基于sequence:
与手工不完全恢复相比原理类似,语法稍有不同:
二)不完全恢复范例
范例1:不完全恢复用于最小化测试备份。
1)备份一部分数据文件
RMAN> backup datafile 1,2 format '/u01/myrman/%s.bak';
SQL> create table scott.t1 as select * from scott.emp;
2)切换日志
SQL> alter system switch logfile;
3)备份其余数据文件
RMAN> backup datafile 3,4,5 format ‘/u01/myrman/%s.bak’;
RMAN> list backup;
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
4 Full 974.27M DISK 00:00:20 2017-01-15 13:34:26
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
1 Full 1099734 2017-01-15 13:34:06 /u01/oradata/prod/system01.dbf
2 Full 1099734 2017-01-15 13:34:06 /u01/oradata/prod/sysaux01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
6 Full 170.72M DISK 00:00:04 2017-01-15 13:35:45 ---- -- ---- ---------- ------------------- ----
3 Full 1099866 2017-01-15 13:35:41 /u01/oradata/prod/undotbs01.dbf
4 Full 1099866 2017-01-15 13:35:41 /u01/oradata/prod/users01.dbf
5 Full 1099866 2017-01-15 13:35:41 /u01/oradata/prod/example01.dbf
2)切换日志
SQL> alter system switch logfile; 这步一定要做一下
SQL> create table scott.t2 as select * from scott.emp;
3)干净的关闭数据库,删除所有数据文件
SYS@ prod>shutdown immediate; 发生完全检查点,更新控制文件和数据文件头的SCN
[oracle@bjcuug ~]$ rm *.dbf
4)RMAN按时间点做不完全恢复
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099996
2 1099996
3 1099996
4 1099996
5 1099966
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099734 最小化测试需要前滚到1099866
2 1099734 最小化测试需要前滚到1099866
3 1099866
4 1099866
5 1099866
RMAN> recover database until scn 1099866; 此scn是所有数据文件恢复后的最小打开数据库的scn
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099996
2 1099996
3 1099996
4 1099996
5 1099966
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099866
2 1099866
3 1099866
4 1099866
5 1099866
RMAN> alter database open resetlogs;
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099900
2 1099900
3 1099900
4 1099900
5 1099900
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1099900
2 1099900
3 1099900
4 1099900
5 1099900
5)验证
SQL> select * from scott.t1; 有此文件
SQL> select * from scott.t2; 无此文件
范例2:假定参数文件,控制文件,数据文件以及在线日志全部损毁了,有备份(热备)和归档,如何恢复数据库。
1)环境
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
4 USERS YES NO YES
6 EXAMPLE YES NO YES
8 TEST YES NO YES
3 TEMP NO NO YES
2 UNDOTBS1 YES NO YES
SQL> select owner,table_name,tablespace_name from dba_tables where table_name='T1';
OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SCOTT T1 USERS
SQL> select * from scott.t1;
ID
----------
1
2)关闭数据库,然后删除参数文件、数据文件、控制文件、在线日志
SQL> shutdown abort
[oracle@cuug ~]$] cd /u01/oracle/dbs
[oracle@prod dbs]$ rm spfileprod.ora
[oracle@prod dbs]$ rm initprod.ora
[oracle@prod dbs]$ cd /u01/oradata/prod
[oracle@prod]$ rm * 删除数据库(包括datafile,ctl,log)
3)RMAN恢复参数文件
[oracle@prod ~]$ rman target /
connected to target database (not started)
RMAN> startup nomount; 没有了参数文件,SQL*PLUS是无法启动实例的,但RMAN可以,所以startup nomount一定要在RMAN下做!!!
RMAN> restore spfile from '/u01/flash_recovery_area/prod/autobackup/2013_01_16/o1_mf_s_932826360_d76c7r4y_.bkp';
查看在dbs/目录下已经产生spfileprod.ora文件。证明spfile 恢复好了。
RMAN> startup force nomount 使用恢复的spfile启动
4)RMAN 恢复控制文件
RMAN> restore controlfile from '/u01/flash_recovery_area/prod/autobackup/2013_01_16/o1_mf_s_932826360_d76c7r4y_.bkp';
RMAN> alter database mount; 加载恢复的控制文件
RMAN> list backup; 可以看到RMAN的元数据了
5)还原所有的数据文件
RMAN> restore database;
6)运用日志做恢复
RMAN> recover database; 尝试恢复,使用尽量多的归档恢复。
7)打开数据库
RMAN> alter database open resetlogs; 当前日志缺失,又使用备份的控制文件,所以是不完全恢复的形式打开数据库。
SYS@ prod>select * from scott.t1;
select * from scott.t1
*
ERROR at line 1:
ORA-00942: 表或视图不存在 当前日志缺失,丢失数据。
范例3:
RMAN恢复误删除表空间 必须通过备份的控制文件(即含有删除的表空间结构的老控制文件)进行恢复。
本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。
注: Oracle11gR2版可以支持数据库处于open方式下,以TSPITR方式恢复误删除的表空间(见范例4),此技术较新,稳定性还有待提高。
1)打开告警日志
查看drop tablespace的告警信息,记下时间点
[oracle@prod~]$ tail -f /u01/diag/rdbms/prod/prod/trace/alert_prod.log
2)删除test表空间
SQL> drop tablespace test including contents and datafiles;
3)查看告警有关信息:
Fri Feb 17 20:41:05 2017 这是删除表空间的完成时间,后面取时间要比它提前一点(考虑提前1分钟)
drop tablespace test including contents and datafiles
Deleted file /u01/oradata/prod/test01.dbf
Completed: drop tablespace test including contents and datafiles
4)删除所有控制文件和数据文件
SQL> shutdown abort
[oracle@prod~]$ rm *.ctl
[oracle@prod~]$ rm *.dbf
5)准备对drop tablespace test做不完全恢复
RMAN>run{
startup force nomount;
set dbid=3416564781;
restore controlfile from autobackup until time '2013-01-16 19:39:56';
alter database mount;
restore database;
recover database until time '2013-01-16 19:39:56';
alter database open resetlogs;
}
6)验证:
SQL> select * from scott.t1;
ID
----------
1
要点:
①不能使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了。
②DBID是RMAN识别数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;
范例4 表空间时间点恢复(TableSpace Point In Time Recovery)
作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动。TSPITR是一种对个别表空间执行不完全恢复的技术,一般是针对用户错误的删除(或截断)了表。TSPITR的最大好处是不需要生产库停机。
前提是:
①有一套全库备份,因为TSPITR这个过程除了复制需要恢复的表空间外,也必须复制system,sysaux和undo表空间(考点)
②本例设置了控制文件自动备份:RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
步骤:
1)建表空间
SQL> create tablespace abcd datafile '/u01/oradata/prod/abcd01.dbf' size 5m;
2)建一个测试表
create table scott.t4(c1 date) tablespace abcd;
insert into scott.t4 values(sysdate);
commit;
3)RMAN备份表空间
RMAN>backup tablespace abcd format '/u01/myrman/abcd_%s.bak';
4)取当前时间
SQL>select sysdate from dual;
SYSDATE
-------------------
2013-01-16 22:02:14
5)误删除表空间
SQL>drop tablespace abcd including contents and datafiles
6)建立目录指定辅助库目标
$mkdir -p /u01/oradata/prod/auxdata
7)做RMAN TSPITR 并指定辅助库目的地
[oracle@prod ~]$ rman target /
RMAN> recover tablespace abcd until time '2013-01-16 22:02:14' auxiliary destination '/u01/oradata/prod/auxdata';
执行过程值得一读,但太长了,略了。
8)验证
SQL> alter tablespace abcd online;
SQL> select * from scott.t4;
C1
-------------------
2013-01-16 21:58:11
相关知识点:
1)TSPITR是保持在线业务下表空间级的不完全恢复,恢复的表空间要自包含。使用TS_PITR_CHECK视图查看自包含信息。
2)TSPITR一般用于将已有的表空间恢复到过去的某个时间点,而11gR2版使用可传输表空间和数据泵技术,Oracle声明可以恢复被删除的表空间。(PPT-II-563)
第五章:目录库Catalog Database
一)目录库的必要性
目录库即catalog database。我们知道RMAN的存储库(元数据)保存在目标库的控制文件里
1)目录库的理由
①目标库上的控制文件损坏,造成该目标库上RMAN元数据丢失。尽管你做了数据备份,但如果没有autobackup,RMAN就很难找到那些备份集了。
②RMAN元数据受控制文件参数control_file_record_keep_time限制,缺省是7天,超时可能被覆盖,即造成老化的元数据丢失。
对此,我们可以在另一台服务器上建立一个Catalog Database
2)创建目录库的好处
①它不受control_file_record_keep_time参数的限制,理论上可以无限期的保存目标库的rman元数据。当target库上的RMAN元数据受损后,可以根据Catalog库里的元数据恢复target 库的数据。
②使用一个catalog目录库就可以管理许多目标库,所谓集中管理多个目标库,这些目标库可以是不同平台,不同版本。
③可以保存RMAN备份恢复脚本,即catalog script 使RMAN的备份与恢复更加灵活,自动化。
二)创建目录库示例
catalog目录库在生产环境中一定要建在一台独立的Oracle server上, 不要建在同一台目标机上。
示例:
catalog database基于win-oracle-orcl
target database 基于linux-oracle-prod
1)创建Catalog所用表空间
SQL> create tablespace rman_ts datafile 'E:\rman.dbf' size 50m;
2)创建RMAN用户并授权
SQL> create user rman identified by rman default tablespace rman_ts;
SQL> grant resource,recovery_catalog_owner to rman;
SQL> exit
3)从RMAN客户端连接catalog库
C:>rman catalog rman/rman@orcl
连接到恢复目录数据库
4)创建catalog目录(建了一大堆表)
RMAN>create catalog
恢复目录已创建
这一步Oracle到底做了些什么?你可以使用rman用户登录catalog查看user_objects视图,比较显示结果。
Win7下sqlplus rman/rman
SQL> select object_name,object_type from user_objects;
5)连接target database(prod)
RMAN> connect target sys/oracle@prod;
6)注册目标库,(登记你连接上的那个target,把target上控制文件中的rman信息同步到catalog里)
RMAN>register database;
注册在恢复目录中的数据库
正在启动全部恢复目录的resync
完成全部resync
一般而言,每次连接target和catalog时target库的控制文件都会自动刷新到Catalog库。但如果target库结构有改变,
或在备份期间有大量online日志归档,Catalog这边可能没有自动更新,必要时做一下手动同步。这种同步是整体的刷新,也叫full resync.
RMAN> RESYNC CATALOG;
三)目录库的连接方法
第一种,连接catalog同时连接一个target
C:\>rman catalog rman/rman@orcl target sys/oracle@prod
第二种,先进入RMAN,再分别connect target和catalog
C:\>rman>
RMAN> connect catalog rman/rman@orcl
RMAN> connect target sys/system@prod
第三种,先进入catalog,然后再使用connect target命令连接target
现在有两个target,一个是prod(linux), 另一个是orcl(xp) 开两个cmd窗口,每个窗口连一个target
1)使用rman连接到catalog库
C:\>rman catalog rman/rman@orcl
连接到恢复目录数据库
2)连接到一个target库
RMAN> connect target sys/system@prod
连接到目标数据库: prod11 (DBID=3439065160)
3)开另一个CMD窗口
C:\>rman catalog rman/rman@orcl
连接到恢复目录数据库
RMAN> connect target sys/system@orcl;
4)查看注册的target
C:\>sqlplus rman/rman@orcl
SQL> select * from rc_database;
四)目录库的存储脚本
1)什么是catalog 脚本
rman run{} 脚本可以作为操作系统文件来存储,比如:将下面的两个命令保存到一个名为prod.rcv文件中
run{
delete noprompt obsolete;
backup database plus archivelog delete all input;
}
在OS下调用该脚本,执行后又返回OS。
$rman target / catalog rman/rman@orcl @prod.rcv
但是如果有catalog目录的话,可以在rman catalog里可以对以上的run{}建立存储脚本并执行它。
脚本分为global和local两种:
global script: 所有target都可以共享
local script:只有连接的target使用
有关脚本的命令有:
create [global] script
replace [global] script
print [global] script
list [global] script names
exectue [global] script
delete [global] script
2)导入catalog database (PPT-II-83)
可能有多个catalog的环境, 一些catalog针对来自不同Oracle版本的target,可以使用IMPORT CATALOG将这些目录合并为一个目录。默认时,
源catalog中注册的所有target的元数据导入到目标catalog, 也可以指定想要导入到目标catalog的target,而且默认的RMAN不注册从源
catalog导入的target,可以通过NO UNREGISTER子句添加到IMPORT CATALOG命令使这些target自动注册。
3)示例:
使用IMPORT CATALOG命令合并两个catalog(将10g版本的catalog合并到11g版本catalog)
第一步,连接到目标恢复目录,(11g版本)
RMAN> connect catalog rman/rman@rman11
第二步,发布import catalog命令,将源catalog(10g)与目标catalog(11g)连接,并将所有源catalog上的target database导入目标catalog
RMAN> import catalog rman1/rman1@rman10
也可以指定要导入的target database
RMAN> import catalog rman1/rman1@rman10 dbid=123456,1234557;
相关知识点
1)创建catalog目录的版本必须高于或等于任何目标库的数据库版本,因此可以创建单个版本为11.1.0.6的目录加补丁集6。
2)使用create script建立本地脚本,它只让你连接单个目标库,使用create global script命令创建全局存储脚本,它适用于所有目标库,
但不能同时对多个目标库执行命令。 本地脚本和全局脚本都保存在RMAN catalog里。
3)迁移过来的global script如果有重名出现,RMAN会重命名它们。
4)使用exectue去执行脚本,它必须包含在RUN{}。
5)如果需要使用catalog库恢复target库的spfile或controlfile时,需要set dbid=xxx语句让catalog库识别target库。
五)虚拟专用目录
1)概念
一个catalog可以注册你单位的所有数据库的详细信息,当target服务器比较多,如果让某个DBA只能查看CATALOG中某些元数据,那么可以
利用Oracle11提供的虚拟专用目录 (virtual private catalog),你可以通过只授予CATALOG目录中某个元数据子集的访问权,严格限制某个
DBA对CATALOG目录的访问。(PPT-II-84-86)
与虚拟专用目录(virtual private catalog)概念相关的是基恢复目录( base recovery catalog)。使用虚拟专用目录的前提是必须有基目录。
这两种类型的目录差别只是虚拟专用目录只能访问他们有访问权限的那些数据库,而基目录拥有者可以访问所有注册的数据库。
2)建立虚拟目录的步骤:
例如:基目录(base catalog)下有数据库:PROD1, PROD2, PROD3。用户CATOWNER有基目录权限,可以操作这个三个target,现在希望让一个下属VPC1仅仅管理PROD1,如何建立虚拟目录(virtual catalog)
第一步:为VPC1用户授权
SQL> GRANT recovery_catalog_owner TO vpc1;
第二步:CATOWNER用户登录catalog server
RMAN> CONNECT CATALOG catowner/password@catdb;
第三步:为VPC1指定PROD1的管理权限
RMAN> GRANT CATALOG FOR DATABASE prod1 TO vpc1;
第四步:退出 CATOWNER连接
第五步:VPC1用户登录catalog server
RMAN> CONNECT CATALOG vpc1/password@catdb;
第六步:VPC1用户建立 virtual catalog
RMAN> CREATE VIRTUAL CATALOG;
第七步:连接目标库prod1,就看到metadata.
RMAN> CONNECT target sys/oracle@prod1
第六章:复制库 Duplicate Database
一)概念
1)名词定义
Source Database (或source host)源数据库
Duplicate Database (或new host)新复制的数据库
Catalog Database (或catalog host) 目录库
2)RMAN Duplicate用途:
①用于测试的Database
就是source host的一个copy, RMAN通过不完全恢复复制出来一个new host,如果source和new host都在一个平台上,文件路径命名不能相同,如果是两个平台(不支持异构),文件路径命名可同也可不同。 无论如何new host有唯一的DBID。
②Standby用途Database
典型的就是Data Guard, Standby Database的主要功能是可以提供Failover, 所以Primary database会将log输送到Standy Database.使其不断更新数据。
3)RMAN Duplicate模式:
①Active Database Duplication
基于RMAN网络的,从源数据库通过网络(不使用RMAN备份)直接创建辅助库。
②Backup-Based Duplication
基于RMAN备份的,利用RMAN备份创建辅助库
二)基本框架
一般步骤:
1)将辅助库上安装数据库软件,建立Oracle Home
2)为辅助库建立口令文件, Active方式下与源数据库口令相同。
3)确保到辅助实例的网络连通性 (建立静态监听)
4)为辅助实例创建参数文件
5)以nomount方式启动辅助实例 (启动静态监听)
6)生产数据库处于mount或open模式下
7)创建备份或将备份和归档日志文件复制到辅助库实例可以访问的某个位置,除非正在使用活动(active)数据库复制
8)如果有必要分配辅助通道(可选项)
9)运行rman duplicate命令
10)使用resetlogs打开辅助数据库 体现了duplicate是个不完全恢复,因为current log没有办法通过RMAN备份。
例1, Duplicating to a Host with the Same Directory Structure (Active)
DUPLICATE TARGET DATABASE TO dupdb
FROM ACTIVE DATABASE
PASSWORD FILE
SPFILE
NOFILENAMECHECK;
解析:
基于网络的复制数据库,此例是Active方式,source host和target host需要同样的一个PASSWORD FILE,SPFILE是复制
过去的(没有任何参数修改)。两个节点有着相同的目录结构及文件命名。NOFILENAMECHECK的意思是不检查文件是否重名,
因为source host和duplicate host 不是同一个平台。
例2, Duplicating a Database Without a Target and Recovery Catalog Connection (Backup-Based)
DUPLICATE DATABASE TO dupdb
UNTIL TIME "TO_DATE('11/01/2007 14:00:00', 'MM/DD/YYYY HH24:MI:SS')"
SPFILE
BACKUP LOCATION '/prod_backups'
NOFILENAMECHECK;
解析:
基于备份的复制数据库,此例RMAN只连接了duplicate host(dupdb), source host的备份已经放在duplicate host能找的到的/prod_backups目录下。
例3, Duplicating a Standby Database to a Host with the Different Directory Structure (Active)
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
PASSWORD FILE
SPFILE
PARAMETER_VALUE_CONVERT '/disk1', '/disk2'
SET DB_UNIQUE_NAME 'dup1'
SET DB_FILE_NAME_CONVERT '/disk1','/disk2'
SET LOG_FILE_NAME_CONVERT '/disk1','/disk2'
SET SGA_MAX_SIZE 200M
SET SGA_TARGET 125M;
解析:
基于网络的复制Standby数据库, RMAN并不是简单复制source host的spfile到duplicate host,它通过spfile子句做了一些参数指定及修改,duplicate host这边必须指定一个新的DB_UNIQUE_NAME以区别source host(因为它们的db_name是相同的),duplicate host使用新的spfile启动实例,然后通过网络(active方式)复制source host所有的datafile,archivelog到duplicate host的新的路径下。
考点:
1)duplicate目前还不支持跨平台的复制,如windows--linux就是两个平台。(windows32位和64位算是一个平台)。
2)必须保证RMAN的备份能使new host访问到(非active方式)。
3)Active模式要保证source host和duplicate host两端有同样的sys口令文件.
4)如果是复制test database,Oracle依靠不同的DBID区别source host和duplicate host。
如果是复制standby database,Oracle依靠db_unqiue_name区分 primary host和standby host。
5)基于backup的duplicate是由auxiliary channel工作,而基于active的duplicate是由target channel工作。
6)初始化参数DB_FILE_NAME_CONVERT指定数据文件和临时文件的映射名称。
初始化参数LOG_FILE_NAME_CONVERT指定联机重做日志文件的映射名称。
7)也可以通过duplicate database中的spfile子句指定上面两个参数。
8)duplicate是一个不完全恢复,因为rman不备份联机redo logfile(无法恢复当前日志)。
三)范例
RMAN通过网络(active方式)在新节点上复制用于测试的数据库。
新节点要求如下:
数据库名同source database
实例名同source database
数据库(控制文件,在线日志,数据文件)目录:同source database
审计、参数文件、口令文件命名遵循oracle规范
不同的DBID
一)名词定义:
source database------->duplicate database duplicate端只安装了Oracle软件,没有创建数据库。
db_name---->prod source端的数据库名
instance_name---->prod source端的实例名
二)准备工作(duplicate 端)
1) 建立pfile哑参文件
[oracle@prod dbs]$ more dummy.ora
db_name='aaa'
2)建立或复制一个和source端远程口令文件。
[oracle@prod dbs]$ scp 192.168.3.88:/u01/oracle/dbs/orapwprod ./
[oracle@prod dbs]$ ll
总计 9548
-rw-rw-r-- 1 oracle oinstall 17 05-31 21:21 dummy.ora
-rw-r----- 1 oracle oinstall 1536 05-31 22:10 orapwprod
三)检查duplicate数据库需要的几个空目录:
1)/u01/admin/prod/adump子目录已存在(审计参数audit_file_dest指定的)
2)/u01/flash_recovery_area已存在
3)/u01/arch指定的归档目录已存在
4)/u01/oracle/dbs下的两个文件要建立
一个是静态参数文件(哑参)-----dummy.ora
一个是source database 的远程口令文件副本---orapwprod
5)/u01/oradata/prod数据库目录已存
四)source端和duplicate端之间的oracle net
网络复制是通过source端和duplicate端之间的oracle net, 必须保证两端的监听都能启动,duplicate端用的是静态监听,source端使用静态/动态两可。
下面是duplicate 端的静态监听配置文件
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.99)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME= prod)
(ORACLE_HOME = /u01/oracle)
(SID_NAME = prod)
)
)
下面source和duplicate两端的tnsnames.ora, 两端都必须配置,两端内容相同即可。
[oracle@prod dbs]$ more /u01/oracle/network/admin/tnsnames.ora
vbox88 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = prod)
)
)
vbox99 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.99)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = prod)
)
)
五)开始复制
1)先将两端监听都启动,source端数据库在open下, duplicate端还没有数据库呢,所以是未启动状态。
2)检查source和duplicate之间的Oracle net连通性。
99端:
[oracle@prod ~]$ tnsping vbox88 单向仅仅验证OracleNet
[oracle@prod ~]$ sqlplus sys/oracle@vbox88 as sysdba 连同88端口令文件一起验证
88端:
[oracle@prod ~]$ tnsping vbox99
[oracle@prod ~]$ sqlplus sys/oracle@vbox99 as sysdba 连同99端口令文件一起验证
3) duplicate端使用dummy参数文件启动实例到nomount状态
SQL> startup pfile=/u01/oracle/dbs/dummy.ora nomount
4)在duplicate端使用rman同时连接 source和duplicate(两端都使用远程连接方式)
[oracle@prod dbs]$ rman target sys/oracle@vbox88 auxiliary sys/oracle@vbox99
connected to target database: PROD (DBID=292420020)
connected to auxiliary database: AAA (not mounted)
5)开始RMAN通过网络复制数据库
RMAN> duplicate target database to prod from active database spfile nofilenamecheck;
上例复制的newhost和source的dbid是不同的,但它们有相同的db_name和数据库文件路径.
练习;
1)保留prod库
2)再复制一个新库auxprod,且路径做相应命名。
参考提示:
DUPLICATE TARGET DATABASE
TO auxprod
FROM ACTIVE DATABASE
SPFILE
SET DB_NAME 'auxprod'
SET LOG_ARCHIVE_DEST_1='location=/u01/arch1'
SET CONTROL_FILES=
'/u01/oradata/auxprod/control01.ctl',
'/u01/oradata/auxprod/control02.ctl',
'/u01/oradata/auxprod/control03.ctl'
SET AUDIT_FILE_DEST='/u01/admin/auxprod/adump'
SET DB_FILE_NAME_CONVERT '/u01/oradata/prod','/u01/orada,'
SET LOG_FILE_NAME_CONVERT '/u01/oradata/prod','/u01/oradata/auxprod'
NOFILENAMECHECK;
第七章:关于RMAN备份策略的考虑
一)备份效率的考虑
提高备份效率,即提高RMAN性能和吞吐量,相关的参数有并行通道数,输入数据文件数,备份集大小,备份片大小等。
并行的数目决定了开启通道的个数,当然也可以在RUN{}中指定通道来决定备份与恢复的并行程度。如果在RUN{}中指定了通道配置,将覆盖掉配置参数中指定的默认并行度。
通常一个通道对应一个备份集。
参数影响可有全局和局部两个层次,基本上分为:
PARALLELISM: 保存在RMAN存储库。
CONFIGURE CHANNEL: 更新配置,保存在RMAN存储库。如:
RMAN> CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/u01/myrman/%U.bak';
ALLOCATE CHANNEL: 限于run{},不保存。
BACKUP: 限于本次backup语句,不保存。
1)在RUN{}里分配通道,可以指定备份的数据文件和通道对应关系。
例1:
RMAN> RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE disk;
ALLOCATE CHANNEL c2 DEVICE TYPE disk;
ALLOCATE CHANNEL c3 DEVICE TYPE disk;
BACKUP
INCREMENTAL LEVEL = 0
FORMAT '/disk1/backup/df_%d_%s_%p.bak'
(DATAFILE 1,4,5 CHANNEL c1)
(DATAFILE 2,3,9 CHANNEL c2)
(DATAFILE 6,7,8 CHANNEL c3);
ALTER SYSTEM ARCHIVE LOG CURRENT;
}
2)使用FILESPERSET参数限制备份集中的输入文件数,指定每个备份集中一次可以包含输入文件最大数,该参数默认值为64。
例2中约定每个备份集中备份8个文件。如果数据库有20个文件,那将只生成3个备份集(不算ctl备份集),得到3个备份片,虽然开了4个通道,但并行度是3,有1个通道闲置。
例2:
RMAN> RUN{
2> ALLOCATE CHANNEL t1 DEVICE TYPE sbt;
3> ALLOCATE CHANNEL t2 DEVICE TYPE sbt;
4> ALLOCATE CHANNEL t3 DEVICE TYPE sbt;
5> ALLOCATE CHANNEL t4 DEVICE TYPE sbt;
6> BACKUP DATABASE FILESPERSET 8;
}
例2中假如取消ALLOCATE CHANNEL语句,则通道数按全局变量PARALLELISM指定,假定为1,有20个文件,FILESPERSET=8该是怎样的结果:
一个通道干活,8个文件组成一个备份集,每备份集对一个备份片,完成一个备份集再接下一个备份集。串行的跑三趟。
3)使用MAXPIECESIZE参数限制备份片大小
例3:
RMAN>RUN{
ALLOCATE CHANNEL c1 DEVICE TYPE DISK MAXPIECESIZE 250M;
BACKUP datafile 2 format '/u01/myrman/%U.bak';
release channel c1;
}
限定了最大备份片为250M,如果输出文件是450M(注意不是限制输入文件),则会在一个备份集中生成两个备份片。
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK clear; 删除此变量
4)使用maxsetsize参数限制备份集大小:
例4:
RMAN> backup database maxsetsize 800m format '/u01/myrman/%U.bak';
结果如何,一个通道产生了多个备份集,每个备份集对一个备份片。
注意:作为基本原则,一个备份集只能占一个通道,一个输入数据文件不能分成多个备份集,所以这里必须满足:最大输入文件size<maxsetsize.
5)使用SECTION SIZE子句设置多段备份(multisection backup)
通常一个数据文件只能占用一个通道,如何使单一数据文件也能并行备份呢?
对于某个较大的datafile,为提高备份效率,可以考虑采用多道关键字SECTION SIZE,并行化这个大文件的备份。
使用SECTION SIZE子句设置多段备份(multisection backup)
例5中的数据文件约400M,被分成若干file section来备份, 它启动了三个通道,每个通道备份300M的file section,但三个通道产生一个备份集,包含三个压缩后的备份片。
例5:
RMAN> RUN{
ALLOCATE CHANNEL d1 DEVICE TYPE disk;
ALLOCATE CHANNEL d2 DEVICE TYPE disk;
ALLOCATE CHANNEL d3 DEVICE TYPE disk;
BACKUP DATAFILE 2 SECTION SIZE 200M format '/u01/myrman/%U.bak';
}
注意: SECTION SIZE隐含限定maxpiecesize,当maxpiecesize全局生效时不能使用SECTION SIZE。(考点)
所以,要使用SECTION SIZE,maxpiecesize只能在allocate channel中说明。
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK clear;
二)RMAN 常用命令一览
1、list 命令一览
1)RMAN> list backup;
2)RMAN> list backup of tablespace users;
3)RMAN> list backup of datafile 2;
4)RMAN> list backup of controlfile;
5)RMAN> list backup of archivelog all;
6)RMAN> list backup of archivelog until time ='sysdate -1';
7)RMAN> list backupset 56;
8)RMAN> list copy; ( 包括归档日志)
9)RMAN> list datafilecopy all;
10)RMAN> list copy of tablespace users;
11)RMAN> list copy of datafile 1;
12)RMAN> list datafilecopy 67;
13)RMAN> list copy of controlfile;
14)RMAN> list expired backup;
15)RMAN> list archivelog all;
2、report 报告命令一览
RMAN> REPORT schema; 查看目标库的物理结构
RMAN> REPORT schema at time|scn|sequence; at子句必须在catalog里使用
RMAN> REPORT need backup; 根据当前备份保留策略,列出哪些数据文件需要备份。
RMAN> REPORT NEED BACKUP DAYS n 使N天取代当前备份保留策略,列出哪些数据文件需要备份
RMAN> REPORT obsolete; 根据备份冗余策略来判断,那些备份是陈旧的(obsolete)
RMAN> REPORT NEED BACKUP incremental 3; 三天以来尚未进行备份的文件:
RMAN> REPORT NEED BACKUP redundancy 2; 如果不具有两个或更多个备份则需要进行备份:
RMAN> REPORT NEED BACKUP recovery window of 3 days; 需要进行备份以恢复到三天前的数据状态:
RMAN> REPORT OBSOLETE REDUNDANCY 2; 如果需要的备份副本不多于两个,列出作废的恢复文件:
RMAN> REPORT UNRECOVERABLE DATABASE; 备份文件中的表,采用了nologging属性,那么该数据文件是不能恢复的
要理解区分这两组形式:
1)REPORT NEED BACKUP 和 REPORT NEED BACKUP DAYS n
REPORT NEED BACKUP 按照保留策略出报告
REPORT NEED BACKUP DAYS n 按照N天出报告
关于REPORT NEED BACKUP DAYS n,联机文档中描述是:
“Displays files that require more than n days' worth of archived redo log files for recovery”。
RMAN基于这样的考虑,要保证恢复n天内任意一时间点的数据,如果缺少n天前的备份及归档日志,就将它们列出来。
2)REPORT OBSOLETE 和 REPORT UNRECOVERABLE DATABASE
REPORT OBSOLETE 根据保留策略计算出那些备份集是废弃的。一旦该备份集废弃,则RMAN还原时就不再考虑了
REPORT UNRECOVERABLE DATABASE
如果一个文件做过备份,其后在这个文件上创建的表采用了nologging属性,表插入数据没有记日志,那么是不能恢复的,这个表所在的文件就是report unrecoverable database要列出来的文件
3、delete 删除备份命令一览
RMAN> delete backup of datafile 2;
RMAN> delete backup of tablespace system;
RMAN> delete backupset ;
RMAN> delete backupset 30,32;
RMAN> delete backup of controlfile;
RMAN> delete noprompt backup of controlfile; 删除noprompt 不提示
RMAN> delete datafilecopy all;
RMAN> delete copy of datafile 10;
RMAN> delete copy of tablespace users;
RMAN> delete expired backup; 删除过期的备份
RMAN> delete expired archivelog all; 删除过期的归档,更新v$archived_log视图
RMAN> delete expired copy;
RMAN> delete obsolete; 删除陈旧的备份
RMAN> delete noprompt obsolete; 删除不加提示
三)Oracle RMAN一周备份计划范例(Linux版本)
1)建立目录
$ mkdir -p /u01/bk/scripts
所有备份放在/u01/bk下。所有脚本放在/u01/bk/script下。
2)删除不必要的备份的脚本
$ vi /u01/bk/scripts/dele_expir_obso.sh
rman target sys/oracle@prod <<EOF
run {
crosscheck archivelog all;
delete noprompt expired archivelog all;
allocate channel ch1 device type disk;
delete noprompt obsolete recovery window of 7 days;
release channel ch1;
}
EOF
3)备份控制文件脚本的脚本
$ vi /u01/bk/scripts/bk_ctl.sh
rman target sys/oracle@prod <<EOF
run {
allocate channel ch1 device type disk;
backup as compressed backupset
current controlfile reuse
format='/u01/bk/backupctl.ctl'
tag='bkctl';
release channel ch1;
}
EOF
4)备份归档日志的脚本
$ vi /u01/bk/scripts/bk_arch.sh
rman target sys/oracle@prod <<EOF
run{
allocate channel ch1 device type stb;
allocate channel ch2 device type stb;
sql "alter system archive log current"; //归档当前的联机日志
set limit channel ch1 readrate=10240; //(读取速率10M)
set limit channel ch1 kbytes=4096000; //(备份片的大小)
backup as compressed backupset
format='/u01/bk/arch_%d_%U'
tag='bkarch'
archivelog all delete input;
release channel ch1;
release channel ch2;
}
EOF
5)创建0级增量备份的脚本
$ vi /u01/bk/scripts/inc0.sh
sh /u01/bk/scripts/dele_expir_obso.sh
rman target sys/oracle@prod <<EOF
run{
allocate channel ch1 device type stb;
allocate channel ch2 device type stb;
set limit channel ch1 readrate=10240;
set limit channel ch1 kbytes=4096000;
set limit channel ch2 readrate=10240;
set limit channel ch2 kbytes=4096000;
backup as compressed backupset
incremental level 0 database
format='/u01/bk/inc0_%d_%U'
tag='inc0';
release channel ch1;
release channel ch2;
}
EOF
sh /u01/bk/scripts/bk_ctl.sh
sh /u01/bk/scripts/bk_arch.sh
6)创建1级差异增量备份的脚本
$ vi /u01/bk/scripts/inc1_d.sh
sh /u01/bk/scripts/dele_expir_obso.sh
rman target sys/oracle@prod <<EOF
run{
allocate channel ch1 device type stb;
allocate channel ch2 device type stb;
set limit channel ch1 readrate=10240;
set limit channel ch1 kbytes=4096000;
set limit channel ch2 readrate=10240;
set limit channel ch2 kbytes=4096000;
backup as compressed backupset
incremental level 1 database
format='/u01/bk/inc1_%d_%U'
tag='inc1';
release channel ch1;
release channel ch2;
}
EOF
sh /u01/bk/scripts/bk_ctl.sh
sh /u01/bk/scripts/bk_arch.sh
7)创建1级累计增量备份的脚本
$ vi /u01/bk/scripts/inc1_c.sh
sh /u01/bk/scripts/dele_expir_obso.sh
rman target sys/oracle@prod <<EOF
run{
allocate channel ch1 device type stb;
allocate channel ch2 device type stb;
set limit channel ch1 readrate=10240;
set limit channel ch1 kbytes=4096000;
set limit channel ch2 readrate=10240;
set limit channel ch2 kbytes=4096000;
backup as compressed backupset
cumulative incremental level 1 database
format='/u01/bk/inc2_%d_%U'
tag='inc2';
release channel ch1;
release channel ch2;
}
EOF
sh /u01/bk/scripts/bk_ctl.sh
sh /u01/bk/scripts/bk_arch.sh
8)使用crontab建立一个备份计划
此备份策略按照第二章增量备份的图例制定
周日执行0级增量备份,相当于全备
周一,周二,周四、周六执行1级差异增量备份
周三和周五执行1级累计增量备份
crontab -e
#min hour date mon day(星期) command
--------------------------------------------------------------------------------------------------------------------------------
30 1 * * 0 sh /u01/bk/scripts/inc0.sh
30 1 * * 1 sh /u01/bk/scripts/inc1_d.sh
30 1 * * 2 sh /u01/bk/scripts/inc1_d.sh
30 1 * * 3 sh /u01/bk/scripts/inc1_c.sh
30 1 * * 4 sh /u01/bk/scripts/inc1_d.sh
30 1 * * 5 sh /u01/bk/scripts/inc1_c.sh
30 1 * * 6 sh /u01/bk/scripts/inc1_d.sh
重启crontab服务(如果没有启动)
# /sbin/service crond status --用于检查crontab 服务状态
# /sbin/service crond stop //关闭服务
# /sbin/service crond restart //重启服务
# /sbin/service crond reload //重新载入配置
使crontab服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上: /sbin/service crond start
第四部分 Oracle 资源管理与任务调度(选)
第一章 Oracle 资源管理
一)使用资源管理器
传统意义上,系统的资源分配是由OS来完成的,但是对于数据库资源,OS分配资源会带来一些问题:
以Linux为例,最为突出的一个问题是:Linux的资源调度是基于进程的,比如对于CPU的资源一般都是采用轮循的方法针对进程分时间片.也就是说Linux无法区分Oracle的后台进程和服务器
进程之间谁轻谁重,也没有办法对Oracle用户以session角度考虑资源的配比。
Oracle Resource Manager就是把原本由OS管理的硬件资源交给Oracle来管理。
二)资源管理的基本概念
1)资源使用组:Resource consumer group
一个资源使用组由一组具有相似请求的用户组成,一个组可以包含许多用户,一个用户又可以是多个组的成员(这个很重要),实际中多个session使用一个用户名访问数据库是很普遍的,
但是同一时刻,每个session只能有一个组作为这个session的有效使用者组。当新创建一个session时,oracle会根据你的设定自动把它分配到某个组(初始化组)。如果以某个用户登录的
session,它的用户名是属于多个组的,数据库管理员还可以手动的切换这个session所属的组。
下面三类特别的组是系统定义的组,它们不能被修改或删除。
SYS_GROUP sys和system属于这个组
DEFAULT_CONSUMER_GROUP 没有指定用户属于哪个组时缺省放在这个组里
OTHER_GROUP 在资源计划里除了指定组以外的用户都默认在这个组里
需要强调的一点是OTHER_GROUPS,它是绑定在资源计划中的,所有资源计划必须要包括OTHER_GROUPS组,这个组的作用就是作为一个后选项,当一个没有匹配到任何资源组的
SESSION连接到数据库的时候会自动的匹配到OTHER_GROUPS下面,受制于OTHER_GROUPS的资源限定。
2)资源计划:Resource plan
就是Oracle把数据库资源按一定方法来分配,可以限制每个组占用资源的比例。
在一个数据库中同一时间只能有一个资源计划active。(也可以无任何资源计划active)。一个资源计划还可以包含子资源计划。
查看当前被激活的资源计划的三个办法:
一是 show resoure_manager_plan参数 参数resource_limit
二是命令select name,is_top_plan from v$rsrc_plan;
三是通过OEM查看资源管理信息
3)资源计划指令:Resource plan directives
资源管理的目的是实现组或session对于资源分配的优先级,一部分用户在某时间内可以更多的享受资源,而另一部分则不能。
资源计划指令就是给出各种限定的条件,例如给某个组分配一定百分比的CPU时间,或者限制一个组内最大活动的会话数等等。
三)创建组、计划、指令的例子:
1)建三个用户,并授予connect角色:
grant connect to tim identified by tim;
grant connect to mike identified by mike;
grant connect to mgr identified by mgr;
2)建立两个使用者组:
sys登录EM-->Server-->Resource Manager-->Consumer Groups 查看默认组
建OLTP组、DSS组,我们把新建的三个用户指定到两个自建的组中,使用OEM完成:
OLTP组(tim,mgr)、DSS组(mike,mgr)
建组结束前可以单击Show SQL研究一下输出,注意挂起区域的用法,单击Enter返回。
3)设置初始使用者组
缺省方式建立的用户会定位到DEFAULT_CONSUMER_GROUP组下:
SQL> select username,INITIAL_RSRC_CONSUMER_GROUP from dba_users;
USERNAME INITIAL_RSRC_CONSUMER_GROUP
------------------------------ ------------------------------
MGR DEFAULT_CONSUMER_GROUP
HR DEFAULT_CONSUMER_GROUP
TIM DEFAULT_CONSUMER_GROUP
MIKE DEFAULT_CONSUMER_GROUP
SCOTT DEFAULT_CONSUMER_GROUP
......
SYSTEM SYS_GROUP
SYS SYS_GROUP
......
将TIM,MIKE,MGR 这三个用户定位到相应的自建组中,session登录后便直接属于对应的自建组。
SQL>
exec dbms_resource_manager.set_initial_consumer_group('TIM','OLTP');
exec dbms_resource_manager.set_initial_consumer_group('MIKE','DSS');
exec dbms_resource_manager.set_initial_consumer_group('MGR','OLTP');
SQL> select username,INITIAL_RSRC_CONSUMER_GROUP from dba_users;
USERNAME INITIAL_RSRC_CONSUMER_GROUP
------------------------------ ------------------------------
TIM OLTP
MIKE DSS
MGR OLTP
HR DEFAULT_CONSUMER_GROUP
SCOTT DEFAULT_CONSUMER_GROUP
......
4)建立两个新的资源计划
首先是建立DAYTIME--白天资源计划
①将SYS_GROUP组、OLTP组、DSS组加入DATTIME计划,在OEM中会发现OTHER_GROUPS组也自动加入了。
②指定指令计划,比如:CPU使用优先级。选advance,这个应该对应的是MGMT方法(8个cpu level).
具体设置:
Group/Subplan level 1 level 2 level 3 level4 ......
---------------------------------------------------------------------------------------
DSS 20
OLTP 80
OTHER_GROUPS 100
SYS_GROUP 100
第二,建立NIGHTTIME--夜晚资源计划
Group/Subplan level 1 level 2 level 3 level4 ......
---------------------------------------------------------------------------------------
DSS 90
OLTP 10
OTHER_GROUPS 100
SYS_GROUP 100
5)组的切换,MGR用户初始组是OLTP组,现在切换成DSS组。
首先激活DAYTIME计划
linux下session1 sys;
SQL> alter system set resource_manager_plan='DAYTIME';
windows/cmd下 session2 MGR登录
C:\Documents and Settings\prod>sqlplus mgr/mgr@prod
linux下session1 sys;
SQL>select resource_consumer_group from v$session where username='MGR';
resource_consumer_group
-----------------------
OLTP
session2,mgr:
declare old_grp varchar2(30);
begin
dbms_session.switch_current_consumer_group('DSS',old_grp,TRUE);
end;
/
session1 sys;
SQL>select resource_consumer_group from v$session where username='MGR';
resource_consumer_group
-----------------------
DSS
四)其他的资源指令
1)以上介绍的cpu分配方法在原文中叫EMPHASI方法(按%分),还有一种叫RATIO(比例)的方法,两种性质相同,但表达方式不同,
前者有8个level,每个level中合计值不能超过100,而后者是一种比例关系,只有一个level,合计值可以超过100。(PPT-II-413)
2)再回到daytime计划,看看还有几种指令
①活动会话池:
目的是限制一组同时运行的SESSION数量,假设DSS组有8个用户,如果就让3个可以运行(active session)。可将该组最大激活数设为3,
那么另外的5个可以连接上来,但要排队等着激活。而排队也可设延迟时间,超时后就会报错。
active session -----------on cpu, waiting;
inactive session ------------ no cpu service, idel
②限制并行度:
Oracle可通过参数设置并行度,如:parallel_max_servers,(创建一个并行执行服务器池),但是无法阻止任何人使用它,于是我们可以通过Resource Management加以限制。
③通过执行时间控制作业
数据库中一个大型作业会挤掉其他用户性能,Threshold指令可以解决这个问题。到了时间,按action的规定去做。
④依据空闲时间终止session
不做任何事情的session浪费服务器资源,如PGA白白占用,idle time指令从两个方面限制这样的情况,比如某组的max idle time(秒)=1800,表示空闲了30分钟,block another session(秒)=300,表示把别人锁了300秒,这两种情况都会终止该session.
⑤限制undo数据的产生
某些用户的大型事务可能填满undo表空间,如批处理事务不定期的提交,为了安全起见,可以对这里潜在的用户设置undo表空间使用上限,比如某组其undo pool设置为6G,当到达这个上限值后该组中的所有session都会被挂起,直至事务提交后释放池中的空间。
5. 配置测试使用者组自动切换
举例,接续12.3的例子,假设MGR要运行大作业,两个组里都有MGR这个用户,MGR总能切换到那个资源优先级较高的组,那么DBA可以限制他的行为,通过设置Threshould,以DAYTIME计划为例,OLTP组的Threshold设为10秒, ACTION 选switch to DSS组,这样一来,MGR用户占用10秒时就被降级了。
1)OEM使DAYTIME计划激活
2)设置上面的Threshold为10秒
3)session2 mgr:登录
4)session1 sys: 查看MGR当前组是OLTP
SQL>select resource_consumer_group from v$session where username='MGR';
5) session2 mgr:做一个长查询
SQL>select count(*) from all_objects;
6)session1 sys: 查看10秒后降级为DSS组
SQL>select resource_consumer_group from v$session where username='MGR';
7) 若选择revert after call=yes, MGR任务结束后又返回到OLTP组(考点)。
6考点
1)SQL> show parameter resource
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
resource_manager_cpu_allocation integer 1
resource_manager_plan string NIGHTIME
激活的资源计划有一个参数:resource_manager_plan,但是resource_limit这个初始化参数与资源计划毫无关系。
2)DBMS_RESOURCE_MANAGER和DBMS_RESOURCE_MANAGER_PRIVS是有关资源管理的最有用的两个包。
赋给一个用户管理资源管理器的能力,需要系统权限 ADMINISTER RESOURCE MANAGER,而这个权限不是使用通常的grant方法授予的,只能使用oracle提供的程序包。
DBMS_RESOURCE_MANAGER_PRIVS 包负责授予管理Resource Manager的权限,将用户放置到组中,从组中删除用户。赋给一个用户管理资源管理器的能力,需要系统权限 ADMINISTER RESOURCE MANAGER,而这个权限不是使用通常的grant方法授予的,只能通过上面的包授予。
3)在每个级别的总CPU使用率不能超过100%,如果超过的话,则挂起区域将无法验证并且其资源计划不能保存到数据字典,资源计划容许在一个级别分配的资源<100%,但这样做没有什么意义。
4)每个资源计划都必须包含一条针对OTHER_GROUPS组的指令。
5)会话池不限制连接会话的数量,限制的是活动会话(active session)的数量。活动会话如果没有提交,该会话仍然对该组的活动会话池计数有效。
6)每个组的undo pool与undo表空间配额无关,你甚至不可能授予undo表空间上的配额。
第二章 Oracle 自动任务调度
一)基本概念
在Oracle中任务调度指某一(组)执行程序在特定的时间被周期性的执行。Oracle把任务调度称为job(作业)。
Advanced SCHEDULER它是在Oracle 10g之后,功能更加强大的dbms_scheduler来完成作业调度工作,Oracle将Resource Management的内容并入SCHEDULER框架。
理解以下概念:
1)Advanced SCHEDULER下的jobs
JOB翻译为作业,一个基本的JOB由两方面组成:program和schedule。JOB总体上可分为两大类,基于时间的JOB和基于事件的JOB。
在Oracle 10g之前,采用dbms_job程序包来完成任务调度的相关工作。
*考点:必须将JOB_QUEUE_PROCESSES 实例参数设置为>0的值,否则调度程序将无法运行,默认值为1000。如果有任何定义的活动的作业,那么总是运行作业队列协调器(后台进程cjq0)。
SQL> show parameter job_queue_processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
SQL> select program from v$process where program like '%J%';
PROGRAM
------------------------------------------------
oracle@prod.localdomain (J000) job slave即job工作者,根据参数可以有1000个
oracle@prod.localdomain (CJQ0) Job Coordinator即job协调员
2)Advanced SCHEDULER下的program
Program指的是运行的程序。包括具体的要操作的执行代码,可选的是三种类型:
PL/SQL BLOCK : 标准的pl/sql代码块;
STORED PROCEDURE : 编译好的PL/SQL存储过程,或者Java存储过程,以及外部的c子程序;
EXECUTEABLE : ORACLE数据库之外的应用,比如操作系统命令等等。
3)Advanced SCHEDULER下的schedule
Scheduler有的资料翻译为调度,有的翻译成时间表,简单来说指的就是作业运行周期,即时间和频率。
如果不考虑与资源计划的结合,Schedules(调度);Programs(程序);Jobs(任务)这三者之间到底是个什么关系?直白地来说
就是:program负责具体做什么(左膀),schedule负责什么时候做(右臂),job就简单了(联手左膀右臂)。11g的SCHEDULER提供了六种
形式的建立Job的存储过程,可以将program、schedule、job分立创建,也可以混合创建,相互组合非常灵活。
浏览一下dbms_scheduler中的内容。
SQL> spool /tmp/sch.txt
SQL> desc dbms_scheduler
SQL> spool off
$more /tem/sch.txt
4)JOB CLASSES
相当于创建了一个job组,可以将那些具有相同特性的job,统统放到一个Job Classes中,在Job Classes中的Jobs可以指派优先级(1-5), ,默认优先级是3,而1的优先级最高,然后让Job Classes与资源计划器结合进行管理。
5)WINDOW
窗口指定了作业运行的起始时间(START DATE)、终止时间(END DATE),运行时间(DURATION),以及重复间隔(REPEAT INTERVAL)等,
它实际上扩展了SCHEDULER(时间表)的概念,所谓扩展是指窗口可以激活资源管理计划,当窗口打开时,数据库自动切换到相关的
resource plan上,此时这个resource plan便处于活动状态(ACTIVE)。
窗口对于job class也有着特殊的意义,通过job class和resource plan联系,这就使窗口下被激活的resource plan中所关联的job class中的所有job被激活了,这些job会根据优先权调度运行。
6)JOB CHAIN
CHAIN可以被视做一组Programs的组合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成功的话继续运行PROGRAM:C,否则的话运行PROGRAM:D。Programs:A、B、C、D以及执行的逻辑关系就构成了一个最简单的CHAIN。
7)轻型作业
轻型作业不显示在DBA_SCHEDULER_JOBS视图中,因为轻型作业不是模式对象,与普通作业相比创建和删除轻型作业的开销非常小。使用轻型作业有两种情形:1)作业成百上千次的批量执行,2)单个作业运行时间较短。
DBMS_SCHEDULER程序包可以使用最少的语法来创建轻量作业。轻量作业只有很少的参数可以指定:作业参数和计划。作业的其余元数据(包括权限)都是从作业模板继承来的。轻量作业的模板必须是PL/SQL 块或存储过程。
轻量作业必须使用DBMS_SCHEDULER程序包在PL/SQL 中创建。JOB_STYLE参数在EM 中是不可见的。
例1,指定时间和频率的
dbms_scheduler.create_job(
job_name =>'test_ltwtjob1',
program_name =>'test_prog',
repeat_interval =>'freq=hourly',
end_date =>to_timestamp(sysdate+1),
job_style =>'lightweight',
例2,使用预定义计划
dbms_scheduler.create_job(
job_name =>'test_ltwtjob1',
program_name =>'test_prog',
shedule_name =>'test_sched'
job_style =>'lightweight',
以上两种方法,轻型作业的名字叫TEST_LTWTJOB1,程序test_prog就是它的模板,(这个模板就是指program_name是一个单独的模块),
job_style是轻型作业的关键字。
建立单一的轻型作业也许意义不大,另一种方法是通过PL/SQL块一次执行几百个轻量级作业的数组。
考点:轻型作业的指定的程序类型只能是PLSQL_BLOCK或者STORED_PROCEDURE。
8)基于事件(Event)的作业
SCHEDULER中有两种触发EVENT的情况:
Scheduler触发的Events
Scheduler 中触发的Events,一般是说当前schduler 中job 的状态发生修改,类似job 启动,或者运行结束,或者达到运行时间等诸如此类的动作,都能够抛出一个EVENT,接收到EVENT 的application 就可以根据这些信息进行适当的处理。
Application触发的Events
外部的应用也可以触发Events,并且由Scheduler来接收并处理这一类型的Events。所谓Scheduler 处理EVENT 就是指Scheduler启动相应的job来执行相关操作,这类job在创建时专门声明了event 的处理,这样当接收到EVENT 时,这类job就会启动。
建立和管理基于事件(Event)的作业的方法超出了OCP考试范畴,这里就不多说了。
二)示例1:创建任务调度
我们使用分立创建三者的方法,先建一个测试表
SQL> create table scott.job_test1(my_date date);
第一步,创建一个名叫my_pro1的program,(带PL/SQL BLOCK)操作如下:
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name =>'my_pro1',
program_action =>'begin
insert into scott.job_test1 values(sysdate);
commit;
end;',
program_type =>'PLSQL_BLOCK',
number_of_arguments =>0,
comments =>'insert sysdate into table',
enabled =>TRUE);
END;
/
PL/SQL procedure successfully completed.
通过上述语句,我们定义了一个program,类型是一个oracle匿名块,其动作是将输入sysdate插入到scott.job_test中。
前三个属性是不可以省略的,它们没有缺省值,必须指定,属性number_of_arguments是指定支持的参数个数,默认为0,
最多255,这里又置为0,强调此参数为0,因为program_type是PLSQL_BLOCK。要为progremm 添加参数需要使用
DEFINE_PROGRAM_ARGUMENT存储过程。
第二步:建立一个schedule,规定开始program的操作时间,及操作频率。这里定义了20秒执行一次。
BEGIN
dbms_scheduler.create_schedule(
repeat_interval => 'FREQ=SECONDLY;INTERVAL=20',
start_date => sysdate,
comments => 'Start Every 20 seconds',
schedule_name => 'my_sch1');
END;
/
此处REPEAT_INTERVAL参数的语法结构比较复杂。其中最重要的是FREQ和INTERVAL 两个关键字。
FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,
分别表示年、月、周、日、时、分、秒等单位。
INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-99。
本例'FREQ=SECONDLY;INTERVAL=30表示每30秒钟执行一次,如果是'FREQ=DAILY;INTERVAL=1';就表示每天执行一次,
第三步:创建job,按照指定的schedule,执行program,创建job时,start_date,repeat_interval,job_action等均无须指定,因为这些参数将由program和schedule来控制。操作如下:
BEGIN
dbms_scheduler.create_job(
job_name => 'my_job1',
program_name => 'my_pro1',
schedule_name => 'my_sch1',
comments => 'insert sysdate into table',
enabled => TRUE);
END;
/
这样,操作完成后,ORACLE就会自动定时(当前设置为30秒执行一次)program中定义的操作。
检查结果:
SQL> select * from scott.job_test1;
MY_DATE
-------------------
2012-11-22 15:56:13
2012-11-22 15:56:43
2012-11-22 15:57:13
......
可以通过一些视图查看JOB状态
DBA_SCHEDULER_JOBS
DBA_SCHEDULER_RUNNING_JOBS; //这两个都是查看当前job运行状态的(考点)
DBA_SCHEDULER_JOB_LOG
DBA_SCHEDULER_JOB_RUN_DETAILS
例如,查看刚刚创建的"MY_JOB1"任务的执行情况的细节,执行命令如下:
SQL>select log_id, log_date, status, additional_info from user_scheduler_job_run_details where job_name = 'MY_JOB1';
除了作业按照时间表自动运行,你也可以手工干预它们,举几个例子:
使能作业:
SQL> exec dbms_scheduler.enable('my_job1');
禁用作业:
SQL> exec dbms_scheduler.disable('my_job1');
删除作业:
SQL> exec dbms_scheduler.drop_job('my_job1');
运行作业:
SQL> exec dbms_scheduler.run_job('my_job1');
停止作业:
SQL> exec dbms_scheduler.stop_job('my_job1');
等等,很多类似的存储过程...
从管理角度看,你能创建JOB,也应该能修改JOB,即修改JOB的属性,由于JOB属性众多,Oracle把这部分工作独立出来作为一个存储过程,这就是DBMS_SCHEDULER.set_attribute, 此过程可以修改JOB属性,这里仅举几个(也是考点):
1)JOB_TYPE:指定job执行的任务的类型
有四个可选值:'PLSQL_BLOCK', 'STORED_PROCEDURE', 'EXECUTABLE', and 'CHAIN'。
2)JOB_ACTION:指定job 执行的任务.这一参数所指定的值依赖于JOB_TYPE 参数中的值, 比如说JOB_TYPE设置为 'STORED_PROCEDURE',那么本参数值中指定的可以是ORACLE 中的过程名。
3)LOGGING_LEVEL:指定对jobs 执行情况记录的日志信息级别。
SCHEDULER 管理的JOB 对任务的执行情况专门进行了记录,同时用户还可以选择日志中记录信息的级别,有下列三种选择:
DBMS_SCHEDULER.LOGGING_OFF:关闭日志记录功能;
DBMS_SCHEDULER.LOGGING_RUNS:对任务的运行信息进行记录;
DBMS_SCHEDULER.LOGGING_FULL:记录任务所有相关信息,不仅有任务的运行情况,甚至连任务的创建、修改等也均将记入日志。
4)AUTO_DROP:当为TRUE时,一旦job到达停止运行的时间,该job就会被自动删除,否则的话job仍然存在,不过状态被修改为COMPLETED。
5)RESTARTABLE:指定jobs运行出错后,能否适时重启,该参数默认情况下设置为FALSE,如果设置为TRUE,就表示当任务运行时出错,下次运行时间点到达时仍会启动,并且如果运行仍然出错,会再重复,连接出错达到6次,该job 就会停止。
三)示例2--关联资源管理
job class包含着一组有相同特性的job, 而window是一个时间段,当系统时间进入到窗口时间段,则窗口打开,作业运行。
它们和资源计划的关联是个难点:一个job是怎样和资源计划联系起来的?
看上图,通过两条线路将JOB和资源计划关联起来的,需要理解的是:
第一条线路:
创建一个job class,将该Job class绑定某个资源用户组,则这个Job_Class将服从该用户组的资源分配计划。
创建job,再通过set_attribute过程赋予相对优先权(1-5), 然后将job加入Job Class后,会根据设定的优先值从1-5顺序执行的,1首先被执行,默认是3。
第二条线路:
建立window时必须绑定一个resource plan,当系统时间进入window后,便激活了该resource plan。Window也可以设置优先权(high和low)
window的优先级的作用是:在窗口重叠的情况下如何选择哪个窗口打开,优先级为high的会打开,如果是同样的优先级,window时间长的打开,如果优先级相同,window时间长度也相同,则两个window都不打开,返还给原来活动的window。
window和schedule功能上相似,但Oracle设计让window和resource plan绑定,以便可以完成不同的resource plan的自动切换。
查看哪个窗口是活动的以及哪个资源计划与该窗口相关联,可以使用DBA_SCHEDULER_WINDOWS视图。
SQL>SELECT window_name,resource_plan,enabled,active FROM DBA_SCHEDULER_WINDOWS;
例;Job Class和Window在Scheduler框架内的作用
接续刚才的例子,把两条线路完成:
1)使用EM建立一个Job Class,名叫My_Class,将之前的MY_JOB1加入到My_Class(MY_JOB1默认加入的是DEFAULT_JOB_CLASS),再将My_Class关联OLTP组。
2)建立一个叫DAY_WIN的窗口,该窗口将激活DAYTIME计划
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
window_name=>'"DAY_WIN"',
resource_plan=>'DAYTIME',
start_date=>systimestamp at time zone 'Asia/Shanghai',
duration=>numtodsinterval(1, 'minute'),
repeat_interval=>'FREQ=MINUTELY;INTERVAL=2',
end_date=>null,
window_priority=>'HIGH',
comments=>'');
END;
/
这将立即打开DAY_WIN窗口,每隔2分钟将再次打开该窗口,每次激活DAYTIME计划,duration的含义是打开窗口的持续时间。这里的1分钟是窗口Active状态为true可以持续1分钟。
| 2分钟 | 2分钟
窗口再次打开间隔2分钟 |--------------- |---------------|...
窗口持续打开时间1分钟 |Active | 关闭 |Active| 关闭 |...
也就是说:当repeat_interval(间隔)>duration(持续时间)才有意义,Oracle不检查这两个时间单位的逻辑关系。
至此,一个job关联一个resource_plan的框架已经搭建起来了,4)和5)两条线路需要联动配合,实为关键。
3)改一下MY_JOB1的时间表,原来它关联MY_SCH1这个Schedule,现在让它关联DAY_WIN这个window,
即EDIT(MY_JOB1)-->Schedul Type-->Use_Pre_Define_Window-->DAY_WIN
改一下MY_JOB1的JOB CLASS,原来它关联DEFAULT_JOB_CLASS,现在让它关联MY_CLASS
测试一下:
SQL> alter system set resource_manager_plan=''; 关闭资源计划,现在没有资源计划激活。
SQL> select * from scott.job_test1;
可以看到原来是20秒插入一条记录,现在是每间隔2分钟插入一条记录。
SQL> show parameter resource_manager_plan
resource_manager_plan string SCHEDULER[0x115E7]:DAYTIME
注:DAYTIME资源计划被DAY_WIN自动激活了(保持1分钟,2分钟后再激活)。
OK!到此,整个例子基本完成了。
考点:
1)当create job过程创建作业时,无法指派优先级,必须在后面使用API的set attribute过程。
2)作业A在其类中的优先级是1,作业B在另一个类的优先级是5,作业B处于resource plan中有更高的优先权的使用者组内,则B先于A被执行。