Oracle中使用RMAN备份及一些恢复方法

使用RMAN备份并恢复
Backup  备份命令生成 Backup sets (备份集合),以 oracle 专有的格式保存,
由一个完全
的所有的备份片集合构成,构成一个完全备份或增量备份。
 
1.1.1 BACKUP  备份命令选项
 
设置标记(TAG)
RMAN> backup database tag='test backup';
 
限制备份集大小
RMAN> backup database maxsetsize=100M;
 
只备份新增部分
RMAN> backup incremental level 0 database;
 
备份控制文件同时备份SPFILE
RMAN> backup current controlfile;
RMAN> configure controlfile autobackup on;    //  默认是 off
也可以在备份数据库或者文件的时候加上 include current controlfile 选项。
例如:

RMAN> backup database include current controlfile;

备份时如果包含了 SYSTEM表空间,将自动备份控件文件和 SPFILE
RMAN> backup file 1;


使用自动备份进行恢复:

RMAN> restore spfile/controlfile to '/xx/xx' from autobackup;
 
备份归档日志(9i)
RMAN> backup archivelog all;
RMAN> backup ... plus archivelog; //  在备份其他时同时备份归档日志

plus archivelog 隐含如下步骤:

?      运行一个 ALTER SYSTEM ARCHIVELOG CURRENT 命令
?      运行  BACKUP ARCHIVELOG ALL 命令。注意如果备份优化被启用,
RMAN只会备份未备份过的日志
?      备份 BACKUP命令中定义的文件
?      运行 ALTER SYSTEM ARCHIVE LOG CURRENT 命令
?      备份所有的剩下的归档日志
 
备份完后删除归档日志
RMAN> backup ... ARCHIVELOG all delete all input;

修改备份集的保存策略

例如:将备份设置为永久有效
RMAN> backup database keep forever logs|nologs;

设置为有效期 180 天

RMAN> backup database keep until time='sysdate+180';

重写configure exclude / noexclude

通过 configure exclude 可以配置 RMAN 不备份上次备份以来没有发生变化的数据文 件。
如果要确保 RMAN备份这些数据文件,可以在 backup命令中添加 noexclude 选项。
例如:

RMAN> backup database noexclude;
 
跳过脱机的、不可存取的或者只读的数据文件
RMAN> backup database skip offline skipinaccessible skipreadonly;
 
强制备份只读的数据文件
RMAN> backup database force;
 
备份指定周期内没有备份的数据文件
RMAN> backup database not backed up;
RMAN> backup database not backed up since time='sysdate-2';
 
在备份操作期间检查逻辑讹误
RMAN> backup check logical database;    //在检查逻辑错误的同时进行备份
RMAN> backup validate check logical database;    //只检查

建立压缩备份集

RMAN> backup as compressed backupset tablespace users
FORMAT='D:\BACKUP\%d_%s.dbf';
 
1.1.2 RESTORE/RECOVER 恢复命令选项
 
数据库恢复
RMAN> restore/revover database ;
 
表空间恢复
RMAN> restore/revover tablespace xx ;
 
只读表空间的恢复
默认情况下,即使丢失了只读的数据文件,RMAN 也不会在执行完全数据库还原 操作时候还原只读的数据文件。
要在完全恢复期间还原只读的数据文件,就必须在 RESTORE 命令中使用 CHECK READONLY 参数:

RMAN> RESTORE DATABASE CHECK READONLY;
 
恢复SPFILE/控制文件
使用自动备份恢复 SPFILE、控制文件
RMAN> startup nomount;
RMAN> set dbid=153910023;

RMAN> restore controlfile from autobackup;
RMAN> restore spfile/controlfile to '/xx/xx' from autobackup;

RMAN> restore controlfile from'/arch/ct_c-2347671489-20060630-00';

联机状态:目标数据库 MOUNT 或 OPEN

RMAN> restore controlfile to 'd:\temp\control01.ctl';

