13.服务器管理恢复--RMAN备份(练习20)

在手工备份恢复的操作中,介绍了如何使用操作系统命令拷贝整个文件,拷贝的文件包括数据文件、控制文件和归档日志文件,然年后使用这些文件还原并恢复PRACTICE数据库。在操作过程中,用户必须自己管理备份和恢复操作,必须创建需要拷贝和还原的数据库文件清单。在本练习中,我们介绍RMAN如何使用服务器相关组件题用户处理备份的细节,当使用RMAN进行数据库备份时,RMAN知道需要对哪些文件进行操作。
用户管理与服务器管理的备份与恢复之间的根本不同之处就是:对于用于管理操作DBA必须知道需要备份什么以及需要还原与恢复什么;而对于服务器管理的操作,RMAN将通过一个简单的接口决定需要备份什么以及需要还原与恢复什么,大部分管理任务被省略或简单化了。例如:在前面描述的打开数据库备份,如果是用户管理备份,则在拷贝数据库数据文件之前,必须为每一个表空间创建清单并将表空间置于备份模式,并产生额外的重做;而RMAN备份打开数据库时,并不自动产生额外的重做。
RMAN处理的数据文件备份与用户管理有什么不同?RMAN智能化程度很高,对要备份的数据文件中任何更改的数据块的SCN保持跟踪记录,通过数据库的活动可以对备份文件的更改继续进行。在恢复阶段,RMAN将自动应用需要的重做并使文件处于一致的状态。在备份期间,有可能出现RMAN拷贝的数据块没有被DBW(数据库写入器)进程完全写入到磁盘的现象,从而导致数据块头部与尾部不一致,这种现象称之为“断裂”或“破碎”块,当检测到这样的数据库时,RMAN将重新读取该块,直到完成完整的拷贝。因此,RMAN可以以最小的性能降低为代价对打开的数据库进行备份。
恢复管理器为数据库的备份提供了三种不同的方法:备份、映像拷贝以及代理拷贝。尽管三种方法都能提供恢复或数据库失效时所需要的数据库备份结果,但每种方法都有其优缺点:

一、备份

RMAN备份在选择的备份介质上以自己的格式创建一个或多个物理文件,这些物理文件称为“备份片”,备份可以由数据库、选择的表空间、数据文件、控制文件、归档重做日志或多种混合体组成。

  • 数据文件和控制文件可以合并在同一备份中;
  • 归档日志文件必须与数据文件和控制文件分开备份。

RMAN创建的备份文件(备份片)不能被其他任何工具读取,因此只能用RMAN还原,为了解这些备份是如何创建,需要理解如下基本术语:

  • 通道:通道是从目标数据库到备份介质的通信途径,这个通道类型可以是磁盘或者是“SBT_TAPE”(SBT代表系统备份到磁带),并且通道可以设置许多参数来规定备份片的大小、同时打开的文件数以及文件读取的速度。在实际使用备份开始之前至少要分配一个通道,当然也可以使用多个通道;
  • 备份集:备份集就是当运行备份命令时生成的物理文件的逻辑组合,至少要为一个备份创建一个备份集,但通常使用多个备份集,参数filesperset参数用来控制一个备份集中备份的文件,参数setsize设置每个备份集的最大尺寸。如果分配了多个通道,RMAN将为每个通道创建一个备份集,并对备份集中的备份文件进行分隔,这样每个备份集大小相近;
  • 备份片:备份片是RMAN在备份期间创建的物理文件,该文件将包含来自目标数据文件、控制文件和归档中作日志得到的实际数据块,每个备份集至少包含一个备份片,但也可以包含多个,一个数据文件可以跨越多个备份片;
  • 格式(format):格式是备份期间赋予生成备份片的文件名,当备份到磁盘时需要提供备份片的全路径;
  • 标记(tag):标记是用于标记一个备份的一个有意义的名称。例如,Sunday Level 0备份或许意味着Sun-Lev0,RMAN可以直接使用这个标记从一个指定的备份中重建文件,标记文件最大长度为30个字符,而且一个标记可以用于多个备份;
  • 备份键值:RMAN创建的每个备份都赋予了确定身份的一个唯一序列号。

