Oracle数据库备份与恢复之四:RMAN(备份与恢复管理器)

RMAN是ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件、 归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。

RMAN可以由命令行接口或者 OEM的 Backup Manager GUI 来控制。

4.1 基本知识

4.1.1 RMAN的组件、概念

1. RMAN 主要包括以下组件:

Target Database:(目标数据库)

就是需要RMAN对其进行备份与恢复的数据库,RMAN 可以备份数据文件,控制文件,归档日志,spfile.(注意:RMAN不能用于备份联机日志、初始化参数文件和口令文件)

Server Session:(服务器会话)

RMAN启动数据库上的Oracle服务器进程,将建立一个与目标数据库的会话。由目标数据库上的服务器进程进行备份、还原、恢复的实际操作。

服务器进程

RMAN的服务进程是一个后台进程,用于与RMAN工具与数据库之间的通信,也用于RMAN工具与磁盘/磁带等I/O设置之间的通信,服务进程负责备份与恢复的所有工作,在如下情况将产生一个服务进程:当连接到目标数据库分配一个新的通道

Channel: (通道)

一个通道是 RMAN和目标数据库之间的一个连接,"allocate channel"命令在目标数据库启动一个服务器进程,同时必须定义服务器进程执行备份或者恢复操作使用的 I/O类型。

通道控制命令可以用来:

控制 RMAN使用的 O/S资源,影响并行度

指定 I/O带宽的限制值(设置 limit read rate 参数)

定义备份片大小的限制(设置 limit kbytes)

指定当前打开文件的限制值(设置 limit maxopenfiles)

recovery catalog: (恢复目录)

用来保存备份与恢复信息的一个数据库,不建议创建在目标数据库上。RMAN 利用恢 复目录记载的信息去判断如何执行需要的备份恢复操作。

如果不采用恢复目录,备份信息可以存在于目标数据库的 control file 中。

如果存放在目标数据库的 control file 中,控件文件会不断增长,不能保存 RMAN 的Script. CONTROL_FILE_RECORD_KEEP_TIME (default=7):控件文件中 RMAN 信息保存的最短时间。

使用恢复目录的优势: 可以存储脚本,记载较长时间的备份恢复操作。

RMAN Repository: (RMAN 恢复目录数据库)

存放 recovery catalog(恢复目录)的数据库。建议为恢复目录数据库创建一个单独的数据库。

MML: (媒体管理库)

Media Management Layer (MML)是第三方工具或软件,用于管理对磁带的读写与文件的 跟踪管理。如果你想直接通过 RMAN 备份到磁带上,就必须配置媒体管理层,媒体管理层 的工具如备份软件可以调用 RMAN来进行备份与恢复。

2.概念述语

Backup Sets (备份集合)

备份集合的特性:包括一个或多个数据文件或归档日志,以oracle专有的格式保存,有一个完全的所有的备份片集合构成,构成一个完全备份或增量备份。

Backup Pieces (备份片)

一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大 小是有限制的;如果没有大小的限制, 备份集就只由一个备份片构成。备份片的大小不能 大于使用的文件系统所支持的文件长度的最大值。

Image Copies 镜像备份

镜像备份是独立文件(数据文件、归档日志、控制文件)的备份。它很类似操作系统级 的文件备份。它不是备份集或备份片,也没有被压缩。

Full backup Sets 全备份集合

全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被备份的,也就是说,oracle 进行备份集合的压缩。

Incremental backup sets 增量备份集合

增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块。 与完全备份相同,增量备份也进行压缩。

File multiplexing

多个数据文件可以在一个备份集中。

Recovery catalog resyncing 恢复目录同步

使用恢复管理器执行 backup、copy、restore 或者 switch 命令时,恢复目录自动进行更 新,但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用 resync catalog命令进行同步。

RMAN> resync catalog;

Incarnation 对应物

在不完全恢复完成之后,通常需要使用 resetlogs 选项来打开数据库。resetlogs 表示一个 数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期也被称为 一个对应物(incarnation)。每次使用 resetlogs 选项来打开数据库后都会创建一个新的数据库 对应物。

4.1.2 RMAN的使用:命令行接口与脚本

数据库状态:RMAN恢复目录数据库: 必须OPEN目标数据库: 根据不同情况,必须MOUNT或OPEN

1. 使用不带恢复目录的 RMAN

设置目标数据库的 ORACLE_SID ,执行:$ rman nocatalog RMAN> connect target RMAN> connect target user/pwd>@db

2. 使用带恢复目录的RMAN

$ rman catalogrman/rman RMAN> connecttarget //连接本地数据库作为目标数据库RMAN> connecttarget user/pwd>@db //连接远程数据库或$ rman catalogrman/rman targetuser/pwd>@db

3. 命令行接口

1、单个执行

RMAN> backup database;

2、运行一个命令块

RMAN> RUN { 2> copy datafile 10 to 3> '/oracle/prod/backup/prod_10.dbf';4> }

3、运行存储在恢复目录中的脚本:

RMAN> RUN { EXECUTE SCRIPT backup_whole_db };

4、运行外部脚本:

$ rman catalog rman/rman target / @backup_db.rman

$ rman cmdfile=backup.rman msglog=backup.log

RMAN> @backup_db.rman ]

RMAN> RUN { @backup_db.rman }

如果在cron中执行,注意在脚本中设置正确的环境变量,例:

#set env export ORACLE_HOME=/opt/oracle/product/9.2

export ORACLE_SID=test

export NLS_LANG="AMERICAN_AMERICA.zhs16gbk"

