
RMAN 备份实用程序是按逻辑执行的过程,而写入到磁盘的操作正是Oracle 数据库所擅长的工作。因此,当Oracle 数据库开始改进磁盘写入功能时,RDBMS也会做相应的工作来改进性能。 但是在许多情况下,数据库的大小及其位置都使得它无法备份到磁盘。或者仍然存在要简历数据副本或者离站归档的业务需求。因此还是需要写入到老式的磁带设备。Oracle 数据库的磁带备份需要第三方的辅助设备,这主要是因为市场上流行的连续介质子系统具有完全不同的性质。 RMAN 开发人员通常使用那些大供应商提供的可读写磁带产品,而不去尝试这些不同类型的磁带设备的不同系统调用。Oracle 拥有自己的介质管理软件解决方案,称为 Oracle 安全备份(Oracle Secure Backup: OSB)。 OSB 是完全集成的,RMAN 到磁盘的解决方案,它不需要任何第三方供应商的软件插件,但是OSB 不成熟。
使用磁带备份的原因
第一个理由于数据库的大小。现在的数据库平均大小已经达到100GB,并且这个数据还在继续增加。数据库的大小决定了是否需要执行磁带备份操作。即使磁盘价格在迅速下降,但购买很多磁盘需要的花费很大。 磁盘备份的优点在于快速恢复,而磁盘的备份和还原相对较慢。
第二个理由易管理性。通常,全企业备份策略的实现和执行是由中央系统上的人员集中管理的,这样节省了备份的规模和开支,公司也有能力买大容量的磁带盒式设备来存储更多的数据。
第三个理由可移植性。 为了归档和避免灾难,可以很容易的将一堆磁带离站移动,而硬盘则无法这么方便的传输。
集中备份资源的缺点:会导致备份复杂话,尤其是Oracle 数据库的复杂化。 Oracle数据文件,日志文件和控制文件的复杂性意味着我们不能简单的执行一个OS 作业。让它在空闲时间复制文件。 相反,我们必须使数据库做好执行备份的操作,然后通知开始复制,最后重新配置数据库。
使用RMAN可以避免这个数据库的配置,备份操作可以发生在任何时候,任何情况下,不过,要将备份写入集中的磁带备份位置,就必须执行一些特殊的RMAN 配置。
RMAN 和 介质管理器 概述
通过使用介质管理器,RMAN将数据备份到磁带上。 介质管理器(media manager:MM)是由第三方软件商提供的,它将数据块中的数据流从RMAN通道进程传递到相应的磁带中。 通常,介质服务器位于一个企业网中。 介质管理服务器(Media management Server)是一个集中化系统,在这里可以处理全企业的磁带备份操作。计算机系统必须安装了介质管理(MM)客户端软件才能使用介质管理器。介质管理客户端软件可以连接MM服务器,并且通过网络传输数据。 如果RMAN要使用MM服务器,还需要另外的软件组件。 安装客户端软件之后,我们还必须为介质管理器安装Oracle 模块。 Oracle 模块(Oracle Module)是一个用于Oracle RDMBS 的软件插件,它可以连接RMAN与客户端管理软件,后者可以把数据传送到MM服务器。 Oracle 的这个插件也称为介质管理库(Media management Library: MML)。
介质管理器目录
介质管理器是我们使用的整个备份系统中的一个独立子系统。它有三个组件:与Oracle 结合的介质管理库(MML),介质管理客户端 和 介质管理服务器。MM 服务器有多种组件,这些组件的规范由供应商提供,所有的MM服务器都必须具有一些相同的组件。
介质管理器目录是MM服务器上的信息数据库,它保存了关于物理磁带本身,磁带的访问权限 和 磁带存储内容的相关信息。 备份完成时,介质管理器目录则记录RMAN文件句柄,句柄(Handle)是使用RMAN执行备份操作时创建的备份片名称。 如果执行磁盘备份操作,句柄就是物理文件名。如果执行磁带备份,介质管理器目录中使用的句柄就是备份所在的磁带位置。
RMAN 完成磁带备份操作时会向管理器提供句柄名,介质管理器把该句柄记录在目录中。需要执行还原操作时,RMAN会基于自身的目录向介质管理器请求指定的句柄。随后,介质管理器查找这个句柄,将该句柄与指定磁带关联在一起,同时判断磁带是否有效。 如果磁带有效,介质管理器会使用这个磁带,并且开始将数据流传送回RMAN,这样就可以重新构建数据文件。
介质管理器的其他软件组件
除了 介质管理器目录 以外,MM 管理器还包含两个基本组件:
(1) 设备代理程序(Device agent):设备代理程序是负责使用实际磁带设备并在该设备上传送数据的组件
(2) 自动机器接口(Robotic Interface): 自动机器接口控制所有自动机器的软件,这些自动机器负责在磁带满时或在请求写入已填满的磁带时更换磁带。
Oracle 中的RMAN 不了解这些组件的存在。 RMAN 只是简单地把命令请求发送给MML,随后MM 软件会处理相应的所有事件。 不过,由于备份和恢复的成功取决于这些组件,所以熟悉这些软件组件也是至关重要的。使用RMAN出现的问题大多数都与设备代理程序或自动机器接口有关,但从RMAN 接口几乎察觉不到这些问题。
介质管理库(MML)
MML 是一个库文件,它将RMAN的一致性的备份或还原请求解释为在据诶是管理服务器上的具体的系统调用,以实现要求的操作。 MML 与 MM 客户端软件和MM 服务器软件一样是由同一个供应商提供的,但是我们需要单独购买MML 和取得许可。
首次分配磁带通道时,MML 作为一个集成的库文件加载到Oracle 内存空间,它是Oracle RDBMS 软件的逻辑部分,因此RMAN可以生成正确的MM客户端软件调用。 这个集成实际上非常简单:分配磁带通道时,Oracle 加载一个名为libobk.so 的文件。 这个文件位于ORACLE_HOM/BIN 目录中,它只是一个要使用的MML 文件的符号连接。 在Windows平台上,Oracle 会在搜索路径中查找一个名为orasbt.dll 的库文件。 不论是哪一种介质管理器,在介质管理DDL 文件都名为: orasbt.dll, 介质管理器通常将其写入到WINDOWS/system32 目录中。 如果这个文件没有位于该目录中,在系统路径环境变量中有一个能够查找到orasbt.dll 文件的搜索路径。
连接MML 的接口
链接Oracle 与 MML时,意味着RMAN 可以通过它来传递命令以连接MML,或者进一步说,在数据库服务器上安装的MM 客户端软件。
要指定MM 服务器,我们必须在RMAN 会话中传递指定服务器名的环境变量。 具体来讲,在分配磁带通道时,我们将服务器名指定为环境变量。 在上面的示例中,我们用allocate channel 命令的PARMS 选项来传递环境变量。不同的MM 产品具有不同的环境变量。 如Veritas NetBackup 要求使用NB_ORA_SERV 参数。
Allocate channel t1 type 'sbt_tape' PARMS="ENV=(NB_ORA_SERV=storage1)";
这里的MM服务器名称就是storage1,同时数据库服务器在MM 服务器中已注册并具有写磁带设备的权限。
除了服务器名之外,我们还可以在通道分配时传递其他一些参数来利用服务器上的管理功能。 如Netbackup 允许我们指定用于备份操作的类或调度,而EMC Networker 允许我们指定资源池。
SBT API
RMAN可以不受影响地使用不同的介质管理器,这是因为不管加载哪一种MML,RMAN都会发送相同的命令。Oracle 使用SBT API 来开发RMAN,SBT API 是一种通用API, 提供给Oracle 数据库备份操作编码集成产品的第三方软件商,是RMAN向介质管理器发送命令的工具。
SBT API 负责向MM 服务器发送命令以初始化在磁带上备份文件的创建,还发送基于介质管理器目录中的文件句柄来查找先前备份的命令。 SBT API 可以发送删除备份的命令,也可以写新备份以及从备份位置读取备份。 Oracle RMAN SBT API 有1.1 和2.0 两种版本。 1.1 版本是与Oracle 8.0.x 一起发布和使用的。其后,RMAN 使用2.0 版本的规范生成介质管理器调用,运行备份时我们可以在RMAN输出中看到这个版本号。
RMAN 还会返回通道分配时的初始化的MML 版本,这可以在通道分配期间的RMAN输出中看到。 如果看到了MML 版本信息,也就说明已经成功链接了MML 与 RMAN,否则RMAN输出中就不能解析版本信息。
磁带备份的全过程
概述一下磁带备份的全过程,具体细节是有编写集成MML的供应商来处理。
分配磁带通道时,RMAN 会在目标数据库上生成一个服务器进程,这个服务器进程随后生成sbtinit()的 SBT API 调用,该调用初始化MML 文件并将这个文件加载到内存,同时还向RMAN 返回MML支持的SBT API 版本。 调用sbtinit()后,RMAN还会调用sbtinit2(),sbtinit2()调用将向介质管理器软件提供更多详细的配置信息。
RMAN 分析备份命令后会执行远程过程调用(RPC),RPC 会生成sys.dbms_backup_restore.backuppiececreate 调用。 这时,通道进程将调用sbtbackup(),该调用在指定的磁带位置处理备份片的创建。 Sbtbackup()调用会通知介质管理器,Oracle 将开始推入数据块流,这样介质管理器会为数据流准备好磁带备份。
RMAN 输入缓冲区被填满后会执行内存对内存的写操作把内容写入输出缓冲区。 输出缓冲区被填满时,通道进程调用sbtwrite2(),从而将输入缓冲区的内容写到磁带上。一般情况下,这种方式会在MM 服务器上使用设备代理来访问磁带自身。
当用于特定备份的所有输出缓冲区被清空,并且sbtwrite2() 调用的工作也完成时,通道会话会调用sbtclose2(), 该调用将彻底清空所有介质管理器缓冲区,并且将备份片提交给磁带。
完成备份后,通道进程调用sbtinfo2(),该调用确认介质管理器目录已经记录了备份片。Sbtinfo2() 调用向介质管理器目录请求备份的磁带,磁带位置和备份的完整时间,然后将备份片句柄写入介质管理器目录。
在确认备份片位置后,通道进程调用sbtend(),该调用清楚剩余的资源,并将他们释放,以用于其他数据库操作。最后执行的是收回通道进程的动作,它在目标数据库中完成。
从磁带还原的全过程
在还原操作期间,SBT API 将经过一系列步骤还原磁带备份到数据库中。
还原分配磁带通道时,RMAN 会在目标数据库上创建一个服务器进程。随后通道进程调用sbtinit()来初始化介质管理软件。 这一步骤与备份操作相同,MML 文件被加载到内存中。
基于RMAN中的restore 命令的参数,RMAN 会检查RMAN目录来确定要进行还原的备份句柄名。随后,它使用sbtrestore()调用将请求的备份片句柄传递给介质管理器,该调用告诉介质管理器要为还原操作朱备好相应的磁带,即使用介质管理器目录来查找相应的磁带,如果有必要则向自动机器指令传递取磁带的命令。加载磁带后,磁带必须绕回到备份片的起始点。
为还原准备好磁带后,通道进程调用sbtread2() 函数从磁带设备读取数据并将数据流发送至ORACLE 进程。 这些数据被加载到输入缓冲区,然后被写入到输出缓冲区,最后被写入控制文件指定的数据文件位置。
在磁带上检测到备份片的结束点时,磁带通道进程调用sbtclose() 函数来断开该设备片所在的磁带,这表明Oracle 结束了对这个磁带的操作。 如果执行还原操作时需要多个备份片,通道进程会返回第二个步骤并为另一个被分片调用sbtstore()。
还原操作完成并且RMAN不再请求备份片时,通道进程调用sbtend()函数,该函数清理并释放通道资源以供其他方面使用。 然后通道进程结束,此后介质管理器就可以卸载已经请求过的磁带。
使用 sbttest 和 loadsbt.exe
通常总有一些提示说明是否成功链接了MML 与Oracle,如,来自通道分配的信息说明了MML版本。不过这些指示不能保证最后的成功,在更下层的网络拓扑中(MM客户端或MM服务器)仍然可能出现故障。
Oracle 提供了一个名为sbttest的实用程序,可用它来测试以确保RMAN能够使用MM配置来执行磁带备份操作。 从命令可以调用这个实用程序,该程序执行一个完整的测试:sbttest 会向磁带写一个数据块,然后请求读取这个数据库。 通过这种方式,sbttest 运行备份操作期间执行的所有SBT API 函数,并确认这些函数能否成功。

