您的位置:首页 > 其它

RMAN 还原与恢复

2013-10-30 13:30 190 查看
--====================
-- RMAN 还原与恢复
--====================

在Oracle中,三大文件即控制文件,数据文件,日志文件的丢失与破坏都将需要使用还原或恢复来使数据库正常化。而RMAN还原与恢复
是实现数据库完整性、可靠性必不可少的手段之一。还原简言之即是将所需的文件从备份中复制到原来文件所在的路径。还原通常可以包括
数据库、表空间、数据文件级别的还原。通常还原后的内容会滞后于最新的数据库SCN,因此将归档日志、联机重做日志文件中的内容更新到
还原的数据文件中,这个过程称之为恢复。

恢复的几种情形
1.在mount 或open 阶段完成的灾难恢复
非系统表空间,undo表空间,所有的数据文件
2.在nomount 阶段完成的灾难恢复
控制文件(controlfile)
3.在mount 阶段完成的灾难恢复
系统表空间,联机重做日志文件

有关恢复、介质恢复、一致性或非一致性恢复的详细概念请参考:

Oracle 基于用户管理恢复的处理

Oracle 基于用户管理的不完全恢复

一、RMAN在归档模式下的还原与恢复的简化例子
RMAN> connect target
/
RMAN> startup mount;
RMAN>
restore database;
RMAN> recover
database;
RMAN>
alter database open;

二、使用RMAN进行还原与恢复(非catalog方式)

1.数据文件丢失的恢复处理
--设定客户端环境变量并连接到数据库
C:/>set NLS_LANG=AMERICAN_AMERICA.AL32UTF8

C:/>rman target sys/redhat@dedicated nocatalog

--对数据库做全备
RMAN>
backup as backupset
2> format
'/u01/bk/rmbk/wb_%U'
3> tag=Whole_bak
database;

RMAN> sql
'alter system archive log current';

--对数据库做0级增量备份
RMAN> run{

2> allocate channel ch1
type disk;
3>
backup incremental level 0
database
4> format
'/u01/bk/rmbk/Inc_0_%U'
5> tag=Inc_0;
6> release channel ch1;}

--对表插入新记录并切换日志
SQL>
select * from tb2;

ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry

SQL>
insert into tb2 select 3,'Danny'
from dual;

SQL>
commit;

SQL>
alter system checkpoint;

SQL>
alter system switch logfile;

--对数据库做1级增量备份
RMAN> run{

2> allocate channel ch1
type disk;
3>
backup incremental level 1
database
4> format
'/u01/bk/rmbk/Inc_1%U'
5> tag=Inc_1;
6> release channel ch1;}

SQL>
shutdown immediate;
--关闭数据库

SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf
--删除所有的数据文件 */

SQL> startup mount

--使用RMAN连接到未mount状态的数据库
RMAN> connect target sys/redhat@dedicated

connected to target
database: ORCL (DBID=1257415066,
not open)

--执行数据库还原
--注意当存在完整备份也同时存在0级增量备份时,Oracle会自动使用0级增量备份来还原数据库
RMAN>
restore database;

piece handle=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0
--下面可以看出还原的数据来自0级增量备份

--执行数据库恢复
RMAN> recover
database;
piece handle=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1

--打开数据库验证恢复
RMAN>
alter database open;

SQL>
select * from bk.tb2;

ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry
3 Danny

2.磁盘损坏导致数据文件无法恢复到原始位置或不想恢复到原始位置的处理
使用set newname 命令将数据文件还原到新路径
set newname
for datafile 1 to
'<newdir>/system01.dbf';
--为恢复的数据文件指定新路径或重命名
使用switch命令将变更更新到控制文件
switch datafile n |
all ; --等同于alter database rename file命令,该命令将恢复的数据文件重命名更新到控制文件

--下面的示例首先删除tbs01.dbf,接下来将其恢复到oradata目录中

SQL> ho rm $ORACLE_BASE/oradata/orcl/tbs01.dbf