export PATH=$PATH:$ORACLE_HOME/bin rman cmdfile=backup_db.rman

4. 使用脚本

创建或者取代脚本:

RMAN> create script alloc_disk {

2> # Allocates one disk

3> allocate channel dev1 type disk;

4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;

5> } RMAN> replace script rel_disk { 2> # releases disk 3> release channel dev1;5> }

删除脚本:RMAN> DELETE SCRIPT Level0Backup;

查看脚本:RMAN> PRINT SCRIPT Level0Backup;

运行脚本:RMAN> RUN { EXECUTE SCRIPT backup_whole_db };

5. 运行OS命令

RMAN支持通过执行 host命令暂时退出 RMAN的命令提示符而进入到操作系统的命令环境。

6. 执行SQL语句

在 RMAN 的命令提示符后输入 SQL 命令,然后在一对单引号(双引号亦可)中输入要执行的 SQL 语句,例如:RMAN> SQL 'ALTER SYSTEM CHECKPOINT';对于 SELECT语句,无法得到结果。可以先执行 host再用 SQLPLUS.

4.2 RMAN 的配置

4.2.1 建立Recovery Catalog恢复目录

(1) 在目录数据库中创建恢复目录所用表空间:

SQL> create tablespace rman_ts datafile '/xxx/rman_ts.dbf' size 20M;

(2) 在目录数据库中创建RMAN 用户并授权:

SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts;SQL> grant connect, resource, recovery_catalog_ownerto rman;

(3) 在目录数据库中创建恢复目录

$ rman catalog rman/rman RMAN> create catalog tablespace rman_ts;

(4) 登记目标数据库:

一个恢复目录可以注册多个目标数据库,注册目标数据库的命令为:$ RMAN catalog rman/rman target user/pwd @rcdb; RMAN> register database;

4.2.2 查看RMAN的默认设置SHOW命令

必须连接目标数据库RMAN> show all

RMAN> show channel; // 通道分配 RMAN> show device type; // IO 设备类型

RMAN> show retention policy; // 保存策略

RMAN> show datafile backup copies; // 多个备份的拷贝数目

RMAN> show maxsetsize; // 备份集大小的最大值

RMAN> show exclude; // 不必备份的表空间

RMAN> show backup optimization; // 备份的优化

4.2.3 配置RMAN的默认设置

1. 配置备份集文件的格式 (format)

RMAN> configure channel device type disk format'/u05/oracle/rmanback/%U';备份文件可以自定义各种各样的格式,如下%c 备份片的拷贝数%d 数据库名称%D 位于该月中的第几天 (DD)

%M 位于该年中的第几月 (MM)

%F 一个基于 DBID 唯一的名称,这个格式的形式为 c-IIIIIIIIII-YYYYMMDD-QQ,其中 IIIIIIIIII 为该数据库的 DBID,YYYYMMDD 为日期,QQ 是一个 1-256 的

序列%n 数据库名称,向右填补到最大八个字符%u 一个八个字符的名称代表备份集与创建时间%p 该备份集中的备份片号,从 1 开始到创建的文件数%U 一个唯一的文件名,代表%u_%p_%c %s 备份集的号%t 备份集时间戳%T 年月日格式(YYYYMMDD)

2. 配置默认 IO设备类型 ( device type )

IO 设备类型可以是磁盘或者磁带,在默认的情况下是磁盘,可以通过如下的命令 进行重新配置。

RMAN> configure default device t ype to disk; RMAN> configure default device t ype to sbt;注意,如果换了一种 IO 设备,相应的配置也需要做修改,如RMAN> configure device type sbt parallelism 2;

3. 配置自动分配的通道 ( Chanel )

RMAN> configure channel device type disk format

'/U01/ORACLE/BACKUP/%U在运行块中,手工指定通道分配,这样的话,将取代默认的通道分配。

RMAN> Run { allocate channel cq type disk format='/u01/backup/%u.bak';…

}

通道的一些特性:读的速率限制 Allocate channel ……rate = integer 最大备份片大小限制 Allocate channel …… maxpiecesize = integer 最大并发打开文件数(默认 16) Allocate channel …… maxopenfile = integer

4. 配置默认的保存策略 ( Retention Policy)

保存策略是管理备份与副本有效期或者是否有效的一种方法。恢复数据库的时候Oracle 不 考 虑 失效 的 备 份。我们可以定义两种保存策略:

恢复窗口备份保存策略(recovery window backup retention policy )和冗余备份保存策略(redundancy backup retention policy )

备份策略保持

分为两个保持策略:

一个是时间策略,决定至少有一个备份能恢复到指定的日期

一个冗余策略,规定至少有几个冗余的备份。 恢复窗口备份保存策略这种保存策略类型的使用基于数据库可能恢复到的最早的日期。 例如,假设今天 是星期一,此前存在 3 个备份。第一个备份在昨天生成的,第二个备份是上星期四生 成的,而最后一个备份是 10 天前备份的。假如恢复窗口是 7 天,那么昨天和上星期 四的备份是有效备份,而 10 天前的备份会成为废弃备份。下面的命令将恢复窗口配置为 7 天:RMAN> configure retention policy to recovery window of 7 days;冗余备份保存策略使用这种保存策略,RMAN 会从最新备份开是保留 N 个数据备份,其余的废弃。 例如,如果有四个备份,而冗余数是 3,那么最早的那个备份将被废弃。下面的命令将 备份策略设置为 3:RMAN> configure retention policy to redundancy3;设置 NONE可以把使备份保持策略失效,Clear 将恢复默认的保持策略RMAN> configure retention policy to none;例:保 证 至 少有一 个 备份 能 恢复 到 Sysdate-5 的时 间点 上, 之 前 的备份将 标 记 为Obsolete RMAN> configure retention policy to recovery window of 5 days;至少需要有三个冗余的备份存在,如果多余三个备份以上的备份将标记为冗余RMAN> configure retention policy to redundancy 5;

5. 配置多个备份的拷贝数目( backup copies )

如果觉得单个备份集不放心,可以设置多个备份集的拷贝,如:

RMAN> configure datafile backup copies for device type disk to 2;

RMAN> configure archivelogbackup copies for device type disk to 2;

如果指定了多个拷贝,可以在通道配置或者备份配置中指定多个拷贝地点:

RMAN> configure channel device type disk format

'/u01/backup/%U', '/u02/backup/%U';

RMAN> backup datafile n format '/u01/backup/%U', '/u02/backup/%U';

6. 设置并行备份( ARALLELISM )

RMAN支持并行备份与恢复,也可以在配置中指定默认的并行程度。如:RMAN> configure device type disk parallelism 4;指定在以后的备份与恢复中,将采用并行度为 4,同时开启 4个通道进行备份与恢 复,当然也可以在 RUN的运行块中手工分配多个通道来决定备份与恢复的并行程度。 并行的数目决定了开启通道的个数。如果指定了通道配置,将采用指定的通道,如果没 有指定通道,将采用默认通道配置。

还可以在 BACKUP命令中使用指定 FILESPERSET 或者指定(datafile 1,4,5 channel c1 tag=DF1)(datafile 2,3,6 channel c2 tag=DF2)

7. 设置控制文件自动备份 (autobackup on)

通过如下的命令,可以设置控制文件的自动备份RMAN> configure controlfile autobackup on;对于没有恢复目录的备份策略来说,这个特性是特别有效的,控制文件的自动备份发生在任何 backup 或者 copy 命令之后,或者任何数据库的结构改变之后。

可以用如下的配置指定控制文件的备份路径与格式RMAN> configure controlfile autobackup format for type disk to '%f';

在备份期间,将产生一个控制文件的快照,用于控制文件的读一致性,如下配置:

RMAN> configure snapshot controlfile name to

'/u01/app/oracle/product/9.0.2/dbs/snapcf_U02.f';

8. 设置备份优化选项 ( optimization )

可以在配置中设置备份的优化,如RMAN> configure backup optimization on;如果优化设置打开,将对备份的数据文件、归档日志或备份集运行一个优化算法。

4.2.4 RMAN 会话的设置

set 命令与configure命令很相似,但是set命令设置不是永久的。set 命令定义只应用于当前 RMAN会话的设置。

可以用于RUN代码之外的命令有:set echo on | off // 显示或关闭 RMAN显示set DBID dbidn // 指定一个数据库的数据库标识符。

下面的set 命令只能在 RUN代码中使用:set newname:用于TSPITR或者数据库复制操作,指定新的数据库文件名,将数据库移动到新的系统中并且文件名不同的时候可以用此命令。

set maxcorrupt for datafile:用于定义 RMAN操作失败之前允许的数据块讹误的数量set archivelog destination:可以修改存储归档的重做日志 archive_log_dest_1 的目的地。

set命令和until 子句:可以定义数据库时间点恢复操作所使用的具体的时间点、SCN或者日志序列号,例:

set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";

set backup copies:

使用该命令可以定义为备份集的每个备份片创建的镜像副本数。

例:

RMAN> RUN{

set maxcorrupt for datafile 3 to 10;

set backup copies = 2;

backup database;

}

4.3 Copy 镜像拷贝与恢复

Copy镜像拷贝命令可以创建数据库数据文件、归档重做日志或者控制文件的精确副本。 RMAN 副本与这些文件的区别仅在于名称和(或)位置的区别。功能相当于用户管理的备 份恢复中的热备份。备份副本的好处是恢复比较快,恢复时可以不用拷贝,指定新位置即可。

Copy镜像拷贝至少要在mount 状态下运行。

Copy镜像拷贝可作为增量备份的 Level 0

Oracle10g开始,允许使用单条命令"backup as copy"进行数据库拷贝。

4.3.1 备份

生成数据文件副本:

RMAN> copy datafile 3 to 'd:\backup\datafilecopy\users01.dbf.bak';

RMAN> copy datafile 'd:\oracle\oradata\ora9i\users01.dbf' to

'd:\backup\datafilecop y\users01.dbf.bak';

生成控制文件副本:

RMAN> copy current controlfile to … ;

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP is ON;

备份 ARCHIVELOG 副本:

// 只能一个一个的来备份,而不能指定一个范围

RMAN> copy archivelog 'd:\oracle\oradata\arc\ming_351.arc' to

'd:\oracle\orabackup\arc\ming_351.arc';

并行设置:

1. RMAN> configure device type …… parallelism = 3;//only 2 channel, one for writting data to disk

2. 手工分配多个通道

3. 在命令中指定多个文件RMAN> cop y datafile 'xx' to 'xx2', datafile 'yy' to 'yy2', ……;

块检查:CHECK LOGICAL 选项MAXCORRUPT参数 V$COPY_CORRUPTION在复制操作中,Oracle 服务器进程对每个块执行校验和计算以检测是否有块损坏。 RMAN 在还原副本时也要核对校验和. 该过程称为物理损坏检测. 可以使用NOCHECKSUM 选项取消校验和操作,从而加快复制进程。如果数据库已在维护块校验和,则此选项无效。缺省情况下,禁用逻辑损坏的错误检查。

可以使用 CHECK LOGICAL 选项测试通过了物理损坏检查的数据和索引块,查看 它们是否存在逻辑损坏,如行片或索引条目损坏。如果检测到任何块存在逻辑损坏,则 将该块记录到服务器进程的警报日志和跟踪文件中。

可以使用 MAXCORRUPT 参数设置逻辑和物理损坏的阈值。只要在某个文件中检 测到的逻辑和物理损坏总和低于该值,则 RMAN 命令完成,同时 Oracle 将损坏块的 范围植入到 V$COPY_CORRUPTION 视图。如果超出 MAXCORRUPT,则该命令终 止,并且不植入视图。 当并行度比较高时,占用的计算机资源较多,但备份操作完成 速度较快。缺省情况下将启用对物理损坏的错误检查。有关在备份过程中遇到的损坏数 据文件块的信息将记录在控制文件和警报日志中。

4.3.2 恢复

查看所有的 Copy镜像拷贝:RMAN> list copy;数据文件副本还原:还原时可以 offline 数据文件所属表空间,然后利用 OS拷贝命令恢复副本。

还可以用 restore (datafile num) from datafilecop y 命令来从数据文件副本中还原数 据文件,然后再用 recover 命令来恢复。例如:RMAN> sql "alter database datafile 5 offline"; RMAN> restore (datafile 5) from datafilecop y; RMAN> recover datafile 5;RMAN> sql "alter database datafile 5 online";注意,上面的圆括号很重要,如果没有,restore 命令就会执行失败。
4.4 Backup 备份与恢复

Backup 备份命令生成 Backup sets (备份集合),以 oracle 专有的格式保存,由一个完全的所有的备份片集合构成,构成一个完全备份或增量备份。

4.4.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';

4.4.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;具体请见 4.7.4 块媒体恢复 Block Media Recovery (BMR)
4.4.3 非归档模式下的 BACKUP 备份与恢复

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

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

4.4.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;

4.4.3.2 全库备份的恢复

$ rman target /

RMAN> startup mount

RMAN> restore database;

RMAN> recover database;

RMAN> alter database open resetlogs;

4.4.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;

4.4.3.4 表空间备份的恢复

RMAN> RUN{

sql "alter tablespace xx offline immediate;"

restore tablespace xx;

recover tablespace xx;

sql "alter tablespace xx online;" }

4.4.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)