归档重做日志的还原
RMAN> RESTORE ARCHIVELOG ALL;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1 UNTIL LOGSEQ=20;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;

也可以用 SET命令来指定归档日志的还原位置,
例如:

RMAN> run
{
set archivelog destination to "d:\temp";
restore archivelog all;
}
 
数据文件副本还原
RMAN> sql "alter datafile 5 offline";
RMAN> restore (datafile 5) from datafilecop y;
RMAN> recover datafile 5;

RMAN> sql "alter datafile 5 online";
请注意,上面的圆括号很重要!
 
还原检查与恢复测试
与备份检查一样,还原操作也可以检查是否能正常 restore 或者是否该备份集 是否有效。
如:
 
RMAN> RESTORE DATABASE VALIDATE;
RMAN>VALIDATEBACKUPSET 218;
RMAN> RESTORE DATABASE VALIDATE CHECK LOGICAL ;

从指定的 tag 恢复:
RMAN> RESTORE FROM tag=’xxxx’;
 
不完全恢复的还原:
1.set until time/SCN/
2.RMAN> restore database until scn 1000;
RMAN>restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
RMAN> restore database until sequence 100 thread 1;

 
块级别的恢复
 
块恢复 Block Media Recovery (BMR),块是恢复的最小单元,通过块可以减少恢复时间,而且数据文件可以在线。
恢复块的时候,必须指定具体的块号,
如:

RMAN> blockrecoverdatafile 6 block 3;
   
1.1.3  非归档模式下的 BACKUP 备份与恢复
 
恢复目录:    
打开
目标数据库:例程启动,数据库加载,mount 不能 open
因为目标数据库不在归档模式下,所以当进行备份/恢复操作的时候数据库无法打 开。
目标数据库只能在  MOUNT 状态不能 Open,所以属于脱机备份。


非归档模式不备份 redo日志,只有完全备份和 readonly/offline 表空间和数据文件备份是有意义的,
所以非归档模式最好不用 RMAN 进行备份,备份语法与归档模式相 同,所以这里只做简单介绍。


1.1.3.1  全库备份

 
例:
使用默认的设置脱机全备份的语句

RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup database;
RMAN> startup;
 
例:
不使用默认的设置执行脱机备份操作,在备份命令中指定备份选项

RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> run {
allocate channel c1 type disk format '/xxx/ming_%U';
allocate channel c2 type disk format '/xxx/ming_%U';
backup full tag full_db_backup format "/backups/db_t%t_s%s_p%p" (database);
backup current controlfile;
release channel c1 ;
release channel c2 ;
}
在这个例子中,我们分配了两个通道,备份位置是在 /xxx。默认情况下,如果备份数据 文件 1 (SYSTEM 表空间),
控制文件和参数文件也会备份。可以通过下面的命令显示恢复目录中记载的备份集信息:
RMAN> list backupset of database;

 
1.1.3.2  全库备份的恢复
 
$ rman target /
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
 
1.1.3.3  表空间备份
 
只有 readonly/offline 表空间的备份才有意义。
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> tag tbs_users_read_only
5> format "/oracle/backups/tbs_users_t%t_s%s"
6> (tablespace users);
7> }
 
使用下列命令来显示恢复目录中该表的备份信息:
RMAN> list backupset of tablespace users;
 
1.1.3.4  表空间备份的恢复
 
RMAN> RUN{
sql "alter tablespace xx offline immediate;"
restore tablespace xx;
recover tablespace xx;  
sql "alter tablespace xx online;"
}
 
1.1.3.5  备份控制文件
 
RMAN> run {
2> allocate channel dev1 type "SBT_TAPE";
3> backup
4> format "cf_t%t_s%s_p%p"
5> tag cf_monday_night
6> (current controlfile);
7> release channel dev1;
8> }
 
注:数据库完全备份将自动备份控制文件。(或者备份时加 include current controlfile)
 