SQL> startup mount force;

RMAN> connect target sys/redhat@dedicated

connected to target
database: ORCL (DBID=1257415066,
not open)

RMAN> run{
2>
set newname for datafile 6
to '/u01/app/oracle/oradata/tbs01.dbf';
3>
restore database;
4> switch datafile
all;
5> recover
database;
6>
alter database open;}

SQL>
select file#,name,status
from v$datafile where file#=6;

FILE# NAME STATUS
---------- -------------------------------------------------- -------
6 /u01/app/oracle/oradata/tbs01.dbf
ONLINE

SQL>
select count(1)
from bk.tb2;
--表tb2位于tbs01.dbf内

COUNT(1)
----------
3

3.恢复表空间

--删除表空间内的数据文件,删除后在针对位于该表空间的表进行插入记录以及实施检查点进程
SQL> ho rm $ORACLE_BASE/oradata/tbs01.dbf

SQL>
insert into bk.tb2
select 4,'Jackson'
from dual;

SQL>
commit;

SQL>
alter system checkpoint;

--强制检查点后,告警日志出现错误提示,视图v$recover_file给出了故障数据文件
[oracle@oradb ~]$ tail -n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log
Errors in
file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4724.trc:
ORA-01110: data
file 6:
'/u01/app/oracle/oradata/tbs01.dbf'
ORA-01116: error
in opening database
file 6
ORA-01110: data
file 6:
'/u01/app/oracle/oradata/tbs01.dbf'
ORA-27041: unable
to open
file
Linux Error: 2:
No such file
or directory

SQL>
select * from v$recover_file;

FILE# ONLINE ONLINE_ ERROR CHANGE#
TIME
---------- ------- ------- ------------------ ---------- ---------
6 OFFLINE OFFLINE FILE
NOT FOUND 0

SQL>
select name,status
from v$datafile where file#=6;

NAME STATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/tbs01.dbf
RECOVER

--使用RMAN命令恢复数据文件,此时数据库处于OPEN状态,因此首先需要将表空间脱机,恢复完成之后再将其联机
RMAN> run{
2> sql
'alter tablespace tbs1 offline immediate';
3>
set newname for datafile 6
to '/u01/app/oracle/oradata/orcl/tbs01.dbf';
4>
restore tablespace tbs1;
5> switch datafile
all;
6> recover tablespace tbs1;
7> sql
'alter tablespace tbs1 online';}

SQL>
select name,status
from v$datafile where file#=6;
--位置变动到orcl子目录下,状态变为online

NAME STATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs01.dbf
ONLINE

--也可以使用下面的命令完成同样的功能
--注意表空间内有多个数据文件的情形,而仅有单个数据文件损坏则采用下面的方式处理更为妥当
RMAN> run{
2> sql
'alter database datafile 6 offline immediate';
3>
set newname for datafile 6
to '/u01/app/oracle/oradata/tbs01.dbf';
4>
restore datafile 6;
5> switch datafile
all;
6> recover datafile 6;
7> sql
'alter databaes datafile 6 online';}

4.RMAN实现不完全恢复
对于RMAN的不完全恢复,使用Oracle的闪回特性的处理有更多的优势。关于闪回请参考:Oracle 闪回特性
步骤
a.加载数据到mount状态(建议恢复前先做备份)
b.为高并发分配多个通道
c.还原所有(所需)的数据文件
d.使用until time,until sequence,until scn来恢复数据库
e.使用resetlogs打开数据库
f.全备数据库

演示RMAN基于until time的例子
SQL> show
user;
USER
is "BK"
SQL>
create table tb1(id
int,name varchar2(10));

SQL>
insert into tb1 select 1,'Lancy'
from dual;

SQL> ho strings $ORACLE_BASE/oradata/orcl/redo02.log
| grep Lancy --查看联机日志文件中不存在刚刚插入的记录