4.4.4 归档模式下的BACKUP备份与完全恢复

要用 RMAN 进行联机备份操作,数据库就必须位于 ARCHIVELOG 模式。恢复 目录必须打开,目标数据库例程必须启动,数据库加载或者打开。

这部分只介绍完全恢复,不完全恢复见下一节。

4.4.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;

4.4.4.2 表空间的备份与恢复

备份命令: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;"

}

4.4.4.3 数据文件的备份与恢复

备份命令:

RMAN> backup datafile 3;

RMAN> backup datafile 'D:\ORAC LE\ORADATA\TEST\TEST.DB';

恢复命令:数 据文件 恢复与表 空间恢 复类 似 .假设数 据文件 号 为 5 的文件丢 失 ,文 件名 是:'E:\ORACLE\ORADATA\USERS.DBF', 那么我们恢复的时候可以指定文件号,也可以指定文件名。

RMAN> run {

2> allocate channel dev1 type disk;

3> sql "alter tablespace users offline immediate";

4> restore datafile 4; ——或者 restore 'E:\ORACLE\ORADATA\USERS.DBF'

5> recover datafile 4;

6> sql "alter tablespace users online";

7> release channel dev1;

8> }

恢复到一个不同的位置:

$ 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";

}

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> }

4.5. RMAN 查看信息List 与Report

