【基础】ORACLE RMAN 体系结构介绍概述 闪回 备份恢复

一. 服务器管理恢复

恢复管理器, 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 数据包的调用。 这也是为什么在没有打开数据库时也能够备份和还原数据库。

七. 备份数据块

即使是高级备份技术,备份的单元依然是数据文件,最终进行备份的OS 使用程序将查看并备份整个文件,因此需要特别注意保证Oracle 数据块的完整性,然后,RMAN 与之不同,因为RMAN 是集成在RDBMS 中的,它是在数据块层面访问数据,这和数据库本身所使用的方式相同。

块级别访问是RMAN 区别于其他备份工具的地方,正是由于rman 采用了这一层面的访问,才使得它具有诸多优势,因此我们可以更有效的利用数据块进行备份和恢复。

7.1 数据块备份概述

数据块备份的工作原理:RMAN 基于备份算法规则来编译要备份的文件列表。基于通道数和同时备份的文件数,RMAN 在Oracle 共享内存段中创建一些内存缓冲区。 一般在PGA中,不过有时内存缓冲区会被推入SGA。 通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些数据块。一个缓冲区被填充时,输入缓冲区中的数据快会被推入输出缓冲区。 数据文件中的每个数据块都会发生这种内存对内存的写操作(memor-to-memory write)。 如果数据块复合备份的标准并且内存对内存的写操作没有检测到讹误(corruption),则这些数据块会保留在输出缓冲区中直至输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或者磁盘)。

一旦所有文件已通过内存缓冲区过滤,就完成了备份片,同时RMAN 会在目标数据库的控制文件中写入备份片的完成时间和备份片的名称。

7.2 块级备份的优点

每个数据块从磁盘移入内存时都会发生内存对内存的写操作,在这个操作期间会检查数据块的讹误。讹误检查是RMAN的一个重要特性。 要注意的是: 执行代理复制操作时是不会使用数据库检查的。

访问数据块时可以选择 空值压缩(null compression),我们可以删除从来没有使用过的数据块(头为0),并在执行内存对内存的写操作时丢弃这些数据块,因此,我们只需要备份使用过的数据块,从而执行更有效的备份操作。

块级备份从生成redo 的角度来说也提供了性能增益。如果是老式的热备份方法,运行热备份模式的表空间生成的redo log数量有失会呈指数增长,这会造成过多的redo 切换,检查点故障和 生成大量的redo log。巨量的archive log会给日志归档位置上的空间管理带来一定困难。

另一方面,由于在备份期间不要求保证数据块的一致性,所以RMAN不要求用热备份模式。RMAN 对数据块的访问允许RMAN 与写‘脏’缓冲区的DBWR进程协调,并且在将这个数据块读入内存以前,它可以等待直至数据块达到一致,因此数据块不会被转存为redo,并且备份中的数据块总是一致的。

当然,RMAN 也不要求用archive log 模式,但是如果是非归档模式,rman 不允许我们在数据库打开时备份一个数据文件,否则会报如下错误:ora-19602:cannot backup or copy active file in NOARCHIVELOG mode。

RMAN 可以使用块级备份提供进一步的恢复新选项: 块介质恢复(block media recovery). 如果出现: ora-1578:block corruption detected, 就不需要恢复整个文件以及执行恢复操作,RMAN 可以简单的恢复坏数据块并执行恢复操作,也就是说数据文件中的其他数据在恢复期间仍然可用。

八. 内存中的RMAN

RMAN 会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。 内存的利用与PGA(有时是SGA)的总体大小有关。 内存缓冲区分为输入缓冲区和输出缓冲区。 输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。

8.1 输入内存缓冲区

备份数据库时,输入内存缓冲区的大小和数据取决于实际执行的备份命令,事实上它主要取决于在一个备份中多路服用(multiplexing)的文件数。 多路复用指的是在同一个备份片中备份某数据块的文件数。为了保持合理范围的内存分配,根据一起备份的文件数,分配内存缓冲大小需要应用下面的规则。