当执行backup命令时,请考虑如下问题:

1) 备份时数据库处于什么状态?(数据库状态)
2) RMAN备份需要保存到什么地方?(设置目的地)
3) 需要备份的是数据库的那些部分?(数据库文件)
4) 需要拷贝数据库文件的哪些数据块?(增量级别)

下面将讨论备份时需要考虑的这些问题:

1、确定备份集数据库状态:

首先,RMAN可以在两种不同的数据库状态之间进行备份,这两种状态分别是数据库关闭和打开时进行备份。

  • 关闭数据库备份:类似于用户管理的关闭数据库的备份,目标数据库没有打开,但不同于用户管理的备份,RMAN期望数据库处于加载状态,RMAN在关闭数据库备份时必须访问目标数据库控制文件以获取结构信息;
  • 打开数据库备份:类似于用户管理的打开数据库的备份,目标数据库处于打开状态,但RMAN不同之处是:在备份期间没有将表空间置于备份模式,不会产生额外的重做。

2、确定备份集目的地:

接着,当执行RMAN备份命令时,RMAN将生成一个或多个文件(备份片),这些文件除了备份的数据块之外还存储了RMAN的控制信息,为RMAN创建的备份片赋予有意义的名称可以避免无人知道磁盘或磁带上的文件来历或内容。下面是一些可用的格式变量:

  • %d 数据库名称;
  • %n 为数据库名增加1个或多个x字母使长度达到8个字符;
  • %s 备份集编号,这些编号来源于目标控制文件,从1开始每次递增为1,如果控制文件重新生成,则该编号回到1重新开始;
  • %p 备份集内备份片的编号,第一个备份片的号码是1,而且在同一备份集中每个新的备份片递增量为1;
  • %t 备份的时间值,该值是从以前某个参考时间开始到现在的秒数;
  • %u 一个8位字符的值,来自于备份集数字和备份的时间;
  • %c 备份集中的备份片的拷贝数,除非指定为双备份外,否则该值一直是1;
  • %U 生成一个唯一的由%u_%p_%c组成的文件名,如果没有指定备份文件的格式,默认值为%U。

下表列出一些使用这些格式变量的示例,如果备份到磁盘必须指定路径名和文件名,如果没有制定路径名,备份通常情况存储到$ORACLE_HOME/dbs

指定的格式

示例结果

dbinc0_%d_%s_%p_%t

dbinc0_PROD_21_1_447001901

tbsUSERS_%U

tbsUSERS_08ade506_1_1

al_%n_%t_%s_%p

al_PRODXXXX_44157468_41_3

3、确定备份集数据库文件:
下一步,定义属于RMAN备份范围的属于,在执行一个单独的backup命令时,需要制定包含在备份集中的数据文件,这些文件包括数据文件、控制文件和归档日志文件。可以应用如下备份选项:

  • 整体数据库备份:备份集中包含了目标数据库中所有的数据文件和控制文件的数据块,在备份命令之后关键字DATABASE指定进行整体数据库备份,例如BACKUP(DATABASE);
  • 表空间备份:指定表空间所有数据文件的数据块拷贝到备份集中,在备份命令后,用关键字TABLESPACE指定进行表空间备份,例如:BACKUP(TABLESPACE SYSTEM,USER);
  • 数据文件备份:用备份命令后用关键字DATAFILE指定进行数据文件备份,例如:BACKUP (DATAFILE 1,2,3,4);
  • 控制文件备份:数据库控制文件中的所有数据块拷贝到备份集中,在备份命令之后用关键字CONTROLFILE指定进行控制文件备份。例如:BACKUP CURRENT CONTROLFILE。党对系统表空间进行备份时,控制文件自动包含在备份中,因此一个完全的数据库备份包含在当前的控制文件;
  • 归档日志文件备份:每个归档日志文件的所有数据块都拷贝到备份集中,在备份命令之后用关键字ARCHIVELOG指定进行归档日志备份,尽管可以用同样的备份命令备份数据文件、控制文件和归档日志,但RMAN将为归档日志创建ige独立的备份集,例如:BACKUP(ARCHIVELOG ALL)。