4.5.1 恢复目录相关视图

恢复目录本身有一组视图,用于存放目标数据库与备份信息,可以用 RMAN用户登录数 据库进行查看,例:RC_DATABASE

RC_DATAFILE RC_STORED_SCRIPT RC_STORED_SCRIPT_LINE RC_TABLESPACE 4.5.2 RMAN 动态性能视图

以下是目标数据库上与 RMAN 备份有关系的一些动态性能视图,可以用 SYS用户进行 查询。

V$ARCHIVED_LOG V$BACKUP_CORRUPTION V$COPY_CORRUPTION V$BACKUP_DEVICE V$CONTROLFILE_RECORD_SECTION V$BACKUP_DATAFILE 用于通过确 定各数 据文件中 的块数来创建大小 相同的备份集。通过它也可以找出数据文件中已损坏的块数。 V$BACKUP_REDOLOG 显示在备份集中存储的归档日志。 V$BACKUP_SET 显示已经创建的备份集。 V$BACKUP_PIECE 显示为备份集创建的备份片。

这里还有一个视图,可以大致的监控到 RMAN 备份进行的程度。如通过如下的 SQL脚本,将获得备份的进度。

SQL> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,

2 ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"

3 FROM V$SESSION_LONGOPS

4 WHERE OPNAME LIKE 'RMAN%'

5 AND OPNAME NOT LIKE '%aggregate%'

6 AND TOTALWORK != 0

7 AND SOFAR <> TOTALWORK;

要在备份过程中将某一进程与一个通道关联起来,请:

1.启动恢复管理器并连接到目标数据库和恢复目录(与后者的连接是可选的)。

rmantarget / catalog rman/rman@rcat

2.在分配通道后,设置 COMMAND ID 参数,然后复制所需的对象。

run {

allocate channel t1 type disk;

set command id to 'rman';

copydatafile 1 to '/u01/backup/df1.cpy';

release channel t1;}