1) 如果备份集内的文件数小于或者等于4个,RMAN 会为每个文件分配4个大小为1MB的缓冲区。缓冲区总和小于或者等于16MB。

2) 如果备份集内文件数多余4个但少于等于8个,RMAN 会为每个文件分配4个大小为512KB的缓冲区。缓冲区总和确保少于或者等于16MB。

3) 如果多路复用的文件数多余8个,RMAN 会为每个文件分配4个大小为128KB的缓冲区。这就确保每个要备份的文件占用512KB的缓冲区内存。

一定要记住在每个通道基础上分配内存大小。因此,如果分配两个通道来备份具有32个数据文件的数据库,RMAN会根据负载均衡来分配两个通道,而不是为每个通道分配16个文件。 如果某些文件比另外的文件大的多,我们可能在一个备份集内备份8个文件,在另一个备份集内备份24个文件。 如果是这样,则用于第一个通道(8个文件)的缓冲区会分配16MB的输入缓冲区(8个文件,每个文件有4个缓冲区,每个缓冲区512Kb),用于第二个通道(24个数据文件)的缓冲区会分配12MB的输入缓冲区(24个文件,每个文件的缓冲区为512KB)。

可以使用如下的查询来监控备份运行时基于每个每个文件的缓冲区大小:

/* Formatted on 2010/6/9 9:37:52 (QP5 v5.115.810.9015) */

SELECT set_count,

device_type,

TYPE,

filename,

buffer_size,

buffer_count,

open_time,

close_time

FROM v$backup_async_io

ORDER BY set_count,

TYPE,

open_time,

close_time;

8.1.1 备份到磁盘时的输出内存缓冲区

除了输入缓冲区之外,RMAN还会根据输出设备分配输出缓冲区。如果备份到磁盘,则RMAN 将分配输出缓冲区以在数据溢出到备份片之前接收来自输入缓冲区的数据块。此时,每个通道有4个输出缓冲区,每个输出缓冲区大小为1MB,因此每个通道的内存区域通常为4MB。

8.1.2 备份到磁带时的输出内存缓冲区

备份到磁带时的内存分配是不同的,这是由于磁带设备的I/0速率较慢。在磁带上备份或从磁带上恢复时,RMAN会为每个通道进程分配4个输出缓冲区,每个缓冲区的大小为256KB,因此每个通道的内存区域通常为1MB。

8.2 用于还原的内存缓冲区

还原操作期间的内存分配与备份操作期间的内存分配稍有不同,这是因为他们的作用是相反的:备份操作是读取数据文件并写入备份位置,而还原操作则是读取备份位置并写入数据文件。 还原磁盘备份时,输入缓冲区的大小为1MB,同时RMAN 会为每个通道分配4个缓冲区。 还原磁带备份时,RMAN 会分配4个输入缓冲区,每个缓冲区的大小等于blksize参数的值(默认值为256kb)。用于还原的输出缓冲区通常为128kb,并且每个通道有4个输出缓冲区。

8.3 RMAN内存利用: PGA 和 SGA

在磁盘上的备份会使用PGA内存空间作为备份缓冲区,PGA 内存空间从用于通道进程的内存空间中分配。如果操作系统没有配置本地异步I/O,可以利用DBWR_IO_SLAVES参数使用I/O从属来填充内存中的输入缓冲区。如果设置DBWR_IO_SLAVES 参数为任意的非零值,RMAN 会自动分配4个I/O 从属协调输入缓冲区内存中的数据块加载。为了实现这一功能,RMAN 必须利用一个共享内存区域。因此,用于磁盘备份的内存区会被推入共享池,如果存在large池,则被推入large池。

如果没有使用磁带I/O从属,会在PGA中分配用于磁带输出缓冲区的内存。设置init.ora 参数BACKUP_TAPE_IO_SLAVES=TRUE,可以使用磁带I/O从属,必要时还可以在spfile里动态修改。 该参数设为true时,rman 会为每个通道创建一个从属进程来帮助备份工作。为了协调这一功能,RMAN 会将内存分配推进SGA。

