Oracle数据库备份与恢复(4):RMAN(备份与恢复管理器)
2008-11-05 11:48:37 来源:WEB开发网
4.4.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 判定日志已存在,也不会恢复该归档日志文件。
4.4.4.5 联机日志的备份
联机日志不能用 RMAN 来备份,可以先将其归档,再备份。为了实现这点,必须在 RMAN中执行归档命令语句:
RMAN> run {
2> allocate channel dev1 type disk;
3> sql "alter system archive log current";
4> backup (archivelog from time "sysdate-1" all delete input)
5> "format "/oracle/backups/log_t%t_s%s_p%p";
6> release channel dev1;
7>
}
上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以将数据库恢复到一个一致性的状态。
当然,也可以在全库备份时使用 plus archvielog 选项,将自动完成联机日志的备份。
4.4.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;/
4.4.4.7 备份集的备份的备份与恢复
备份:备份所有备份集:RMAN> backup backupset all;备份指定备份集:RMAN> backup backupset bs_num;恢复:(这种备份只是增加一个镜像,不用恢复)
主要用于改变备份集的位置,或者创建多个镜像备份,比如将备份集从硬盘备份到磁带。
4.4.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;
4.4.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;
}
4.4.5.2 基于时间的恢复
下面使用 set until time 命令为 2005 年 8 月 1 日下午 1点的恢复目标:
$ startup mount;
RMAN> run{
set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}
执行上面的命令时, RMAN 会查找与恢复目标时间最近、但是不包含恢复目标时间及以后时间的备份集,并且从这个备份中还原数据库。如果数据库非归档模式,那么恢复操作 会在备份集的时间点停止;否则 RECOVER 命令会应用恢复目标之前的归档重做日志或需 要的增量备份。
4.4.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 {
2> SET UNTIL SEQUENCE 120 THREAD 1;
4> RESTORE DATABASE;
5> RECOVER DATABASE; ——recovers through log 119 not include 120
6> ALTER DATABASE OPEN RESESTLOGS;
7> }
赞助商链接