3.查询 V$SESSION_LONGOPS 视图以获得复制的状态。

SELECT sid, serial#, context, sofar, totalwork

round(sofar/totalwork*100,2) "% Complete",

FROM v$session_longops

WHERE opname LIKE 'RMAN:%'

AND opname NOT LIKE 'RMAN: aggregate%';

4.使用 SQL*Plus 并查询 V$PROCESS 和 V$SESSION 以获得 SID 和 SPID.然 后, 使用操作系统实用程序来监视进程或线程。

SELECT sid, spid, client_info FROM v$process p, v$session s WHERE p.addr = s.paddr

AND client_info LIKE '%id=rman%';

4.5.3 List

List 命令是一种在数据库控制文件 或者恢复目录中查询备份的历史信息的方法。 List提供了一组信息,可以提供各种备份的信息,如对应物、备份集、归档日志备份、控 制文件备份等等。

列出对应物:RMAN> list incarnation;

列出备份概要信息:RMAN> list backup summary;

按备份类型列出备份:RMAN> list backup by file;

获得备份的详细信息,包括备份片的物理文件名:RMAN> list backup; RMAN> list backupset bs#;

或者按照TAG 来查:RMAN> list backup tag=tab_number;

列出过期的备份:RMAN> list expired backup;

按照表空间和数据文件来列出备份:列出USERS 表空间的备份:RMAN> list backup of tablespace USERS;

列出文件5的备份:RMAN> list backup of datafile 5;

列出文件 E:\ORACLE\USERS.DB 的备份:RMAN> list backup of datafile ' E:\ORAC LE\USERS.DB ';

列出控制文件的备份:RMAN> list backup of controlfile;

列出归档日志的备份:RMAN> list archivelog all;RMAN> list backup of archivelog all;

列出副本:

RMAN> list copy 列出所有的副本。

RMAN> list copy of controlfile 列出控制文件副本

RMAN> list copy of archivelog all 列出所有归档日志副本

RMAN> list copy of database 列出数据库所有数据文件的副本

4.5.4 Report

Report 命令被用于判断数据库的当前可恢复状态和提供数据库备份的特定信息,可 以检测哪些文件需要备份,哪些备份能被删除以及那些文件能不能获得的信息。可以报 告数据库的所有能备份数据文件对象,包括数据文件名、文件号、表空间、文件大小、 是否含有回滚段等。

RMAN> report schema或者RMAN> REPORT SCHEMA AT TIME 'SYSDATE-14'; RMAN> REPORT SCHEMA AT SCN 1000;RMAN> REPORT SCHEMA AT SEQUENCE 100 THREAD 1;

报告需要备份的数据文件RMAN> report need backup [ redundancy | days | incremental n];报告过期了的数据文件或者不可用的备份与拷贝RMAN> Report obsolete [orphan]报告最近没有备份的数据文件RMAN> report need backup days=10; // 恢复需要超过 10天的归档日志RMAN> report need backup incremental=3; // 恢复时需要超过 3 增量的文件报表文件 增量 名称8 15 E:\ORACLE\ORADATA\MING_RECOVER\MINGDICT.DB 9 15 E:\ORACLE\ORADATA\MING_RECOVER\MINGLOB.DB

这个报告中,列出的数据文件,在进行恢复的时候,需要从 3 个以上的增量备份文件中恢复。我们知道如果需要从很多文件中恢复,会影响恢复速度,可以根据情况来重新备份这些文件。

报告备份冗余或恢复窗口我们可以执行 report need backup redundancy 来确定为满足冗余备份策略而需要备份的 文件。例如:RMAN> report need backup redundancy=2; // 文件冗余备份少于 2 个我们也可以按照恢复窗口来查找需要备份的文件。比如我们要求恢复窗口小于 2 天,那 么用下面的命令:RMAN> report need backup recovery window of 2 days; //文件报表的恢复需要超过 2天的归档日志

这个命令等同于:report need backup days=2;

4.6 RMAN 的管理与维护

如果数据库做了 alter database open resetlogs; 就需 reset database,如果有库结构变化,就需 要 resync catalog

4.6.1 加入目录数据库

如果存在以前创建的备份数据想注册到目标数据库,可以采用如下手工方式加入到恢复目录中,

RMAN> CATALOGdatafilecopy '/oracle/ …… /system01.dbf';RMAN> CATALOG controlfilecopy '/oracle/CONTROL01.CTL.BCK';

RMAN> CATALOG archivelog '/oracle/arc001.log';

10g新特性:1.可以手工加入手工加入备份片,所以,只要你的备份还在,归档还在,即使 catalog database 崩溃,控制文件重建,照样可以用这些备份来做恢复。

RMAN> CATALOG backupiece '/oracle/xxxx';2.扫描整个目录,如果备份片或者归档日志文件太多,可以放到一个目录中,一次性扫描就行。

RMAN> CATALOG START WITH '/xxx/arch_logs';

4.6.2 恢复目录的建立、升级与删除

恢复目录的建立请见:4.2.1 建立 Recovery Catalog 恢复目录 当恢复目录管理的某个数据库进行了升级,只要版本不高于恢复目录就没有问题,下面的命令查询恢复目录的版本 (RMAN用户):SQL> select version from rcver;如果要高于恢复目录,那么恢复目录就必须进行升级。用下面的命令即可:RMAN> upgrade catalog;恢复目录可以采用如下命令删除RMAN> DROP CATALOG;

4.6.3 同步或重置 CROSSCHECK命令(交叉校验)