1.1.4  归档模式下的 BACKUP 备份与完全恢复
 
要用 RMAN 进行联机备份操作,数据库就必须位于 ARCHIVELOG 模式。
恢复目录必须打开,目标数据库例程必须启动,数据库加载或者打开。

这部分只介绍完全恢复。

1.1.4.1  整库备份与恢复备份命令:

只备份数据文件(如果 configure controlfile autobackup on;  将自动包括控件文件, SPFILE):
RMAN> backup database;

同时备份归档日志,然后将备份后的归档日志删除

RMAN> backup database plus archivelog delete input;

明确指定同时备份控件文件:

RMAN> run{
allocate channel c1 type disk;
sql 'alter system archive log current';
backup full database include current controlfile tag 'dbfull'
format '/u06/oracle/rmanback/full_%u_%s_%p';
sql 'alter system archive log current';
release channel c1;
}
 
可以用 RMAN的 plus archvielog 选项简化数据库备份:
RMAN> run {
2> backup database
3> format '/xxfull%d_%T_%s'
4> plus archivelog
5> format '/xx/arch_%d_%T_%s'
6> delete all input;
7> }
 
完全恢复:

目标数据库必须是 mount状态

$ rman target /
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
 
1.1.4.3  表空间的备份与恢复
 
备份命令:
RMAN> backup tablespace users ;
例:
RMAN> RUN{
allocate channel c1 type disk;
backup tablespace users tag 'ts_users' format '/oracle/rmanback/ts_%u_%s_%p' ;
release channel c1;
}
 
恢复:
如果我们只丢失了特定的表空间的数据文件,那么我们可以选择只恢复这个表空间,而不是恢复整个数据库。
表空间恢复可以在不关闭数据库的情况下进行,只需要将需要恢复的 表空间 offline。

RMAN> RUN{
sql "alter tablespace xx offlineimmediate;"
restore tablespace xx;
recover tablespace xx;
sql "alter tablespace xx online;"
}
 
恢复到一个不同的位置:
RMAN> RUN{
sql "alter tablespace xx offline immediate;"
SET NEWNAME for datafile 1 to '/xx';
restore tablespace xx;
switch datafile 1;
recover tablespace xx;
sql "alter tablespace tbs1 online;"
}
 
1.1.4.3  数据文件的备份与恢复
 
备份命令:
RMAN> backup datafile 3;
RMAN> backup datafile 'D:\ORAC LE\ORADATA\TEST\TEST.DB';
 
恢复命令:
数据文件恢复与表空间恢复类似。假设数据文件号为5 的文件丢失,文件名是:
'E:\ORACLE\ORADATA\USERS.DBF',那么我们恢复的时候可以指定文件号,也可以指定 文件名。
RMAN> run {
allocate channel dev1 type disk;
sql "alter tablespace users offline immediate";
restore datafile 4;    --或者 restore 'E:\ORACLE\ORADATA\USERS.DBF'
recover datafile 4;
sql "alter tablespace users online";
release channel dev1;
}
 
恢复到一个不同的位置:
$ rman target /
RMAN> startup mount
RMAN> RUN{
sql "alter tablespace users offline immediate";
SET NEWNAME for datafile 9 to '/xx/user01.dbf';
restore datafile 9;
switch datafile all;
recover datafile 9;
sql "alter tablespace users online";
}
 
1.1.4.4  归档重做日志的备份与恢复
 
备份:
整库备份的同时,备份所有归档  (以及联机日志):
RMAN> backup database plus archivelog;

备份所有归档:

RMAN> backup archivelog all;

备份两天来的归档:

RMAN> backup archivelog from time='sysdate-2' [to time=’xxx’] ;

备份从 sequence 1 开始的归档:

RMAN> backup archivelog from sequence 1[to sequence =’n];

备份没有三次备份的归档:

RMAN> backup archivelog not backed up 3 times;