SQL>
commit;
--注意commit是将日志缓冲内容写入到日志文件

SQL> ho strings $ORACLE_BASE/oradata/orcl/redo02.log
| grep Lancy --提交后联机日志文件中才有新增的记录
Lancy

SQL>
alter system switch logfile;

SQL> ho ls $ORACLE_BASE/oradata/arch

log_1_1_732989230.arc log_1_1_732989889.arc

RMAN> run{
2> allocate channel ch1
type disk;
3> allocate channel ch2
type disk;
4>
backup as compressed backupset
database plus archivelog delete input
5> format
'/u01/bk/rmbk/wh_lg_%U'
6> tag='Wholebak_Pluslog';
7> release channel ch1;
8> release channel ch2;}

18:10:36 SQL>
drop table tb1;

RMAN> run{
2> allocate channel ch1
type disk;
3> allocate channel ch2
type disk;
4>
set until time "to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')";
5>
restore database;
6> recover
database;
7>
alter database open resetlogs;
8> release channel ch1;
9> release channel ch2;}

SQL>
select * from tb1;

ID NAME
---------- ----------
1 Lancy

5. SPFILE文件丢失的恢复
SPFILE参数文件可以在RMAN中进行备份,因此可以使用RMAN来恢复SPFILE文件。可以自动备份SPFILE。
SPFILE的自动备份是随着控制文件的备份一起被完成的,因此可以通过自动备份控制文件来实现自动备份SPFILE文件的目的
其次,在备份系统表空间时将引发控制文件的自动备份,而不论是否设置自动备份参数为ON,此时同样也备份SPFILE文件

有关SPFILE文件请参考:Oracle 参数文件
SPFILE 错误导致数据库无法启动(ORA-01565)

SPFILE文件恢复步骤
a. startup nomount [force];
b. set dbid=dbid_no;
c. restore spfile from autobackup | '<dir>'
d. startup force; 如果d执行失败则转到e,f,否则不用执行e,f。
e. set dbid=dbid_no;
f. startup;

下面设定控制文件的自动备份以及设置其备份路径(注意要预先知道目标数据库的DBID,此次演示的DBID为1263182651)

RMAN> configure controlfile autobackup
on;
RMAN> configure controlfile autobackup format
for device type
disk to '/u01/bk/rmbk/auto_ctl_%d_%F';

RMAN>
exit
sys@ORCL>
alter tablespace users add datafile
'$ORACLE_BASE/oradata/orcl/users02.dbf' size 5m;

[oracle@oradb rmbk]$ ls auto*
--执行上一条alter tablespace users add datafile
语句将引发控制文件的自动备份
auto_ctl_ORCL_c-1263182651-20101124-00
sys@ORCL>
shutdown immediate;

[oracle@oradb dbs]$ mv spfileorcl.ora spfileorcl.ora.bak
--将原来的spfile文件重命名

[oracle@oradb ~]$ rman target
/ nocatalog
RMAN> startup nomount force;
RMAN>
set dbid=1263182651;
RMAN>
restore spfile from autobackup;
--此处并没有找到文件路径,按Oracle联机文档,在nomount状态应该可以找到
RMAN-06172:
no autobackup found or specified handle
is not a valid copy
or piece
RMAN>
restore spfile from
'/u01/bk/rmbk/auto_ctl_ORCL_c-1263182651-20101124-00';
--手动指定路径
RMAN> startup force;

6.联机重做日志文件丢失的恢复请参考:
基于catalog 的RMAN 备份与恢复

Oracle 联机重做日志文件(ONLINE LOG FILE)

7.控制文件的恢复处理
控制文件中描述了数据库的相关物理信息,如创建时间、DBID、数据文件、日志文件等相关信息,因此一旦控制文件丢失数据库将
不能启动,鉴于其重要性,控制文件的备份与恢复将单独列出。有关控制文件请参考下列

基于catalog 的RMAN 备份与恢复
Oracle 控制文件的备份与恢复
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: