oracle之三rman 不完全恢复
rman 不完全恢复
9.1 rman 不完全恢复的三个标准模式:基于time、基于scn和基于sequence:
范例1:恢复过去某个时间点误操作,一般使用基于time或scn。
1)环境:有一套全备份,controlfile AUTOBACKUP设成on
RMAN> show all;
CONFIGURE CONTROLFILE AUTOBACKUP ON; //控制文件自动备份,备份目的地是flash_recovery_area
SQL> select * from scott.t1;
ID
----------
1
2) 取时间
SQL> select sysdate from dual;
SYSDATE
-------------------
2013-01-18 13:47:04
3) 删除 scott.t1中所有记录
SQL> truncate table scott.t1;
4) RMAN按时间点做不完全恢复
run {
startup force mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
set until time '2013-01-18 13:47:04 ';
restore database;
recover database;
alter database open resetlogs;
}
5)验证
SQL> select * from scott.t1;
ID
----------
1
//基于scn的方法与基于time相似,语法是set until scn 6689163;
//基于日志的方法类似手工恢复的例子,语法是set until sequence 3;
*考点:不完全恢复的手工与RMAN语法比较:
手工方法 RMAN方法
-----------------------------------------------------------------
基于time until time XXX until time XXX
基于scn until change XXX until scn XXX
基于日志 until cancel until sequence XXX
范例2
恢复SPFILE或CONTROLFILE:
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
//T1表里有一条记录
SQL> select * from scott.t1;
ID
----------
1
3)关闭数据库,然后让参数文件不起作用
SQL> shutdown abort
[oracle@timran dbs]$ rm spfiletimran.ora
[oracle@timran dbs]$ rm inittimran.ora
5) RMAN恢复参数文件
[oracle@timran ~]$ [oracle@timran ~]$ 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/TIMRAN11G/autobackup/2013_01_16/';
//查看在dbs/目录下已经产生spfiletimran.ora文件。证明spfile 恢复好了。
范例3 恢复误删除表空间(已备份),RMAN必须通过备份的控制文件(即含有删除的表空间结构的老控制文件)进行恢复。
本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。
1)打开告警日志,查看drop tablespace的告警信息,记下时间点
$ tail -f /u01/diag//rdbms/timran11g/timran11g/trace/alert_timran11g.log
2)删除test表空间
SQL> drop tablespace test including contents and datafiles;
3)查看告警有关信息:
Wed Jan 16 19:39:56 2013 //这个时间是你要until time的时刻
drop tablespace test including contents and datafiles
Deleted file /u01/oradata/timran11g/test01.dbf
Wed Jan 16 19:40:12 2013
Completed: drop tablespace test including contents and datafiles
4)删除所有控制文件和数据文件
SQL> shutdown abort
[oracle@timran timran11g]$ rm *.ctl
[oracle@timran timran11g]$ 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;
set until time '2013-01-16 19:39:56';
restore database;
recover database;
alter database open resetlogs;
}
6)验证:
SQL> select * from scott.t1;
ID
----------
1
要点:
1)不能使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了。
2)dbid是数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;
范例4 表空间时间点恢复(TableSpace Point In Time Recovery)
作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动。TSPITR是一种对个别表空间执行不
完全恢复的技术,一般是针对用户错误的删除
(或截断)了表。TSPITR的最大好处是不需要生产库停机。
我们了解一下这个过程。
前提:
1. 有一套全库备份,因为TSPITR这个过程除了复制需要恢复的表空间外,也必须复制system,sysaux和undo表空间(考点)
2. 本例设置了控制文件自动备份:RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
1)建表空间
SQL> create tablespace abcd datafile '/u01/oradata/timran11g/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)删除表并purge
SQL>drop table scott.t4 purge;
6)建立目录指定辅助库目标
$mkdir -p /u01/oradata/timran11g/auxdata
7)做RMAN TSPITR 并指定辅助库目的地
[oracle@timran ~]$ rman target /
RMAN> recover tablespace abcd until time '2013-01-16 22:02:14' auxiliary destination '/u01/oradata/timran11g/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)
3)通过TS_PITR_OBJECTS_TO_BE_DROPPED视图,查看creation time字段可以知道截止恢复时间之后的有哪些新建对象可能丢失了。
4)完成指定表空间的TSPITR后,这个表空间之前做的备份就不能再用于以后的TSPITR。 这就是在TSPITR之后要重新备份表空间的原因。
范例5:数据块介质恢复(BMR)(PPT-II-229-236)
如果数据文件只是出现部分数据块损坏,RMAN可以尝试针对坏块进行恢复,就是说不需要恢复整个数据文件,只恢复损坏的数据块。为了保
证数据文件的一致性,块介质恢复是一个完全恢复。
介质损坏,Block format incorrect,checksum无效
逻辑损坏,Oracle internal error,checksum有效
很多方法可以发现坏块(考点):
A. ANALYZE operations
B. dbv
C. SQL queries that access the potentially corrupt block
D. DBMS_REPAIR
F. RMAN
通过设置参数,当对块读写时进行检查
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;
11g新特性增加RMAN>recover corruption list,它和backup validate database配合使用,为的是简化数据文件坏块恢复。
例:
RMAN>BACKUP VALIDATE DATABASE;
RMAN>RECOVER CORRUPTION LIST;
BACKUP VALIDATE DATABAE 不生成备份集,它只是检查坏块,并确认所有数据文件在正确的位置上, 这条命令会在v$backup_corruption
和v$database_block_corruption视图中填充检测到的所有讹误数据块。
例:
RMAN> RECOVER CORRUPTION LIST UNITL TIME SYSDATE - 7;
注意:RMAN的块恢复是完全恢复,这里的UNTIL表示的是要使用一周前的备份做还原,它不代表不完全恢复。
考点会围绕以下知识点:
1)BMR是RMAN的一个功能,它是针对物理损坏的block进行的完全恢复,要求数据库是ARCHIVELOG模式。
2)RMAN是块级备份,备份时自动检测坏块,缺省下碰到坏块就会中断备份,除非set maxcorrupt
3)做BMR有两点前提:一个是数据库要在mount或open下, 另一个是要有坏块所在的数据文件incremental level 0备份。
4)闪回日志也可以帮助恢复坏块。
SQL> desc V$DATABASE_BLOCK_CORRUPTION;
名称 是否为空? 类型
----------------------------------------------------------------- -------- --------------------------------------------
FILE# NUMBER
BLOCK# NUMBER
BLOCKS NUMBER
CORRUPTION_CHANGE# NUMBER
CORRUPTION_TYPE VARCHAR2(9)
RMAN> recover corruption list命令修复的是CORRUPTION_TYPE列记录了MEDIA_CORRUPT的物理坏块。
范例6:归档备份(PPT-II-127)
概念:在Oracle 11g中,可以使用backup … keep命令保留比RMAN备份保留策略所指定的时间更长的备份。它可以构造能保留数年的备份(不被obsolete),归档备份之所能使备份长久保存,关键是使用keep选项覆盖掉了RMAN中缺省的保留策略。
语法: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不能重名。
例:
RMAN>
backup datafile 4 format '/u01/myrman/%s_%t.bak'
keep until time 'sysdate+30'
restore point timranbak1;
可以查看RESOTRE POINT rename和scn的对应关系。
RMAN> list restore point all;
SCN RSP 时间 类型 时间 名称
---------------- ------------------- ---------- ------------------- ----
13400758 2014-03-13 10:10:18 TIMRANBAK
考点:
1)归档备份不受retention策略影响,也不会由delete obsolete命令自动删除掉。
2)归档备份是包含一切的备份,共四种类型:数据文件备份,spfile备份,control备份和归档日志备份。
范例7,使用image copy快速恢复数据文件(不需要restore)(PPT-II-170)
RMAN> backup as copy datafile 4 format '/u01/myrman/%s.dbf';
SQL> select file#,name from v$datafile; //看一下控制文件中datafile 4 标识的物理路径
[oracle@timran timran11g]$ rm /u01/oradata/timran11g/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@timran timran11g]$ cp /u01/myrman/34.dbf /u01/oradata/timran11g/users01.dbf
SQL>alter tablespace users rename datafile '/u01/myrman/34.dbf' to '/u01/oradata/timran11g/users01.dbf';
SQL>alter tablespace users online;