如果目标数据库物理对象发生了变化,如添加了一个数据文件,需要用如下命令同步:RMAN> resync catalog;如果目标数据库 reset 了数据库,需要用如下命令同步RMAN> resetdatabase;

(必须使用 catalog数据库)

打开数据库的时候,每次使用 resetlogs 参数都会创建数据库的一个新对应物。如 果这个操作是在 rman 中完成的,rman 会自动更新恢复目录。如果是在 rman 之外完 成,如 sql*plus,那么就必须手工重置对应物。如:RMAN> reset database;另外有的时候,我们需要改成之前的某个对应物,可以用 list incarnation 来显示出对应物列表之后用下面的命令:RMAN> reset database to incarnation incarnation_num;

当手工删除了数据库的归档文件后,要执行以下脚本同步 RMAN> allocate channel for maintenance type disk; RMAN> change archivelog all crosscheck;RMAN> release channel;当手工删除了数据库的 RMAN备份后,要执行以下脚本来同步RMAN> allocate channel for maintenance type disk; RMAN> crosscheck backup;RMAN> delete expire backup; RMAN> release channel;

关于CROSSCHECK 交叉校验命令

该命令用于核对磁盘和磁带上的备份文件,以确保RMAN资料库与备份文件保持同步。该命令只会检查RMAN资料库所记载的备份文件。当执行 CROSSCHECK命令时,如果资料库记录不匹配于备份文件的物理状态,那么该命令会更新资料库记录的状态信息。 当使用CROSSCHECK 命令 核对备份文件之后,备份文件的状态会包括 AVALIABLE、UNAVALIABLE和 EXPIRED 三种, 如果备份文件处于EXPIRED 状态, 则说明物理文件已经被手工删除或者损坏。注意,如果备份文件处于 EXPIRED 状态, 应该使用DELETE命令删除该备份文件。

核对所有备份集 RMAN>CROSSCHECK BACKUP;

核对所有数据文件的备份集 RMAN> CROSSCHECK BACKUP OF DATABASE;

核对特定表空间的备份集 RMAN>CROSSCHECK BACKUP OF TABLESPACE SYSTEM;

核对特定数据文件的备份集 RMAN>CROSSCHECK BACKUP OF DATAFILE 4;

核对控制文件的备份集 RMAN>CROSSCHECK BACKUP OF CONTROLFILE;

核对SPFILE 的备份集 RMAN> CROSSCHECK BACKUP OF SPFILE;

核对归档日志的备份集 RMAN> CROSSCHECK BACKUP OF ARCHIVELOG SEQUENCE 3;

核对所有映像副本 RMAN> CROSSCHECK COPY;

核对所有数据文件的映像副本 RMAN> CROSSCHECK COPY OF DATABASE;

核对特定表空间的映像副本 RMAN> CROSSCHECK COPY OF TABLESPACE USERS;

核对特定数据文件的映像副本 RMAN> CROSSCHECK COPY OF DATAFILE 4;

核对控制文件的映像副本 RMAN> CROSSCHECK COPY OF CONTROLFILE;

核对归档日志的映像副本 RMAN> CROSSCHECK COPY OF ARCHIVELOG SEQUENCE 4;

4.6.4 修改备份的可用状态、保存策略 Change命令

Change 命令可以修改备份的状态是可用(available)还是不可用(unavailable)。对 于不可用的备份,还原与恢复期间不会被考虑到,不过执行 delete expired 命令期间也不 会删除这些记录。

例如:

RMAN> change backup of database tag='GOLD' unavailable;

RMAN> change copy of database like '%GOLD%' available;

RMAN> change archivelog 'd:\arc\arch_001.arc' unavailable;

RMAN> change backupset 4981 available;RMAN> change backup of database available;RMAN> change archivelog all available;

RMAN> change archivelog all backed up 5 times unavailable;

当一个给定的备份或者副本根据备份的保存策略的标准而被废弃的时候,RMAN 并不会自动删除这个备份或者副本,而只是标记这个备份为废弃。我们可以用 report obsolete 命令来查看标记为废弃的备份。可以使用 change 命令来将一个备份修改为永 久保留的备份,也可以修改为要保存多少天的备份。还可以使用 change … nokeep 来手 工丢弃一个备份。

举例:将 4421备份集标记为废弃RMAN> change backupset 4421 nokeep;将 4421备份集标记为 7 天内有效RMAN> change backupset 4421 keep until time 'sysdate+7' logs;将 4421备份集标记为永久有效RMAN> change backupset 4421 keep forever logs;废弃的备份集并不真正的删除,如果需要物理删除,则可以用下面的命令:RMAN> delete obsolete;

4.6.5 查看与删除过时的备份信息

列出已经过时的备份:RMAN> report obsolete;

定义 delete 通道:RMAN> allocate channel for delete/maintenance t ype disk;删除过时的备份信息RMAN> allocate channel for maintenance type disk; RMAN> change backupset id delete;RMAN> release channel;当手工删除了数据库的 RMAN备份文件后,要执行以下脚本进行同步:RMAN> allocate channel for maintenance type disk; RMAN> crosscheck backup;RMAN> delete expired backup; —— 删除过期的备份RMAN> delete obsolete; —— 删除废弃的备份RMAN> release channel;在 8i 和 8i 之前的版本只能用 change…delete命令来删除物理备份。

RMAN> change archivelog until logseq=500 delete;

4.6.6 恢复目录记录的删除

