一. 服务器管理恢复

恢复管理器, Recovery Manager, 简陈 RMAN。 RMAN 实现一直服务器管理恢复(Server Managed Recovery: SMR)。 SMR 是一种数据库执行所

需要的操作以确保自身备份成功的能力,依赖于Oracle RDBMS 内核中的内置代码可以完成这一功能。 SMR 的功能主要体现在能够减少用户的操

作。


二. RMAN 使用程序

RMAN 是SMR的具体实现,它是Oracle 提供的,RMAN 是一个独立的应用程序,它负责建立到Oracle 数据库的客户端连接,以访问数据库内部的备

份和恢复数据包。RMAN 的核心命令是解释程序,命令解释程序接受所输入的命令,并将这些命令转换为在数据库上执行的远程调用(Remote

Procedure call: RPC).

要强调的事,RMAN 只是做少量的工作。虽然时间的协调非常重要,但是备份和恢复一个数据库的具体工作实际上是由目标数据库上的进程完成的

,目标数据库(target database)指的是要备份的数据库。Oracle 数据库的内部数据包可以将RMAN 中的PL/SQL 块变成系统调用,这些调用即

可以写入数据库服务器的磁盘系统,也可以读取数据库服务器的磁盘子系统。

RMAN 实用程序是Database Utilities的一部分。Database Utilities是一组命令行形式的使用程序,包括Import,export,sql*loader和

dbverify。 典型的安装Oracle 时会自动安装RMAN。RMAN 分企业版和标准版2种,如果只能使用标准版的RMAN,那么RMAN 就只能分配一个通道。

RMAN 实用由两部分组成,可执行文件和recover.bsq 文件。 Recover.bsq 文件实质上是库文件,可执行文件从recover.bsq 文件中析取代码来

创建在目标数据库上执行的PL/SQL 调用。Recover.bsq 文件是整个操作的中枢。这个文件始终保持链接,并在逻辑上构成RMAN 客户端使用程序

。要注意的是: recover.bsq 文件和 可执行文件的版本必须是相同,否则不能正常工作。

RMAN 实用程序有一种独特的,有序的,可预测的用法:解释在目标数据库上远程执行的PL/SQL 调用中的命令。 RMAN 实用程序完成了我们需要

做的所有备份,还原,恢复和处理备份工作。由可执行解释程序负责解释这些程序命令,并基于用户的请求收集信息。 如果要求I/O 操作(即一

条备份命令或一条还原命令),RMAN 会在返回信息时准备另一个过程块,并将这个过程块传递回目标数据库。这些过程负责执行OS的系统调用以

进行指定的读或写操作。

RMAN 与数据库权限

RMAN 需要访问目标数据库上sys模式中存在的各种数据包,还需要具有启动和关闭目标数据库的权限。 因此RMAN 通常以sysdba 用户身份连接到

目标数据库。 如果以不具有sysdba 权限的用户连接到目标数据库,RMAN 会报ORA-01031: insufficient privileges 错误。

在一般情况下,大多数Unix 系统中都有一个Oracle 用户,它是dba组的一个成员。 这是最初安装Oracle 软件的用户,如果以Oracle 用户登录

,在RMAN 中以什么身份连接就变的不重要,它将总是作为sysdba 互用来连接目标数据库,并且能够访问sys 模式,同时也具有启动和关闭数据

库的能力。 在windows 平台上,Oracle 会创建一个ORA_DBA本地组,并将安装Oracle 软件的用户添加到这个本地组中。

如果作为dba组成员之外的用户登录并需要使用RMAN,就必须创建和使用一个口令文件来连接来连接到目标数据库。如果要使用一个客户系统通过

网络来连接RMAN,也需要创建和使用一个口令文件。


三. RMAN 备份的网络拓扑结构

RMAN 是一个客户端应用程序,它通过Oracle net 连接来与目标数据库连接。 如果目标数据库位于ORACLE_HOME 主目录中,运行同样位于这个主

目录中的RMAN 可执行文件,ORACLE net连接就会是一个本地连接。  只要在Oracle 环境中设置了合适的ORACLE_SID 变量,就不需要为这个连接

提供一个Oracle net 别名。 否则,我们必须配置tnsnames.ora 文件,在文件中指定目标数据库,并且在将要运行RMAN的位置上完成这个操作。

一般倾向与在目标数据库的ORACLE_HOME 中运行rman, 这是避免在混合环境中出现兼容性问题的最简单和最直观的方法。 我们需要在这种混合

环境中负责跨越多个Oracle 数据库和版本的备份。也可以使用OEM 来处理。


3.1 远程运行RMAN

如果你负责管理许多数据库。最好在单个客户端系统上将应用程序合并,这样就可以在这个客户端系统上更好的管理tnsnames.ora 文件内容。如

果在RMAN 配置中使用了恢复目录(recovery catalog),由于每次操作RMAN时都会生成一个以上的Oracle net 连接,所以这样的客户端/ 服务

端模型不会让人混淆。另一方面,运行与目标数据库不同系统(或者是不同ORACLE_HOME主目录)上的RMAN时,我们需要建立一个口令文件,这样

在每个目标数据库上都需要更过的配置和管理。

恢复目录: 用于存储RMAN 备份的历史记录,它含有有关备份发生时间,备份内容和备份大小的元数据。 历史记录中还含有恢复备份所需的关键

信息。 元数据是从默认位置(目标数据库控制文件)析取的,并保留在用户模式的数据库表内。

如果要建立一个RMAN 和 目标数据库之间的远程连接,需要创建一个使用专用服务器进程连接到目标数据库的tnsnames.ora 条目。 因为RMAN 不

能使用共享服务器(通常称多线程服务器或者MTS)来建立数据库连接。

MYICD =

 (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = myicd)

   )

 )


3.2 在目标数据库的ORACLE_HOME 中运行本地RMAN

从每个目标数据库中本地运行RMAN 实际上是管理具有数百或者上千 数据库目标的大型企业的唯一方法。 因为RMAN一直具有兼容性问题,将

rman.exe 与目标数据库紧密绑定可在长期运行中节省时间。虽然这种方式部署RMAN 备份存在一些缺陷,但这也是最佳方式.

本地运行RMAN意味着只需要本地连接数据库,而不需要建立口令文件和配置tnsnames.ora 文件。但这种简易性也正是它的缺陷。因为一旦引入

恢复目录或者执行数据库复制操作,就会雨打我们之前的问题。


四. 数据库控制文件

控制文件平常的作用是负责数据库的物理结构,控制文件控制数据库查找物理文件的位置,并控制每个文件当前包含(或应当包含)的头信息,

其内容包括数据文件信息,重做日志信息和归档文件信息。 控制文件还含有与数据库关联的关键文件的每一个文件头的快照(snapshot)。

由于控制文件存储的是数据库文件信息,所以RMAN 会利用控制文件获取备份所需的信息,具体的操作方式是: RMAN 使用控制文件来编译文件列

表,得到检查点信息,并确定可恢复性。通过直接访问控制文件,RMAN可以编译文件列表而不需要用户创建文件列表,这样避免了备份脚本时的

一个非常繁琐的步骤,并且在添加一个新文件时不需要更改这个脚本。控制文件会存储新文件的信息,因此RMAN也能从控制文件中得到这个信息

控制文件还能用作RMAN 目录。RMAN完成数据库任何部分的备份后,会在控制文件中添加该备份的记录,以及说明备份开始和结束时间的检查点。

这也是从Oracle 7 到Oracle 8 版本控制文件大小呈指数增长的一个主要原因:控制文件中存在RMAN记录。控制文件中的这些记录通常成为元数

据,它和实际备份中记录的数据有 ,它也可以存储在恢复目录中。


4.1 在控制文件中重用记录

控制文件将内部数据记录分为两类: 循环重用记录 和 非循环重用记录。 循环重用记录包含可以从控制文件中删除的信息。如: 归档日志历史

信息可以被删除,并且不会影响产品数据库。  非循环重用记录是哪些不能被删除的记录,如果控制文件因这类记录而空间不足,则会删除这些

记录以得到更多的空间。 非循环重用记录包括 数据文件列表 和日志文件列表。

控制文件中的RMAN 备份记录属于循环重用记录类型,如果含有这些记录的控制文件区域已满,这些记录就会删除。这会给恢复带来灾难,致使控

制文件中不存在任何备份记录,就好像从未发生过备份一样。一定要注意的一点: 如果控制文件不含有任何RMAN 备份记录,RMAN 就不能使用备

份来执行恢复操作。

删除记录指发生在控制文件空间已经满的情况下,因此被删除的备份肯定是非常陈旧的。 我门还可以设置更大的时间帧(time frame) 来决定控

制文件删除记录的时间。Init.ora 文件中的CONTROLFILE_RECORD_KEEP_TIME 参数控制删除时间,默认值是7.既报错7天。可以设置成更大的参数

值,如30天。 这些就会京城扩展控制文件,且只有当记录保留时间超过一个月时才会重写这些记录。 一般将该参数设为较大比较好。 如果参数

设为0,将不会发生重用记录,相应地控制文件将不断扩展至无法管理。当然不推荐这么设置。

此外,如果要实现一个恢复目录,就不必担心会循环重用记录。因为只要在CONTROLFILE_RECORD_KEEP_TIME