4、确定备份集的级别

数据文件由数据块组成,每个块都在更新时赋予一个系统更改号,当进行备份时,每个块从数据文件读出,只有符合备份级别条件的数据块才拷贝到备份集中。因为归档日志文件和控制文件中所有的数据块都将复制,所以备份级别只属于数据文件备份,RMAN不从数据库文件中拷贝空的数据块到备份集中,只有进行映像拷贝时才拷贝空的数据块。 

二、 压缩备份

 RMAN进行备份数据文件时,有两种模式的操作:增量式和完全式。
1、增量式备份(Ineremental Backup):
采用增量式备份策略可以只备份上次增量备份之后更改的数据块,这样可以大大减少备份的数据量,并因此可以减少进行备份和还原所需要的时间和控件。
增量备份有备份级别的概念,级别是0到4之间的整数,当进行增量备份时,数据检查点SCN存储在目标控制文件中,随后的增量备份决定了需要拷贝那些SCN之后的数据块。备份级别0是全集备份级别,在级别为0的备份中,要备份选中数据文件所有使用过的数据块。
增量备份有两种类型:

  • 差异型:差异型备份拷贝最近进行的同级或低级增量备份以来所有改变的数据块。例如,在级别为1的差异型增量备份时,所有最近级别为1的备份的数据将被拷贝;如果以前没有进行过级别为1的备份,则所有最新级别为0的备份以来的数据块都要拷贝,当备份命中使用incremental关键字时,则差异备份是RMAN默认的增量备份类型;
  • 累积型:累积型备份拷贝最新地级别增量备份以来的所有更改过的数据块。例如,在级别为2的累积增量备份中,自从上次级别为1的增量备份以来的所有数据块都要拷贝。如果没有进行过级别为1的备份,则自上次级别为0的增量备份以来的所有数据块都要拷贝。