如果不加以维护,具有 DELETE 状态的旧备份会一直驻留在恢复目录中。为了解决 这个问题,Oracle 提供了?/rdbms/admin/prgrmanc.sql,这个脚本可以删除恢复目录中具有 DELETE 状态的记录。如果想删除旧的对应物,那么我们可以删除 dbinc 表的记录。例 如,如果要删除对应物是 2 的记录,则可以执行下面的语句:SQL> delete from dbinc where dbinc_key=2;

4.6.7 备份RMAN数据库

RMAN 自己的数据库也需要备份,但是本身很小,而且不是经常发生变化,所以在每次 RMAN备份完成后,可以对 RMAN数据库备份。

$ EXP RMAN/RMAN OWNER=RMAN FILE=RMAN.DMP ROWS=Y GRANTS=Y COMPRESS=Y CONSISTENT=Y 4.6.8 备份检查 验证备份的可恢复性

我们可以通过 Validate 命令来检查是否能备份,如数据文件是否存在,是否存在坏 块不能被备份,通过使用 RESTORE DATABASE VALIDATE; 和 RESTORE DATABASE VALIDATE CHECK LOGICAL; 可以检查最新的备份是否可恢复。这些命令并不真正的执 行恢复,而是检查备份中是否有讹误。如果使用 CHECK LOGICAL 选项,还将检查数 据和索引段中是否存在逻辑讹误。

RMAN> RESTORE DATABASE VALIDATE;

RMAN> RESTORE DATABASE VALIDATE CHECK LOGICAL ;

RMAN> VALIDATE BACKUPSET 218;

RMAN> VALIDATE BACKUPSET bs CHECK LOGICAL ;

RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;

对于数据库与数据文件,可以从指定的 tag 恢复:RMAN> RESTORE DATAFILE 1 FROM TAG=‘tag name’ ;

4.6.9 登记目标数据库:

一个恢复目录可以注册多个目标数据库,注册目标数据库的命令为:$ RMAN catalog rman/rman target user/pwd @db; RMAN> register database

4.6.10 注销数据库

注销数据库不是简单的在 RMAN提示下反注册就可以了,需要运行一个程序包,过程如下:

1. 连接目标数据库,获得目标数据库 ID $ RMAN target internal/password catalog rman/rman@rcdb;

2. 以 RMAN用户登录,查询恢复目录,得到更详细的信息SQL> SELECT db_key, db_id FROM db WHERE db_id = 1231209694; DB_KEY DB_ID

---------- ---------------

1 1237603294 1 row selected.

3. 运行过程 dbms_rcvcat.unregisterdatabase 注销数据库,如

SQL> EXECUTE dbms_rcvcat.unregisterdatabase(1 , 1237603294)

4.6.11 重新启动备份

对于异常结束了的备份,很多人可能不想再重新开始备份了吧,特别是备份到 90% 以上,因为异常原因终止了该备份,那怎么办呢?RMAN提供一个重新开始备份的方法, 通过简单的命令,你就可以只备份那不到 1%的数据了。

RMAN> backup not backed up since time 'sysdate-14' database plus archivelog;

4.6.12 脚本及自动运行

脚本的自动/定时运行可以通过 Windows 计划任务,UNIX/Linux的 Crontab/at命令,或者第三方软件实现,详细介绍有待补充。

(未完成)

1、 编写 rman批处理文件2、 编写 Shell脚本set ORACLE_SID =xxxx 或 export $ORACLE_SID rman target / msglog /xxx.log cmdfile=/xxx/backup.rman

3、 设定执行计划

4.7 高级主题

4.7.1 使用RMAN备份集恢复DB到其他机器 (1常规方法)

用途:利用生产 DB的备份集建立测试环境或备用数据库( 设置成相同的 DBID,不需要连接原始 DB,只需要利用 Catalog)

步骤:

1.准备工作,配置目标DB环境

在目标 DB上设置 ORACLE相关的环境变量:记下生产 DB的 ORACLE_SID,DBID $set ORACLE_SID=ming? 在目标 DB创建与生产 DB相同的目录,将生产 DB的 pfile 文件 FTP到目标DB,或者,在第二步中可以从备份集中进行恢复得到 PFILE.? 在目标 DB 上创建生产 DB 的 RMAN 备份集存放的目录,没有使用 catalog情况时这点必然保持一样? 移植备份集(确定包含控制文件,数据文件,归档文件)到目标 DB? 配置网络连接

2.目标DB在nomount状态下恢复pfile 和controlfile

连接恢复目录和目标数据库:$ RMAN target / catalog rman/rman@rcdb RMAN > set DBID= 3324789823 RMAN > startup nomount RMAN> restore spfile to pfile ‘/home/oracle/pfile’ [from ‘backupset name’]; RMAN> restore controlfile [to 'xx '] from '/xx/ ORADB_ctl_20070111_c-xx';(控制文件的恢复可以参考 4.4.4.6 中其他方法)

3.启动目标DB 到 mount,在目标DB上Restore 和Recover

RMAN> alter database mount; ——可能会提示找不到密码文件,不用理会 如果备份集的位置改变了,需要先进行交叉校验:RMAN> catalog start with '/newdir'; RMAN> crosscheck backup; RMAN> report schema;然后 restore / recover :RMAN> run { allocate channel ch_disk_db_1 device type disk;restore database;recover database until sequence=2412 thread=1;——最后一个 arachivelog的 sequence release channel ch_disk_db_1;

}

4.Resetlogs 打开目标 DB

联机日志文件并没有恢复,所以需要 resetlogs SQL> alter database open resetlogs;

5.重建临时表空间,重建密码文件,立即备份数据库

重建临时表空间:因为备份时不备份临时文件,v$tempfile 中查询为空,所以可以增加一个文件即可:SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 10M;重建密码文件可以通过 orapwd命令重建密码文件