参数指定的时间内至少实现一次恢复目录同步,那么这些记录将随着时间的推移被删除-- 恢复目录则从不会删除记录。

重新构建控制文件

通常某些条件下需要重新构建数据库控制文件,如重新设置MAXLOGFILES 参数或者MAXLOGHISTORY参数。由于某些参数定义了保存非循环重用记录

的内部控制文件表的大小,所有只有在重新构建控制文件时才能设置这些参数。如果需要更大的内部控制文件,就必须重新构建控制文件。

如果使用RMAN 而不使用恢复目录,就必须重视控制文件的重新构建。执行:

Alter database backup controlfile to trace;

生成的脚本不包含控制文件中标识备份的信息。如果不存在备份记录,就不能在使用这些备份恢复时访问它们,此时所有的RMAN 信息丢失并且无

法恢复。在重新构建控制文件时,只有那些RMAN设置的永久配置参数才被重新构建。 在Oracle 10g有一些新的控制用于生成控制文件中的有限备

份元数据,但仍然需要许多手工操作,并且无法完全生成所有的元数据。因此建议要避免重新构建控制文件。

如果将控制文件备份为一个二进制文件而不是一个跟踪文件,所有备份信息都将被保留。 该命令类似于:

Alter database backup controlfile to '/u01/backup/bkup_cfile.ctl';


4.2 快照控制文件

控制文件是一个非常繁忙的文件,它存储数据库的结构信息,这些信息包括用于恢复的检查点SCN信息。连续的SCN 和文件管理对于数据库的生命

期来说至关重要,因此RDBMS 必须能够持续的使用控制文件。

这样就会为RMAN带来一个问题。RMAN 开始备份每一个数据文件时需要得到一个一致的控制文件视图,此时RMAN 只需要知道备份开始时最新的检

查点信息和文件就够信息。开始备份后,RMAN 需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。除非

RMAN 在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。 但是,锁定控制文件意味着数据库不能执行检查点操作

和切换日志,或则不能产生新的归档日志,这些操作是不可能的。

RMAN 使用快照控制文件(snapshot controlfile)来解决前面提出的问题,快照控制文件是控制文件的副本。 RMAN 只在备份和同步操作期间使

用快照控制文件。 这些操作开始时,RMAN 会根据实际控制文件来刷新快照控制文件,这样会短暂的锁住控制文件,随后,RMAN 会切换到快照并

在备份持续使用这个快照。 这种方式具有读取一致性,且不妨碍数据库活动。

在默认情况下,快照控制文件位于UNIX 平台上的ORACLE_HOME/dbs 目录中,或者是在windows 的ORACLE_HOME/database 目录下。 快照控制文件

的默认名为SNCF<SID>.ORA。 使用configure snapshot controlfile命令可以在任何时候更改快照控制文件名:

Configure snapshot controlfile name to 'location/file_name';


五. RMAN 服务器进程

RMAN 生成一个到目标数据库的客户连接,并创建两个服务器进程。其中主要进程生成对SYS模式中的数据包的调用,从而执行备份和恢复操作,

该进程会在备份和还原期间协调通道进程的工作。

另外一个次要的进程(或影子进程)轮询RMAN中的所有长事务(long-running transaction)并在内部记录信息。 在V$version_longops 视图中

可以查看到下面的轮询结果:

/* Formatted on 2010/6/8 16:49:36 (QP5 v5.115.810.9015) */

SELECT   sid,

        serial#,

        context,

        sofar,

        totalwork,

        ROUND (sofar / totalwork * 100, 2) "%_complete"

 FROM   V$SESSION_LONGOPS

WHERE       opname LIKE 'PMAN'

        AND opname NOT LIKE '%aggregate%'

        AND totalwork != 0

        AND sofar <> TOTALWORK

还可以在v$version 视图中查看这些进程。 RMAN 分配一个通道时,它会在输出中提供如果所示的会话ID信息:

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=19 设备类型=DISK

SID 信息对应与v$session 中的SID 列。

SQL> col client_info format a30

SQL> col program format a15

SQL> select sid,saddr,paddr,program,client_info from v$session where sid=19;

      SID SADDR    PADDR    PROGRAM         CLIENT_INFO

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

       19 A9CCBD10 AA728C44 rman.exe        rman channel=ORA_DISK_1


5.1 RMAN 通道进程

除了默认的两个进程外,在备份活还原操作期间还会为分配的每个通道单独的创建一个进程。 RMAN 将通道是为目标数据库上的服务器进程,该

进程在备份期间协调读取数据文件和写入指定位置的操作,在还原期间则协调读取备份位置和在数据文件位置写入数据块的操作。 通道进程只有

两种类型: 磁盘通道 和 磁带通道。 我们不能为一个备份操作同时分配这两种通道,备份只能写入磁盘或写入磁盘。 与后台RMAN 进程一样,可