下面给出了不同增量备份的一个基线,一个星期的每一天为数据文件生成一个备份集,实施这些备份的描述如下:

  • 星期天 进行级别为0的增量备份,数据块#2、#3、#4、#5和#6拷贝到备份集120中,这些块组成了选为备份的数据文件中的所有使用过的数据块。级别为0的增量备份既不是累积型也不是差异型,这是作为增量备份策略的一个基准;
  • 星期一 进行级别为2的差异增量备份,自从星期天备份以来,数据文件中更改的块是#7,因此这个数据块是唯一拷贝到备份集121中的;
  • 星期二 进行级别为2的差异增量备份,自从星期一的备份以来,数据块#2中的一行数据更新了。因为这个数据块是唯一被更新的,所以只有这个数据块被拷贝到备份集122中;
  • 星期三 进行级别为2的差异增量备份,自从星期二的备份以来,数据块#8插入了一行数据。因为这个数据块是唯一更新的,所以只有这个数据块拷贝到备份集123中;
  • 星期四 进行级别为1的差异增量备份,自从最近一次的级别为1或更低级的备份以来,向备份集123拷贝所有更改过的数据块。自从级别0的备份以来,没有进行级别为1的备份,因此自星期天0级备份以来所有更改的数据块都包含在这个备份集124中(#2、#3、#4);
  • 星期五 因为自从星期四的级别1的备份以来,数据增加到数据块#9,所以级别为2的增量备份将#2拷贝到备份集125中;
  • 星期六 因为自从星期五级别2的备份以来,数据块#2中数据更改,所有级别为2的增量备份将#2拷贝到备份集126中;
  • 星期天 进行级别为0的增量备份将所有使用过的数据块拷贝到备份集127中,又开始新一轮的循环备份。

如果选择了差异增量备份策略,那么在星期六级别为2的增量备份后,如果数据文件在星期六丢失,则RMAN将采取以来备份进行还原:

  • 星期天的增量级别为0 包含数据文件中所有使用过的数据块,作为后续还原工作的基准,必须还原级别为0的备份;
  • 星期四的增量级别为1 还原所有自星期天备份还原以来所有更改过的数据块;
  • 星期五的增量级别为2 还原所有自星期四备份以来所有更改过的数据块;
  • 星期六的增量级别为2 还原所有自星期五以来所有更改过的数据;
  • 最后 应用所有自星期四备份以来生成的重做日志。

累积增量备份类似于差异备份,但略有不同。这个图显示了累积增量备份的基线,一个星期的每一天为一个数据文件生成一个备份集:

  • 星期天 进行级别为0的增量备份,数据块#2、#3、#4、#5和#6拷贝到备份集120中,这些块组成了选为备份的数据文件中的所有使用过的数据块。级别为0的增量备份既不是增量备份也不是累积备份,这是作为增量备份策略的一个基准的全备份;
  • 星期一 进行级别为2的累积增量备份,自从星期天备份以来,数据文件中更改的块是#7,因此这个数据块是唯一拷贝到备份集121中的;
  • 星期二 进行级别为2的差异增量备份,自从星期一的备份以来,数据块#2中的一行数据更新了。自从星期天备份以来的两个更改的数据块都拷贝到备份集122中;
  • 星期三 进行级别为2的差异增量备份,自从星期二的备份以来,数据块#8插入了一行数据。自从星期天备份以来的三个更改数据块都拷贝到备份集123中;
  • 星期四 进行级别为1的差异增量备份,向备份集123中拷贝所有最近一次级别为1备份以来更改过的数据块,自星期天0级别备份以来所有更改的数据块都包含在这个备份集中(#2、#7和#8);
  • 星期五 因为自从星期四的级别1的备份以来,数据增加到数据块#9,所以级别为2的增量备份将#2拷贝到备份集125中;
  • 星期六 因为自从星期五级别2的备份以来,数据块#2和数据块#9中数据更改,所有级别为2的增量备份将#2和#9拷贝到备份集126中;
  • 星期天 进行级别为0的增量备份将所有使用过的数据块拷贝到备份集127中,又开始新一轮的循环备份。

如果选择了累积增量备份策略,那么在星期六级别为2的增量备份后,如果数据文件在星期六中午丢失,则RMAN将采取以来备份进行还原:

  • 星期天的增量级别为0 包含数据文件中所有使用过的数据块,作为后续还原工作的基准,必须还原级别为0的备份;
  • 星期四的增量级别为1 还原所有自星期天备份还原以来所有更改过的数据块;
  • 星期六的增量级别为2 还原所有自星期四以来所有更改过的数据;
  • 最后 应用所有自星期四备份以来生成的重做日志。

选择应用差异还是累积备份策略,需要根据备份速度/大小与还原和恢复的速度比较确定:

  • 差异增量备份将比累积备份少拷贝数据块,因此在校对的时间内生成较少的备份片;差异备份的缺点是,因为需要更多的备份集,所以还原时间较多;
  • 因为在还原数据库文件时需要较少的备份集,所有累积增量还原速度比较快,而累积备份的缺点是,需要对统计被的备份拷贝相同的数据块,拷贝相同的数据块意味着生成较大的备份片文件且备份需要较长的时间。

因为备份集中包含了使用过的和更改过的数据块,所有备份集将比映像拷贝要小,使用备份集的主要原因就是因为备份文件比影响拷贝和用户管理操作节省空间,当使用RMAN备份命令保护数据库时,应参考如下情况和建议:

  • 可以从RMAN客户端进行备份,但备份集总在连接到服务器的磁带或磁盘上生成;
  • RMAN并不备份SQL*PLUS配置文件、参数文件、告警日志和口令文件;
  • 必须使用与备份目标数据库相同版本的RMAN执行体。

2、完全备份(Full Backup):

完全备份中,每个数据文件中所有使用过的数据块都拷贝到数据集中,RMAN可以还原完全备份并应用归档中作日志将数据库及时回退到以前的状态。完全备份拷贝的数据块与增量级别为0的备份拷贝是一样的,但却不是增量备份,增量备份选择拷贝的数据块是基于以前的增量备份。例如,通过星期天增量级别为0的备份对一个数据文件进行备份,在星期一进行完全备份,在星期二进行增量级别为1的备份,则在星期二备份的数据块并没有考虑在星期一的备份,而是在最近一次增量备份(星期天备份)以来所有更改过的数据块。

三、 映像拷贝

拷贝命令将生成一个完整数据库文件的映像拷贝这个数据库文件可以是数据文件、控制文件或者是归档日志文件,RMAN生成的文件拷贝需需要应用任何特殊格式化就能与原始文件区别开来。因此当数据库打开或关闭时,该文件可以当做操作系统拷贝的文件应用,唯一不同的是,该拷贝自动在目标数据库控制文件和可选的回复目录中注册了。
级别为0的增量备份或完全备份生成一个数据文件所有使用过的数据块的备份,映像拷贝也完成同样的工作,同时也包含了所有空的数据块。在应用任何其他增量备份或重做之前,RMAN可以应用映像拷贝、完全备份或级别为0的备份作为还原的基准。影响拷贝不能用任何其他增量级别(1-4)生成。RMAN只能在磁盘生成映像拷贝,不能使用SBT_TAPE通道生成影响拷贝。
影响拷贝与差异和累积增量备份相比有一个主要的优点:可以在还原过程中快速应用影响拷贝。例如,如果丢失了数据文件,让RMAN切换到映像拷贝、应用重做,则该数据文件可以访问。但应用映像拷贝最大的缺点是,需要占用与原始空间一样的的磁盘空间。

 四、代理拷贝
Oracle增加了一个称为代理拷贝的功能,以增强发布的介质管理层(MML)API,代理拷贝允许MML控制如何进行数据文件的读取和备份,RMAN向MML层传递需要备份的数据文件列表,MML决定如何进行最佳的备份。使用代理拷贝的优点可以利用介质管理层的高级特性,例如:从磁盘到磁带的数据直接传递。使用代理拷贝的一个缺点是当数据库打开时,每个要备份的数据文件都要在内部设置为准备份模式,类似于手工将表空间设置为热备份模式。

五、 备份类型的比较
了解了RMAN进行的备份、映像拷贝和代理拷贝之后,需要了解三种类型的优缺点,下表提供各类型的优缺点:

备份类型

备份

只包含使用过或更改过的数据块,备份文件比较小。如果需要节约备份空间则生成备份集,备份集动态为备份决定数据库文件。

因为从备份集还原需要从一个或多个备份片中重新构造数据文件,所以恢复的时间较长

映像拷贝

可以快速还原文件拷贝,如果回复时间很关键,可以采用映像拷贝

文件拷贝需要与数据库文件同样的大小,因此需要比备份集更多的空间;每个映像拷贝必须在备份命令中明确指定名称,生成动态脚本比较困难,而且映像拷贝只能写到磁盘上

代理拷贝

可以利用MML的高级特性,较少考虑备份片和备份集的大小

需要第三方供应商支持,增加支持复杂该特性文档不全面

对于本章的练习需要以SYSDBA权限的用户连接到目标数据库,还需要链接到目录数据库上,采用如下的连接步骤:

1  WIN > rman
2  RMAN > connect catalog rman1010 / rman@rcat
3  RMAN > connect target sys / system@practice

 

练习20:创建恢复管理器的映像拷贝

该练习与打开、关闭数据库的手工备份恢复练习非常相似,这里将用RMAN创建PRACTICE数据库中所有数据文件和控制文件的拷贝。
步骤一:创建RMAN Copy脚本
在数据文件拷贝命令,必须要明确拷贝反而每个文件,并为拷贝的文件指定名称。一个生成数据库文件列表的快捷方法就是运行REPORT SCHEMA命令,应用该列表生成RMAN的拷贝脚本,从输出结果拷贝文件名并黏贴到b_copy.rcv中。该脚本将拷贝数据文件和控制文件(尽管RMAN的脚本可以是任何名称和文件扩展名,但最好将这些文件的扩展名设置为rcv)。

 1  run{
 2   allocate channel d1 type disk;
 3   copy
 4   datafile  1  to  ' D:\oracle\CODE\chap12\SYSTEM01.DBF.BAK ' ,
 5   datafile  2  to  ' D:\oracle\CODE\chap12\UNDOTBS01.DBF.BAK ' ,
 6   datafile  3  to  ' D:\oracle\CODE\chap12\SYSAUX01.DBF.BAK ' ,
 7   datafile  4  to  ' D:\oracle\CODE\chap12\USERS01.DBF.BAK ' ,
 8   datafile  5  to  ' D:\oracle\CODE\chap12\TOOLS01.DBF.BAK ' ,
 9   datafile  6  to  ' D:\oracle\CODE\chap12\TS4DROP01.DBF.BAK ' ,
10   datafile  7  to  ' D:\oracle\CODE\chap12\USERS02.DBF.BAK ' ,
11   current controlfile to  ' D:\oracle\CODE\chap12\backup.ctl ' ;
12  }

该命令中首先分配通道,然后执行拷贝命令,RMAN将数据文件映像拷贝到提供的文件名,并且当前的控制文件也被拷贝,当执行考背后释放分配的通道。
步骤二:运行RMAN Copy脚本
连接到目标和目标数据库,运行刚才生成的脚本,然后用@符号来运行RMAN命令文件:

1  RMAN > @D:\oracle\CODE\chap12\b_copy.rcv
13.服务器管理恢复--RMAN备份(练习20)

这些消息说明RMAN成功地编译并执行分配命令,通道的名称为d1,目标数据库PRACTICE的会话ID为142,而生成的通道类型为DISK。
13.服务器管理恢复--RMAN备份(练习20) 可以看到,拷贝命令为数据文件1生成一个映像拷贝文件system01.dbf.bak。
在该脚本的结尾,会得到恢复目录的部分再同步:
在再同步期间,RMAN的拷贝记录将与恢复目录同步,在运行模块的最后,d1通道将从数据库自动释放。
步骤三:验证RMAN Copy脚本
可以通过检查RMAN脚本的输出结果来验证映像拷贝,当然也可以通过其他方法来验证是否成功创建了数据文件和控制文件的影响拷贝。
首先检查D:\oracle\CODE\chap12目录,这个目录将为所有文件生成一个拷贝,接着在RMAN命令提示符下运行list copy命令:

1  RMAN > list copy;
13.服务器管理恢复--RMAN备份(练习20)

这个输出显示了RMAN从以前脚本卡被的每个数据文件,还有以前进行的其他拷贝,每个数据文件都有自己的备份号,应用备份编号可以维护每个映像文件拷贝,标志为S的帘幕提供了备份片的状态(AVAILABLE、UNAVAILABLE或EXPIRED)。如果这些映像拷贝在数据库打开时被还原则必须应用重做,以保证数据库的其他部分与这些文件一致。LIST COPY命令并没有显示控制文件,因为默认显示的文件类型是数据文件,为显示控制文件的拷贝,需要在LIST COPY命令中增加OF CONTROLFILE:

1  RMAN > list copy of controlfile;
13.服务器管理恢复--RMAN备份(练习20) 现在已经用RMAN对一个打开的数据库进行了备份。
如何生成一个用来创建数据库所有数据文件和控制文件映像拷贝的RMAN脚本?在SQL*PLUS中,可以从控制文件动态视图v$datafile中获取数据库所有文件的一个列表,将查询的结果与其他所需要的RMAN命令一起组合到一个文件中。下面的命令可以在SQL*PLUS中生成一个RMAN脚本文件,需要注意的是用SQL内建的函数INSERT和SUBSTR将从每个文件名从其目录中分离出来。
 1  set  feedback off pagesize  0  heading off verify off
 2  set  linesize  100  trimspool on
 3  define dir = ' D:\oracle\CODE\chap12 '
 4  define fil = ' D:\oracle\CODE\tmp\b_copy_whole.rcv '
 5  define div = ' \ '
 6  spool  & file
 7  prompt run {
 8  prompt allocate channel d1 type disk;
 9  prompt copy
10  select  ' datafile  '   ||  file#  ||   '  to  '   ||   ' &dir. '   ||  substr(name, (instr(name,  ' &div ' , - 1 )))  ||   ' .BAK,  '
11    from v$datafile;
12  prompt current controlfile to  ' &dir.back.ctol; ' ;
13  prompt }
14  spool off;

你可能感兴趣的:(rman)