如果配置了任一种I/O从属选项并且没有配置large 池,则会在SGA的共享池曲终分配内存。如果没有配置large池又要使用I/O从属,建议最好创建一个large池,这个large池的大小基于为备份分配的通道总数(加上1MB用于开销)。

九. 恢复目录

恢复目录存储的是与RMAN 备份有关的元数据。在某种意义上,恢复目录可以看做是保存RMAN 备份和恢复所需的相关信息的副本。我们可以在Oracle 数据库中在用户模式下创建恢复目录,这个恢复目录仅仅是一些数据包,表,索引和视图。 RMAN 中的再同步命令会使得目标数据库控制文件中的内容刷新这些表中的数据。当然,区别在于恢复目录可以包含企业中所有数据库的信息,而控制文件只包含关于它自己的数据库的信息。

在连接恢复目录的连接字符串中,要输入该RMAN目录用户的用户名和口令。与连接目标数据库不同,到恢复目录的连接不是一个sysdba连接,因此不需要sysdba 权限。

一旦连接了恢复目录,就可以手工在同步恢复目录,或者任何备份操作都可以隐式的再同步恢复目录。 再同步是指用目标数据库控制文件中的内容刷新恢复目录中表的信息。

一个恢复目录可以存储多个目标数据库的信息,这样可以集中管理许多不同数据库的备份,通过SQL可以查询恢复目录的视图,由此确定在恢复目录中注册的每个目标数据库的备份数,备份大小和备份范围。

恢复目录中存在数据包DBMS_RCVMAN会给包含该恢复目录的数据库带来混乱,这样的数据库通常称为目录数据库(catalog database)。目录数据库也可能是目标数据库,它也含有SYS模式中的DBMS_RCVMAN 数据包,因此如果选择目录数据库中的DBA_OBJECTS,就会存在模式不同但是名称相同的两个数据包。 这样并不会引起错误或我难题。因为其中一个数据包在数据库创建时由cataproc.sql 构建(在SYS模式下),另外一个数据包则是在创建恢复目录时构建,在常规用户模式下。

恢复目录中的第二个数据包是DBMS_RCVCAT数据包,这个数据包只在RMAN操作期间执行特殊的恢复目录操作。实质上,可以将这个数据包看做恢复目录的DBMS_BACKUP_RESTORE数据包实现。区别仅在于DBMS_BACKUP_RESTORE数据包在目标数据库控制文件中写入备份完成信息,而DBMS_RCVCAT数据包则将这些信息写入恢复目录。

另外,包含恢复目录中信息的基表(base table)并不重要,因为我们不想手工修改这些基表。为了保护恢复目录,Oracle创建了一系列前缀为RC_的视图,使用这些视图可以从恢复目录中析取信息。手工执行任何针对目录对象的DML命令都是非常危险的。还有一点,这些视图是数据库控制文件中相应v$视图的不同实现。

十. 辅助数据库

辅助数据库(auxiliary database)是指在表空间时间点恢复(Tablespace Point In Time Recovery: TSPITR),,复制操作(克隆数据库)或使用RMAN 备份创建备用数据库时,为了还原目标数据库的文件而临时生成的实例。执行上述任一种任务时,我们都要在RMAN中同时连接目标数据库和辅助数据库,这样就可以利用目标数据库控制文件中的备份信息在辅助数据库位置调整这些备份还原。

RMAN>connect target /

RMAN>connect auxiliary sys/pwd@SID

执行这些命令后,RMAN会同时生成到每个数据库的连接,并要求访问目标数据库与辅助数据库中的SYS.DBMS_BACKUP_RESTORE 和 SYS.DBMS_RCVMAN 数据包。 这样一来,RMAN要求用户对辅助数据库具有与目标数据库相同的sysdba权限。由于RMAN必须生成到这两个数据库的sysdba 连接,而且不可能本地连接两个不同的数据库,所以必须至少要配置一个数据库,创建一个口令文件,并且生成到这个数据库的Oracle net 连接。

十一. 版本兼容性

