【IT168技术文档】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.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;"
}
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;
恢复:(这种备份只是增加一个镜像,不用恢复)
主要用于改变备份集的位置,或者创建多个镜像备份,比如将备份集从硬盘备份到磁
带。如果要详细了解,见我在 ITPUB上发的帖子:
http://www.itpub.net/viewthread.php?tid=1007747&page=1&extra=
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)
用户可能错误的删除了几个表,而且还截断了几个表,如果进行整库恢复可能代价比较
高,这时,我们可以执行表空间时间点恢复(tablespace point-in-time recovery, TSPITR)。
为了掌握如何执行 TSPITR,应该理解下面这些术语:
辅助实例(auxiliary instance): 这是我们创建的临时实例,RMAN 使用这个实例执行
TSPITR。完成 TSPITR 后,这个实例可以删除。
辅助集(auxiliary set): 辅助实例上的文件集。包括控制文件、回滚段或者重做段的表 空间、系统表空间、联机日志文件等,还可以选择辅助实例的临时表空间。
恢复集(recovery set): 要执行 TSPITR 的表空间/数据文件集
目标数据库: 实际执行 TSPITR 的数据库
TSPITR 的本质是,RMAN 将要进行时间点恢复的表空间按照设定的条件恢复到辅助 实例上,然后再从辅助实例将表空间传到目标数据库,从而避免整个数据库的恢复,减少恢 复时间,而且这期间其他表空间仍然可用。( 用户管理的备份与恢复也可以使用 TSPITR)
检查TSPITR之后丢失的对象,被丢失对象信息的获取:
SQL> Select owner, name
From TS_PITR_OBJECTS_TO_BE_DROPPED
Where tablespace_name = 'USER01' And creation_time >
to_date( '2004-09-27 11:25:21', 'yyyy-mm-dd hh24:mi:ss' );
进行TSPITR 的基本步骤是(与有些书上的步骤略有不同):
(0) 检查需要恢复的表空间的数据文件备份和控制文件备份是否存在
(1) 验证表空间的可传输性
(2) 准备辅助实例
(3) 执行实际的 TSPITR
(4) 在目标数据库上执行 TSPITR 后的操作。
1.验证表空间的可传输性
RMAN 使用 Oracle 可传送的表空间特性来执行 TSPITR,因此表空间本身必须是可传送
的。许多因素都导致表空间不可传送。
TSPITR 限制
不能还原包含 SYS 用户对象
不能执行 TSPITR 恢复具有复制主表的表空间 不支持使用快照日志的表空间 不能还原含有回滚段的表空间
不能还原含有分区对象(该对象的分区跨越多个表空间)的表空间 表空间中不能含有 VARRAY、嵌套表、外部表对象
TSPITR 不能用于恢复删除的表空间。
可以通过 TS_PITR_CHECK 视图来判断表空间是否可传送。如果表空间不可传送,那 么执行 TSPITR 时就会失败。下面是查询 USERS 表空间是否可传送的语句:
SQL> SELECT OBJ1_NAME "Object Owner",obj1_name "Object Name", obj1_type "Object Type",ts1_name "Tablespace Name",reason
FROM TS_PITR_CHECK WHERE ts1_name='USERS';
如果未选定行,说明 USERS 表空间可传输。
2.准备TSPITR 的辅助实例 (AUXILIARY INSTANCE)
启动 TSPITR 之前,需要准备辅助实例。这是一个不需要 RMAN 参与的手工过程。执
行下面的步骤来创建辅助实例:
u 创建口令文件
u 创建辅助实例的参数文件: 编辑辅助实例参数文件的一个简单方法是把目标数据库的参数文件改一下即 可。如果目标数据库用的是 SPFILE,那么在 SQLPLUS 中执行 CREATE PFILE FROM SPFILE 就可以生成参数文件。
注意:
control_files 设置为辅助实例上的文件名
db_name = 目标实例
lock_name_space 如果辅助实例与目标数据库同一主机,必须设置 instance_name service_names 取一新名,如 AUX db_file_name_convert 数据文件名的转换
log_file_name_convert 日志文件名的转换
注释掉 log_archive_start 参数
u 如果在 Windows NT 上运行 Oracle,需要使用 oradim 来添加数据库服务
u 启动辅助实例,如有必要,配置 tnsnames.ora,测试是否连通。
3.执行实际的TSPITR
例子: 恢复用户误删除的某个重要的表。将实例 MING 的 USERS 表空间恢复到 SCN
是 3818161 的时候。
启动辅助实例:
C:\>SET ORACLE_SID=AUX1
C:\>SQLPLUS /NOLOG
SQL> CONNECT / AS SYSDBA SQL> STARTUP NOMOUNT;
请注意,SET ORACLE_SID=AUX1 很重要,这样就可以不用配置 TNSNAMES.ORA
执行实际的TSPITR 首先要连到目标数据库和辅助实例。可以联到恢复目录,也可以不连到恢复目录: C:\> SET ORACLE_SID=AUX1
C:\> RMAN TARGET /@MING CATALOG RMAN/RMAN@RECO AUXILIARY /
RMAN> RECOVER TAB LESPACE USERS UNTIL SCN 233646;
…
等待完成表空间的恢复。当然也可以用 UNTIL TIME 或者 UNTIL SEQUENCE 子 句,例:
RMAN> run {
allocate auxiliary channel c1 device type disk;
recover tablespace user02 until logseq 9;
}
( 这里有些版本有一个 ORACLE的 BUG,执行到最后可能会报错,需要打补丁 ?? )
可以改变辅助集/恢复集数据文件的位置和名称:
set newname for datafile 5 to 'c:\demo\user01.dbf';
configure auxname for datafile 1 to '/backup/xxx.dbf’;
在初始化参数文件中用 DB_FILE_NAME_CONVERT 进行转换
10g 中增加了auxiliary destination ,更方便
RMAN> recover tablespace user01 until logseq 19 auxiliary destination 'd:\auxiliary';
4.执行TSPITR 后的操作
首先应该重新连接 RMAN与目标数据库,并且备份刚恢复的表空间。完成备份后, 需要将表空间联机(RMAN 在 TSPITR 后使表空间脱机)。最后,我们还要关闭或删除辅 助数据库。
4.7.4 块媒体恢复 Block Media Recovery (BMR)
产生块损坏的原因一般是间断或随机的 I/O 错误或者是内存的块错误。要恢复的坏块 信息可以从报警与跟踪文件,表与索引的分析,DBV 工具或第三方媒体管理工具以及具体 的查询语句中获得。
1. DBV 工具 dbv file=EYGLE.DBF blocksize=8192
2. RMAN> backup validatedatafile 4; -- 或者 BACKUP VALIDATE DATABASE
备份的 坏 块 信息 保存 在 V$BACKUP_CORRUPTION 、 V$COPY_CORRUPTION 和
V$DATABASE_BLOCK_CORRUPTION 视图中。
V$BACKUP_CORRUPTION 显示历史讹误的视图 V$DATABASE_BLOCK_CORRUPTION 显示当前数据块讹误的视图。 一旦修正了数据库的块讹误,就需要重新运行 BACKUP VALIDATE DATABASE 命令,
然后确认 V$DATABASE_BLOCK_CORRUPTION 中没有其他讹误。
RMAN 可以备份包含损坏数据块的数据文件,通过设置 set maxcorrupt 可以跳过指定
个数的坏块来避免备份失败。
RMAN> set maxcorrupt for datafile 1 to 0;
在 Oracle9i中可以用 RMAN来执行块级的恢复,而且恢复期间数据文件可以是联机状 态。RMAN通过 Block Media Recovery(简称 BMR)来执行块级恢复操作。假设我们在查 询一个 Oracle 表的时候接收到下面的错误:
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号 5,块号 97)
ORA-01110: 数据文件 5: 'E:\xxxx.dbf'
那么我们就可以在 RMAN中用 BLOCKRECOVER 命令来修复:
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK97; 启动 blockrecover 于 03-9月 -06 正在启动全部恢复目录的 resync
完成全部 resync
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在从数据文件副本 E:\xxxx.bak 恢复块
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 03-9月 -06
恢复V$DATABASE_BLOCK_CORRUPTION 视图中列出的坏块:
RMAN> blockrecover corruption list [ restore until time 'sysdate - 10' ];
恢复指定坏块:
RMAN> blockrecover datafile 2 block 12,13 datafile 9 block 19;
RMAN> blockrecover tablespace system dba 44404,44405 from tag "weekly_backup"; RMAN> blockrecover tablespace system dba 44404,44405 restore until time 'sysdate-2';
4.7.5 使用恢复目录恢复前一个对应物
在不完全恢复完成之后,通常需要使用 resetlogs 选项来打开数据库。resetlogs 表示 一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期 也被称为一个对应物(incarnation)。每次使用 resetlogs 选项来打开数据库后都会创建一个 新的数据库对应物。
使用 RMAN可以进行穿越 resetlogs 的恢复,即可以恢复到前一个对应物。10g 版本 增强了这方面的功能。
(1) 使用恢复目录的情况使用恢复目录的情况下,恢复前一个对应物是非常简单的。 首先,用list incarnation;来显示有哪些对应物:
RMAN> list incarnation;
数据库 Incarnations 列表
DB 关键字 Inc 关键字 DB 名 DB ID CUR 重置 SCN 重置时间
1 | 2 | MING | 2600315304 | NO | 1 | 20-4 月 | -06 |
1 | 854 | MING | 2600315304 | NO | 3407561 | 19-8 月 | -06 |
1 | 4368 | MING | 2600315304 | NO | 3794049 | 29-8 月 | -06 |
1 | 4437 | MING | 2600315304 | NO | 3794728 | 29-8 月 | -06 |
1 | 4639 | MING | 2600315304 | YES | 3794935 | 29-8 月 | -06 |
接下来,决定恢复到哪个对应物
比如,决定恢复到上面的 4437,
方法:在 NOMOUNT 状态下用下面的命令:
RMAN> reset database to incarnation 4437; 下面是具体的恢复步骤的一个演示(输出略去): RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> reset database to incarnation 4437; RMAN> restore controlfile;
RMAN> alter database mount;
RMAN> restore database until scn 3794934;
RMAN> recover database until scn 3794934;
RMAN> alter database open resetlogs;
上面的例子中,我们最大可恢复到的 SCN 就是 3794934,因为 4437 的下一个对
应物的重置 SCN 是 3794935。
(2) 不使用恢复目录的情况
不使用恢复目录的情况下,要恢复前一个对应物就必须要能恢复到前一对应物的控 制文件。不使用恢复目录,我们就无法使用 RESET DATABASE TO incarnation_num 命 令。
首先看看有哪些对应物:
RMAN> list incarnation;
数据库 Incarnations 列表
DB 关键字 Inc 关键字 DB 名 DB ID CUR 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 MING 2600315304 NO 3501920 20-8 月 -06
2 | 2 | MING | 2600315304 | NO | 3785052 | 29-8 月 | -06 |
3 | 3 | MING | 2600315304 | NO | 3794049 | 29-8 月 | -06 |
4 | 4 | MING | 2600315304 | NO | 3794728 | 29-8 月 | -06 |
5 | 5 | MING | 2600315304 | NO | 3794935 | 29-8 月 | -06 |
6 6 MING 2600315304 YES 3976301 03-9 月 -06
假设我们要恢复到 5,6之间,那么就要看看有没有控制文件的备份的 SCN 在 3794935
到 3976301。我们使用下面的命令:
RMAN> LIST BACKUP OF CONTROLFILE BY FILE;
控制文件备份列表
===========================
CF Ckp SCN Ckp 时间 BS Key S 段数 副本数 标记
---------- ---------- ------- - ------- ------- ---
3976095 | 03-9 月 | -06 34 | A 2 | 1 | TAG20060903T170136 |
3959239 | 03-9 月 | -06 30 | A 1 | 1 | |
3959170 | 03-9 月 | -06 29 | A 1 | 1 | |
3958983 | 03-9 月 | -06 28 | A 1 | 1 | |
3958937 | 03-9 月 | -06 27 | A 1 | 1 |
3816575 | 30-8 月 | -06 11 | A 2 | 1 | TAG20060830T064447 |
可以看出,上面的列表中,控制文件都是可以用的。接下来找到一个具体的含有控制文
件的备份:
RMAN> LIST BACKUP OF CONTROLFILE;
备份集列表
===================
……
段名:E:\TEST\C-2600315304-20060830-07
控制文件包括: Ckp SCN: 3818213 Ckp 时间:30-8 月 -06
……
假 设 我 们 使 用 E:\TEST\C-2600315304-20060830-07 , 那 么 接 下 来 我 们 需 要 用
DBMS_BACKUP_RESTORE 包来从这个文件中恢复控制文件。(在 SQLPLUS 中运行)
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP NOMOUNT;
SQL>DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL01.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL02.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL03.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/
SQL>ALTER DATABASE MOUNT;
重新联到 RMAN 后 再来运行一下 LIST INCARNATION;
$ RMAN TARGET /@MING NOCATALOG; RMAN> LIST INCARNATION;
数据库 Incarnations 列表
DB 关键字 Inc 关键字 DB 名 DB ID CUR 重置 SCN
重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 | 1 | MING | 2600315304 | NO | 3501920 | 20-8 月 | -06 |
2 | 2 | MING | 2600315304 | NO | 3785052 | 29-8 月 | -06 |
3 | 3 | MING | 2600315304 | NO | 3794049 | 29-8 月 | -06 |
4 | 4 | MING | 2600315304 | NO | 3794728 | 29-8 月 | -06 |
5 | 5 | MING | 2600315304 | YES | 3794935 | 29-8 月 | -06 |
可以看出来,我们已经恢复到想要的对应物上了。接下来:
RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;
4.7.6 RMAN增量备份
通过增量备份,RMAN 允许用户只备份上次增量备份操作以来被修改过的数据块。
N 级别增量备份备份从最近的 N 级别或者更小级别以来的所有更改过的数据块内容。0 级备份与全备份的不同就是 0 级备份可以作为其它增量备份的基础备份而全备份是不可 以的。
增量备份的优点: 节约备份时间节省备份磁带或者磁盘空间 降低网络带宽要求
增量备份的缺点: 恢复时间可能要长。
增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。
差异增量备份(Differential Incremental Backup)
差异备份是默认的增量备份类型,备份上一次在同级或者更低级别进行备份以来所
有有变化的数据块。
RMAN>backup incremental level n (incremental) database;
累积增量备份(Cumulative Incremental Backup)
包括上一次低级备份以来所有有变化的数据块。累计增量备份增加了备份的时间, 但是因为恢复的时候,需要从更少的备份集中恢复数据,所以,为了减少恢复的时候, 累计增量备份将比差异增量备份更有效。
RMAN>backup incremental level n (cumulative) database;
9i : 不管怎么样增量备份,还是需要比较数据库中全部的数据块,这个过程其实是一个漫 长的过程,而且由于增量备份形成多个不同的备份集,使得恢复变的更加不可靠而且速度慢, 所以增量备份在版本 9中仍然是鸡肋,除非是很大型的数据仓库系统,没有必要选择增量备 份。
10g : 在增量备份上做了很大的改进,可以使增量备份变成真正意义的增量,因为通过特
有的增量日志,使得 RMAN 没有必要去比较数据库的每一个数据块,当然,代价就是日志
的 IO与磁盘空间付出。另外,10g 通过备份的合并,使增量备份的结果可以合并在一起,
而完全的减少了恢复时间。
1. 基本备份(0 级备份)
Level 0 是增量备份策略的基础(注意与 Full备份区别)。执行增量备份操作时,首先需 要的是基本备份(incremental base backup),增量备份必须有一个基本备份。基本备份的增量 级别是 0,如果没有 0 级备份,那么其它级别的备份会自动转成基本备份。
0 级备份举例:
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> incremental level 0
5> filesperset 4 #定义每个 backupset 的最大文件数
6> format "/oracle/backups/sunday_level0_%t"
7> (database);
8> release channel dev1;
使用 LIST语句查看,数据库备份集的列表显示中, "type" 将显示 "Incremental","LV"
列将显示"0" 。
2. N 级备份
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> incremental level 1/2/3/4
5> filesperset 4 #定义每个 backupset 的最大文件数
6> format "/oracle/backups/sunday_level0_%t"
7> (database);
8> release channel dev1;
9> }
3. N 级备份的规划
根据业务需求、数据量、恢复所需要的时间等方面考虑,制定合理的备份计划。 例: 一个典型的增量备份案例如下:
星期天晚上 - level 0 backup performed 星期一晚上 - level 2 backup performed 星期二晚上 - level 2 backup performed 星期三晚上 - level 1 backup performed 星期四晚上 - level 2 backup performed 星期五晚上 - level 1 backup performed 星期六晚上 - level 2 backup performed 星期天晚上 - level 0 backup performed
4. 增量备份的恢复
同普通的完全恢复: restore recover
RMAN自动确定和使用需要的备份集。
4.7.7 RMAN备份的优化
可以在 RMAN配置中设置备份的优化,如
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
如果优化设置打开,将对备份的数据文件、归档日志或备份集运行一个优化算法。
RMAN备份操作主要是完成以下三个步骤
1、从磁盘上读取数据
2、在内存中处理数据块
3、写入数据到磁盘或磁带
以上的读写操作可以同步或异步的完成,在同步 I/O操作中,一个时间只允许有一个 IO 操作,但是在异步 I/O操作中,一个时间允许有多个 IO操作。因此,备份与恢复的调优主 要集中在以下几个方面:
1、 提高同步或异步 I/O操作能力
在 支 持 异 步 操 作 的 操 作 系 统 上 , 可 以 通 过 设 置 TAPE_AYSNCH_IO,DISK_ASYNCH_IO 和 BACKUP_TYPE_IO_SLAVES 来支持异步操 作,提高写的能力。
2、 提高磁盘读能力
可以在 backup命令后通过设置 DISKRATIO来保证从多个磁盘上读取数据,保证 连续的数据流。
3、 正确设置缓冲区与参数值
设置 LARGE_POOL_SIZE , 使 备 份 可 以 使 用 连 续 的 缓冲 池 , 通 过 设 置
DB_FIL_DIRECT_IO_COUNT 可以提高缓冲区的利用。如果使用磁带备份,还可以设 置 BACKUP_TYPE_IO_SLAVES 来提高磁带的写能力。
4、 采用并行备份
开辟多个通道,可以实现并行备份与恢复
4.7.8 DBMS_BACKUP_RESTORE 包
这个包是 RMAN 备份与恢复的核心,在调试模式下,RMAN 会输出它调用的每一条命 令:
C:\> rman debug target /@tlgaxz catalog rman/rman@reco trace=debug.txt
常用命令:
restoreSetDataFile 指示还原操作的开始(但是不会执行实际的还原操作) restoreSetDataFileTo 定义要还原的数据文件和该文件的还原位置 restoreControlFileTo 定义控制文件的还原位置
restoreSpfileTo 定义要还原的 spfile 的位置
restorebackuppiece 执行实际的还原操作,这个函数的一个参数是备份文件名
devicedeallocate 释放 deviceallocate 函数所分配的设备 deviceallocate 分配用于连续 I/O的设备 applySetDataFile 指示增量还原操作的开始 applyDataFileTo 定义数据文件的增量还原位置 applybackuppiece 执行实际的还原操作 resetoreSetArchivelog 指示归档日志还原操作的开始
restoreArchivelog 定义要还原的归档的重做日志序列和线程
例:使用 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('d:\spfile.ora');
DBMS_BACKUP_RESTORE.restorebackuppiece('d:\C-2600315304-20060829-00',
DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/