备注:恢复时有时遇到的一个问题RMAN-03002 ORA-27064 错误解决办法: 把数据文件 resize 到 oracle 的 block size 的整数倍SQL> alter database datafile 'xxx' resize n MB;

4.7.2 使用RMAN备份集恢复DB到其他机器 (2复制方法)

使用 RMAN DUPLICATE 命令可 以在保 留目 标数 据库 的基础上 依靠目标 数 据库(Target Database)的备份创建一个副本数据库(Duplicate Database) .该副本即可与目标数 据库完全相同,也可仅包含目标数据库表空间的一部子集。目标站点(Target Site)以及副 本站点(Duplicate Site)甚至可以在同一台机器上。

( 生成新的唯一的 DBID,如果控制文件中仍保存有备份信息,可以不连接 Catalog )

步骤:

1.准备工作,配置副本DB环境

1. 备份主数据库(包括数据文件、控制文件以及所有归档),并把该备份集拷贝到副本 数据库机器同样的目录下。

2. 拷贝主数据库的初始化参数文件 pfile 到副本数据库机器上,并根据需要作相应修改,创建密码文件。

3. 配置主数据库到副本数据库的连接。

2.启动副本数据库到 nomount下,目录数据库必须MOUNT (或OPEN)

$ sqlplus /nolog SQL> conn / as sysdba SQL> startup nomount

3.运行RMAN,分别连接主数据库与副本数据库实例

控制文件中保存有备份信息,可以不连接 Catalog

在副本数据库上:$ rman target sys/change_on_install@MING auxiliary /

4.运行复制命令

如果没有配置自动分配通道的话,需要手工指定至少 1 条辅助通道。

DUPLICATE命令将自动完成:将还原所有数据文件,重新创建控制文件,并利 用新的参数文件启动恢复数据库到一致状态,最后用 resetlog 方式打开数据库,并 重建 redolog

RMAN> RUN { ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK;duplicate target database tocrmnofilenamecheck; RELEASE CHANNEL aux1;}

5.重建临时表空间,立即备份数据库

SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 10M;

附:Duplicate 复制命令的一些高级用法:

1.NOFILENAMECHECK异机恢复需要指定 NOFILENAMECHECK,可以跳过文件名检测,避免 oracle 错 误的领会你的操作意图。

2.指定PFILE如果辅助实例不是用 SPFILE启动,需要指定 PFILE 参数,PFILE文件必须放在运行 RMAN 的客户端上。

3.跳过不需要复制的表空间要跳过只读表空间,在执行 duplicate 命令时指定 SKIP READONLY 子句即可。

要跳过离线表空间,在执行 duplicate 命令之前将其置为 OFFLINE NORMAL 状态即可,RMAN 复制时会跳过只读或离线表空间的数据文件。

要跳过正常的表空间,指定 SKIP TABLESPACE ts_name, …

4.恢复到以前的时间点要恢复到以前的时间点,在 duplicate 命令中指定 UNTIL TIME 'SYSDATE-1' 5.创建过程中重命名控制文件可以使用 restore controlfile from …;或者 dbms_backup_restore 包恢复出控件文件,然后在初始化参数文件 PFILE 中进行正确的设置。

6.创建过程中重命名在线日志文件1.执行 duplicate 命名时指定 LOGFILE子句,手工设置 redo logs 文件名。 例:LOGFILE GROUP 1 ('?/oradata/newdb/redo01_1.log',

'?/oradata/newdb/redo01_2. log') SIZE 200K,)

2.副本数据库初始化参数文件 PFILE中设置 LOG_FILE_NAME_CONVERT LOG_FILE_NAME_CONVERT = 'string1' , 'string2' , 'string3' , 'string4' , ……;将 strin1 替换为 string2,string3 替换为 string4 7.创建过程中重命名数据文件,或改变数据库文件的新的路径1.在初始化参数中重命名:DB_FILE_NAME_CONVERT=‘xxxx’,‘yyyy’2.在 Duplicate Duplicate Duplicate 命令中重命名数据文件: duplicate target database to newdb DB_FILE_NAME_CONVERT=('xxxx', 'yyyyy ');3.使用 SET NEWNAME 命令重命名数据文件SET NEWNAME FOR DATAFILE 1 TO '/xxx/xxx.dbf';4.使用 CONFIGURE AUXNAME 命令重命名数据文件CONFIGURE AUXNAME FOR DATAFILE 1 TO '/xxxx/xxx.dbf';5.重命名临时文件路径SET NEWNAME FOR TEMPFILE '/xxx/xxx.dbf' TO '/yyy/xxx.dbf';

例:一个比较复杂的复制命令如下:

RMAN> RUN {

allocate auxiliary channel newdb1 device type sbt;

duplicate target database to newdb

DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/')

UNTIL TIME 'SYSDATE-1' # specifies incomplete recovery

SKIP TABLESPACE cmwlite, drsys, example # skip desired tablespaces

PFILE = ?/dbs/initNEWDB.ora

LOGFILE

GROUP 1 ('?/oradata/newdb/redo01_1.log',

'?/oradata/newdb/redo01_2. log') SIZE 200K,

GROUP 2 ('?/oradata/newdb/redo02_1. log'',

'?/oradata/newdb/redo02_2. log'') SIZE 200K

GROUP 3 ('?/oradata/newdb/redo03_1. log'',

'?/oradata/newdb/redo03_2. log'') SIZE 200K REUSE;

}

4.7.3 表空间时间点恢复(TSPITR)

用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值