鉴于必须使用多种不同的组件,所以在使用RMAN时必须注意数据库版本的限制。兼容性问题分为5个部分,每一个部分都有一个版本号:

1) RMAN 可执行文件版本(客户端使用程序)

2) 目标数据库

3) 恢复目录模式

4) 恢复目录数据库

5) 辅助数据库(用户复制,TSPITR和备用数据库的创建)

当然,解决兼容性问题的最佳方法是保证这些组件都使用最新的版本,如果使用相同版本的组件,一切都会井然有序。

11.1 目标数据库与RMAN 可执行文件

一个通用规则:尽量保证目标数据库与RMAN可执行文件使用的是相同的版本。如果在目标数据库环境下运行RMAN,做到这一点就很容易。如果从一个集中的客户端接口运行所有RMAN工作,这将非常棘手,它意味着客户端需要安装一个ORACLE_HOME客户端,版本上要对应需要连接和备份的每个数据库版本,该解决方案相当复杂。 使用10G 的OEM 可以解决这个问题,该软件支持集中的客户端接口,因为我们可以从单个控制台使用远程RMAN可执行文件,或者在多个DBA完成备份任务时从控制台使用远程RMAN可执行文件。

11.2 恢复目录数据库与版本目录模式

针对恢复目录数据库与恢复目录模式的兼容性问题,一种简单的方法,就是在高版本的数据库(如11g)中创建该版本的恢复目录,那么这个目录可以注册低版本的数据库。但是低版本不能注册高版本的。

11.3 辅助数据库

从兼容性观点看,辅助数据库必须与要复制的目标数据库采用相同的版本。实际上,最好在复制的数据库中插入与目标数据库相同版本的ORACLE_HOME 主目录。

12. RMAN 进程

先举一个简单的备份例子:

C:>Rman target /

Rman>backup database;

详细的看一下RMAN 备份的全过程:

RMAN 生成到目标数据库的bequeath连接,这就是说RMAN会检查ORACLE_SID变量中的实例名,并在该实例上产生一个服务器进程,然后作为sysdba用户登录。这样我们被连接为内部数据库用户sys,rman会立即产生一个用于执行备份操作的通道进程。 如果使用默认设置,就只分配一个通道。 在没有使用I/O从属的情况下,通道进程会在PGA中分配内存。

随后RMAN 通过编译一个sys.DBMS_RCVMAN调用,从目标数据库控制文件中请求数据库结构信息,显示确定目标数据库的版本。RMAN从控制文件中收集版本信息和控制文件本身的信息,控制文件本身的信息包括控制文件的类型,控制文件中的当前序列号以及控制文件的创建时间。

我们在例子中指定了数据库的完全备份,所以RMAN会请求数据库中每个数据文件的信息,并且判断是否存在离线的数据文件。这些数据文件信息包括每个数据文件所在磁盘和工作方式的信息,由于使用了默认设置,所以只存在一个通道和一个备份集。 这样以来,rman会忽略所有的相似性信息,把注意力放在编译包含在数据集内的文件列表上。

编译了文件列表之后,RMAN 就准备开始执行备份进程。 为了保证一致性,RMAN必须构建快照控制文件。如果存在快照控制文件,RMAN会将这个文件重写为新的快照控制文件。 接下来,RMAN创建对DBMS_BACKUP_RESTORE数据包的调用,该调用可以创建备份片,备份片被构建在默认的文件位置中,UNIX系统中的这个文件位置是ORACLE_HOME/DBS,WINDOWS 下默认位置是: ORACLE_HOME/database。 RMAN 拥有文件列表,所以它可以为磁盘读取操作分配内存缓冲区。假如实例有20个数据文件,这样RMAN 会分配一些大小为128KB的输入缓冲区,由于每个文件有4个输入缓冲区,所以这些输入缓冲区总共就需要10MB内存。RMAN 只分配4个输出缓冲区,每个输出缓冲区为1MB。 所以备份操作总共需要的内存是14MB。