备份所有归档,然后删除归档:

RMAN> backup archivelog all delete input;

恢复:

显示恢复目录中的归档日志:
RMAN> list backupset of archivelog all;

一般情况下,在 RMAN 的普通恢复过程中,不必恢复归档的重做日志。
不过偶尔也需 要恢复重做日志,例如我们用 Log Miner 来从归档中查找一些东西。

RMAN命令举例:
RMAN> RESTORE ARCHIVELOG ALL;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1UNTIL LOGSEQ=20;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;

 
可以用  SET命令来指定归档日志的还原位置,
例如:

RMAN> run{
set archivelog destination to "d:\temp";
restore archivelog all;
}
需要注意的是,即使新的归档日志目录不同于默认的归档日志目录,
如果 Oracle 判定
日志已存在,也不会恢复该归档日志文件。
 
1.1.4.5  联机日志的备份
 
联机日志不能用 RMAN 来备份,可以先将其归档,再备份。
为了实现这点,必须在 RMAN
中执行归档命令语句:
RMAN> run {
allocate channel dev1 type disk;
sql "alter system archive log current";
backup (archivelog from time "sysdate-1" all delete input)
"format "/oracle/backups/log_t%t_s%s_p%p";
release channel dev1;
}

上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以
将数据库恢复到一个一致性的状态。
当然,也可以在全库备份时使用 plus archvielog 选项,将自动完成联机日志的备份。

1.1.4.6  控制文件和服务器参数文件的备份与恢复备份:

RMAN> set controlfile autobackup format for device t ype disk to 'ctl_%F';   // 设置文件名格式
1. RMAN> configure controlfile autobackup on;    // backup database 时将自动备份
2. RMAN> backup current controlfile;
3. RMAN> backup .... include control file;
4. RMAN> backup file 1;     // system datafile 自动备份
 
恢复SPFILE:
SPFILE(PFILE)的丢失/损坏,对数据库不会产生致命影响,可以从其他方式恢复。
不过既然RMAN的备份计划中包括了SPFILE的备份,那么就可以使用 RMAN 来还原 SPFILE了。

$ rman target / catalog "rman/rman@db"
RMAN> set dbid=153910023;   // SET DBID 这个步骤是不能省略的,否则会报错。
RMAN> restore spfile from autobackup [MAXDAYS 100];   //  或者 restore spfile;
RMAN> startup force


或者从某个备份集恢复:

RMAN> restore spfile from backupset bs_num 命令。

使用 dbms_backup_restore 包恢复服务器参数文件:

在一些不常见的情况下,我们可能需要直接使用 dbms_backup_restore 包来恢复 spfile。
当然这个包也可以用来恢复其它数据,是常规办法都没有用的时候的一个利器。
这个包可以在数据库 NOMOUNT 状态下使用。
假设我们有一个自动备份文件
C-2600315304-20060829-02,我们需要从这里恢复数据,那么可以通过执行下面的脚本 来完成:
SQL>
DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorespfileto('/back/SPFILE.ORA');
DBMS_BACKUP_RESTORE.restorebackuppiece(
'/back/C-2600315304-20060829-02',DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
 
恢复控制文件:
RMAN> startup nomount;
RMAN> set dbid=153910023

RMAN> restore controlfile from autobackup

RMAN> restore controlfile from'/arch/ct_c-2347671489-20060630-00';

联机状态:目标数据库 MOUNT 或 OPEN

RMAN> restore controlfile to 'd:\temp\control01.ctl';
 
然后再执行恢复数据库的其他步骤:
RMAN> restore database;
RMAN> recover database;

RMAN> alter database open resetlogs;
 
使用  dbms_backup_restore 包恢复控制文件:
 
SQL>
DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/back/CONTROL01.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece
('/back/C-2600315304-20060829-00',DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/

1.1.4.7  备份集的备份的备份与恢复
 
备份:
备份所有备份集:
RMAN> backup backupset all;

备份指定备份集:

RMAN> backup backupset bs_num;

恢复:(这种备份只是增加一个镜像,不用恢复)

主要用于改变备份集的位置,或者创建多个镜像备份,比如将备份集从硬盘备份到磁带。
 
1.1.5  归档模式下的不完全恢复
 
不完全恢复就意味着有数据的丢失。引起不完全恢复的原因有很多,如丢失了联机日志或某个归档日志。
另外如果出现了严重损害数据库的用户错误,比如某用户错误的删除了某 个重要的数据,那么数据库也要恢复到这个错误操作之前。

不完全恢复会影响整个数据库,需要在 MOUNT 状态下进行。在不完全恢复完成之后,通常需要使用 resetlogs 选项来打开数据库。resetlogs  表示一个数据库逻辑生存期的结束和 另一个数据库逻辑生存期的开始。
数据库的逻辑生存期也被称为一个对应(incarnation)。
每次使用 resetlogs 选项来打开数据库后都会创建一个新的数据库对应物,这对于恢复操作来说非常重要。
每次使用 resetlogs 后,SCN计数器不会被重置,但是 Oracle会重置联机日 志序列号,同时还会重置联机重做日志内容。
因此执行了  resetlogs  之后,应该立即重新备份整个数据库,否则恢复起来相当麻烦。
(注:Oracle 10g 中已经可以在  resetlogs 之后不备 份数据库,恢复的时候能够穿越 resetlogs)

使用  RMAN  执行不完全恢复操作时需要完成的一个工作是建立恢复目标。
恢复目标是
要终止恢复进程的点,可以是时间点、指定的 SCN 或者一个日志序列号。
我们可以在  run 
代码中使用 set  命令和 until time、until scn、until sequence 参数。
也可以选择在 RESTORE 和 RECOVER命令中直接使用 UNTIL TIME、UNTIL SCN、或者 UNTIL SEQUENCE 参数,
这样就可以避免使用  run  代码。
例如;

startup mount;
restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
recover database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
alter database open resetlogs;

 
1.1.5.1  基于SCN的恢复
 
如果知道数据库出错前的 SCN,可以将数据库还原到指定 SCN 状态。
  $ startup mount;
RMAN> run{
allocate channel d1 type disk;
restore database until scn 1317011;      --或者 set until scn 1317011
recover database until scn 1317011;
sql 'alter database open resetlogs';
release channel d1;
}

1.1.5.2  基于时间的恢复

 
下面使用 set until time命令为2015年5月10日下午20点的恢复目标:
$ startup mount;
 
RMAN> run{
set until time "to_date('2015/05/10 20:00:00','yyyy/mm/dd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}
 
执行上面的命令时, RMAN  会查找与恢复目标时间最近,但是不包含恢复目标时间及 以后时间的备份集,
并且从这个备份中还原数据库。如果数据库非归档模式,那么恢复操作 会在备份集的时间点停止;
否则  RECOVER  命令会应用恢复目标之前的归档重做日志或需 要的增量备份。

 
1.1.5.3  基于日志序列的恢复
 
RMAN  允许用户将数据库恢复到指定的归档重做日志序列号。
如果归档的重做日志中有间隙(某个归档日志文件或备份损坏或丢失),使用这种方法就很方便。
间隙通常意味 着我们只能将数据库还原到间隙开始的地方。

SQL> startup mount;
RMAN> restore database until sequence 100 thread 1;    --not include 100
RMAN> recover database until sequence 100 thread 1;  
SQL> alter database open resetlogs;
RMAN> RUN {
SET UNTIL SEQUENCE 120 THREAD 1;
RESTORE DATABASE;
RECOVER DATABASE;    --recovers through log 119 not include 120
ALTER DATABASE OPEN RESESTLOGS;
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27064835/viewspace-1633700/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27064835/viewspace-1633700/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值