以从数据字典(data directory)跟踪通道进程。并且将通道进程在OS 级别(OS level)上与一个SID 关联。 正是这些通道进程的活动被轮询

的影子进程记录到V$SESSION_LONGOPS 视图中。

5.2 RMAN 和 I/0 从属

如果在目标数据库上配置了I/O从属,RMAN 就可以使用I/0从属。 为了用RMAN 备份和还原,有两种可用的I/0从属: 磁盘I/0 从属 和 磁带I/0

从属。

使用DBWR_IO_SLAVES 参数可以配置磁盘I/O从属。 这个参数可以被设置为任意数值,它的主要作用是在将‘脏’缓冲区(即写满的缓冲区)的内

容写入磁盘时唤醒另外的DBWR从属来执行磁盘写操作。 如果参数被设置为非0值(如:1,12或23),RMAN 会自动在每个通道中切换使用4个I/O

从属来帮助将数据库读入RMAN内存缓冲区。 这是一个不错的功能,但是RMAN 分配内存的方式有很大的变化。 只有在OS 平台不支持本地异步或

者禁止Oracle RDBMS使用异步I/O时,DBWR_IS_SLAVES参数才会起到作用,如果支持异步I/O,就不需要使用磁盘I/O从属。

磁带I/O 从属可帮助服务器进程访问磁带设备。 如果BACKUP_TAPE_IO_SLAVES 参数被设置为TRUE,RMAN 会为每个磁带通道进程分配一个I/O 从

属来帮助在磁带位置上执行写操作。 与磁盘I/O 从属不同的是,BACKUP_TAPE_IO_SLAVES 参数只对RMAN 磁带备份起作用。 由于磁带设备不存在

本地异步I/O,我们建议将该参数设置为true。 这有助于保持磁带设备传输,以达到更佳的备份和还原性能。


六. RMAN 使用的SYS数据包

RMAN 服务器进程在协调通道工作时要访问两个SYS数据包:DBMS_RCVMAN 数据包 和 DBMS_BACKUP_RESTORE 数据包, 这两个包包含了目标数据库

中RMAN的所有功能。


6.1  SYS.DBMS_RCVMAN 数据包

DBMS_RCVMAN 数据包用来访问控制文件中的表并将此信息传递给RMAN,使用RMAN 可以构建准确反应数据库结构的备份和还原操作。DBMS_RCVMAN

包负责在执行任何操作前设置time 运算符和校验数据文件头中的检查点信息,并价差文件位置和大小,以及有关节点相似性(在RAC 环境中)和

磁盘相似性的其他信息。 这种信息会影响RMAN的性能,并且RMAN 在构建实际备份/还原命令之前自动执行负载均衡(load-balancing)算法和性

能增强(performance-enhancing)算法。


6.2 SYS.DBMS_BACKUP_RESTORE 数据包

SYS.DBMS_RCVMAN 包访问控制文件并校验所有必须的信息。 这些必须的信息被传递回RMAN服务器进程,RMAN 服务器进程随后会基于recover.bsq

文件中的代码创建一些PL/SQL 块。 这些PL/SQL 块含有对DBMS_BACKUP_RESOTRE 数据包的调用,实际上RMAN 中是由DBMS_BACKUP_RESTORE数据包

来创建系统调用以备份数据文件,控制文件和归档的redo log。 RMAN 接收从DBMS_RCVMAN 数据包返回的信息,并在通道间基于负载均衡算法分

配工作,然后创建一系列DBMS_BACKUP_RESTORE 数据包调用。

在V$SESSION_LONGOPS 视图中可以跟踪的是DBMS_BACKUP_RESTORE 数据包的工作。它执行备份和还原操作,此外还可以以受限方式访问控制文件

。 DBMS_BACKUP_RESTORE 数据包访问控制文件以备份该文件(实际上是控制文件的快照),在备份完成后写入备份信息。 一旦完成了一个备份

集, DBMS_BACKUP_RESTORE 数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名的信息。


6.3 内核中的RMAN 数据包

创建数据库时,运行cataproc.sql 脚本可以默认安装上述两个RMAN 数据包。 数据库创建期间无法跳过这一步骤。所以在8i 以后的每个版本里

都存在rman 包。

这些RMAN 数据包还有一个重要的特性,他们被硬编码到Oracle 软件的库文件中,因此及时没有打开数据库也可以调用这些数据包。 我们知道,

大多数数据包只在数据库打开时才能被使用,不过RMAN可以在数据库实例处于未加载模式或者加载模式时编写对DBMS_BACKUP_RESTORE 数据包的

调用。 这也是为什么在没有打开数据库时也能够备份和还原数据库。



oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html