分配了内存之后,RMAN 初始化备份片。备份片会得到一个唯一的默认名。随后RMAN 开始备份。从9i以后,RMAN 以50M 为增量分配磁盘空间,在磁盘上分配50MB的空间并填充输出缓冲区,当输出缓冲区满时,则获取另一个50MB空间,知道将最后一个数据块转存到被分片上。当备份完成时,释放最后一个50MB数据块上的剩余空间。 要注意的是:RMAN 不再检查是否存在用于成功备份操作的足够空间,这是因为空值压缩和新的10g 空白压缩可以极大地减少备份中的数据文件大小。相反,RMAN 将运行它的备份知道空间用完,然后备份失败。

一旦初始化了备份片,通道进程就可以开始数据库备份进程。RMAN会判断是否使用了spfile,如果使用了spfile,RMAN 会自动将该文件备份为备份集的一部分。RMAN 还要在备份集中备份当前控制文件。只要备份了SYSTEM 表空间,就会自动备份当前的控制文件。

完成spfile和控制文件的备份后,就开始读取数据文件并将数据块推入内存,为了实现这一功能,通道进程在磁盘上执行预读(read-ahead)操作,并且将多个数据块同事推入内存。随后发生的是从输入缓冲区到输出缓冲区的内存对内存的写操作,在这个写操作期间,RMAN会判断数据块是否被初始化,或者数据块头信息是否仍然为零。如果数据块未被使用过,就不会发生到输出缓冲区的写操作,同时丢弃这个数据块。如果数据块被使用过,RMAN就会在这个数据块上执行检验和checksum 操作。 如果数据块的头和脚注不匹配,这个数据就会被写入输出缓冲区。

一旦输出缓冲区被填满,就会将输出缓冲区的内容转存储到备份文件位置。 由于RMAN缓冲区填充来之所有数据文件的数据块,所以在转存储文件中的数据块是杂乱无序的。 转储文件只是一个存储段,只有RMAN能够在还原时将这些数据块还原到正确的位置。在备份片中写入数据块时,可以从RMAN影子进程中得到备份的状态信息。RMAN影子进程在目标数据库上检查远程过程调用(RPC),并将信息传递给V$VERSION_LONGOPS视图,以供用户查看。基于在备份操作开始时收集的信息,RMAN会估计每个通道进程完成的百分比,可以通过一下SQL 查看:

/* Formatted on 2010/6/9 22:50:05 (QP5 v5.115.810.9015) */

SELECT sid,

serial#,

context,

sofar,

totalwork,

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

FROM v$session_longops

WHERE opname LIKE ‘RMAN%’

AND OPNAME NOT LIKE ‘%aggregate%’

AND sofar <> totalwork;

在备份进程期间,可以重复执行这个脚本,来查看剩余工作量信息。

一旦一个数据文件的所有数据块都被读入输入缓冲区并且确定状态,RMAN 就会通过将这个数据文件头写入被分片来结束该文件的备份操作。在所有数据文件头都被写入备份片之后,RMAN 会生成最后一个对SYS.DBMS_BACKUP_RESTORE数据包的调用,该调用在控制文件中写入备份信息,这些备份信息包括备份片名,启动备份操作时的检查点的SCN和完成备份操作的时间。

以上就是备份操作的所有过程。如果想进一步了解备份内存的工作流程,可以启动调试选项,从而得到一个完成的进程列表。 不过这个操作可能会影响备份的性能。 最好只在测试环境下使用。

Rman target / debug trace=/u01/backup/rmanback.out

13. 闪回恢复区

闪回恢复区(Flash recovery area: FRA)不是所有RMAN 需要的组件,但是它应该成为RMAN所需的组件。作为10g 版本的新特性,FRA是磁盘上用于存储所有Oracle 恢复文件的特定位置。 恢复文件是指进行介质恢复时所需的所有文件: 完全的数据文件备份,增量备份,数据文件副本,备份控制文件以及归档的日志。 FRA 也存储联机重做日志,块更改跟踪文件以及当前控制文件的镜像副本。


数据运维技术 » 【基础】ORACLE RMAN 体系结构介绍概述 闪回 备份恢复