14.Oracle10g服务器管理恢复--RMAN备份(练习21.22.23)

练习21:创建恢复管理器的整体拷贝

在本练习中,将生成一个关于整个PRACTICE数据库的全部数据块的备份,其中包括控制文件,将会在数据库打开和关闭时分别进行整理数据库的备份。如果没有将目标数据库设置为ARCHIVELOG模式,则必须在数据库加载但没有打开时进行备份操作。在练习的过程中,将讲解执行整体数据库备份的基本命令,当运行该脚本时,屏幕上输出将与list命令所得的结果相对应。
步骤一:生成RMAN打开的数据库备份脚本
在本任务中将要在数据库打开时进行备份操作,下面实现的脚本与上一个练习的脚本基本相同,只有一个例外,数据库是打开的而不是关闭的:

1 run {
2   allocate channel dl type disk;
3   backup incremental level=0 database
4   format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
5   tag = 'WHOLE_INC0';
6 }
  • 第1行:backup命令必须包含在run命令中,Run命令必须在同一行中紧跟一个左花括号。Run命令标明了作为一个单元运行的代码段,所有在花括号中包含的命令组成了命令单元;

  • 第2行:备份使用通道从数据文件向备份介质拷贝数据块,给在运行单元中需要的备份通道分配一个名称;
  • 第3行:backup命令确定了计划保护的数据库文件内容,在这一行中,将要为整个PRACTICE数据库备份数据块,当备份SYSTEM表空间时,RMAN包括了一个当前控制文件的备份,Backup database命令以第5行的分号作为结束;

  • 第4行:format关键字告诉backup命令将备份片文件放置在何处以及备份片的名称是什么。本行语句通知RMAN在D:\oracle\CODE\chap12目录生成一个文件,如果没有制定format,RMAN将以%U命名备份片并将其保存在$ORACLE_HOME/database目录下;

  • 第5行:Tag可以提供容易辨认的名称,以便在RMAN部署中识别备份。虽然可以通过备份集的数据自编号查找一个制定的备份集,但是tag有助于更简单地管理备份,Tag可以重用,如果再次运行该备份脚本,则有两个备份集都有WHOLE_INC0标记;

  • 第6行:这个右花括号与第1行的左花括号相匹配,这个括号标志着run命令的结束,所有在run命令中的命令编译并作为一个单元来执行。

这个脚本最有魅力的地方是:它如此简洁!只需要指定RMAN去备份数据库,RMAN会自动查询目标数据库的控制文件为备份的数据文件生成一个列表,并在备份集中生成存储数据块的文件。RMAN知道需要拷贝那些块并忽略那些不需要的块。
步骤二:运行RMAN打开的数据库备份脚本
连接到目标数据库PRACTICE和目录数据库RCAT后,执行前面任务中的备份数据库脚本:

1 RMAN>@D:\oracle\CODE\chap12\b_whole_inc0.rcv

当脚本运行的时候,将会有很多RMAN的消息,下面的一些消息是备份时出现的输出结果,一些重要的输出消息用红色边框标示出来:

这个输出显示了下面几个重要的问题:

  • Sid=140 当在PRACTICE数据库上分配了通道来执行备份时,连接的会话id是140;
  • Startging incremental level 0 datafile backupset 该备份是一个增量级别为0的备份,所有数据文件中全部使用的数据块将拷贝到其中一个备份片中;

  • Piece handle= D:\oracle\CODE\chap12\db_PRACTICE_9_1_713135460这个文件是实际包含了整个PRACTICE数据库数据块级备份的文件。在format语句中应用的替代变量用于这个文件名(%d数据库名=PRACTICE, %s备份集数=9, %p备份片编号=1,%t备份时间=713135460);

  • Elapsed time:00:00:55 备份使用为55秒;
  • Including current controlfile in backupset;Including current SPFILE in backupset 当前的控制文件与参数文件一起被拷贝另外一个备份集中,文件名称为D:\oracle\CODE\chap12\db_PRACTICE_10_1_713135515;

步骤三:验证RMAN打开的数据库备份脚本
前面运行了备份操作,下面使用LIST命令来检查已经运行的备份结果:

1 RMAN>list backup;

 

这个输出提供了刚才生成备份的大量信息:

  • List of backup sets 备份集键值是57, 该键值是这个RMAN备份运行的唯一表示。注意这个数字与实际运行备份所得到的输出是一致的,备份在3月8日运行并完成,LV是备份的级别,0级备份包含了每个数据文件中所有使用过的数据块;
  • List of backup pieces 该备份集有两个个备份片,包含了数据块的实际操作系统文件是D:\oracle\CODE\chap12目录下的db_PRACTICE_9_1_713135460和db_PRACTICE_10_1_713135515,RMAN脚本中format语句产生这个文件名;
  • List of datafile included 列出了这个备份中包括的每个数据文件,LV列显示了数据块拷贝的级别,type则显示该备份是一个增量文件备份,可以浏览每个数据文件备份的检查点SCN值;

验证备份工作的最后一个步骤就是在操作系统下,定位到D:\oracle\CODE\chap12目录下,在这里将会有db_PRACTICE_9_1_713135460和db_PRACTICE_10_1_713135515的备份片文件,所有使用过的数据文件块和整个控制文件分别包含在这两个个文件中。
数据块文件的大小为457M。请思考:所有数据文件的总和大约是810M,那么如何将810M大小的文件压缩到只有457M的文件中呢?依据是只有使用过的数据块才拷贝到备份片中。假定有20M的索引表空间,因为只需要存储少量的索引,所以只可能用20-50个数据块,而表空间其他的数据块没有使用。因此,当RMAN只拷贝该数据文件中使用过的数据块,这就是RMAN如何在备份文件中节约空间的原因。
步骤四:运行RMAN关闭的数据库备份脚本
当控制文件加载但数据库没有打开时,可以用RMAN来备份关闭的数据库。如果数据库完整地关闭了,则所有数据文件都在头部包含了一个一致的SCN值,在数据文件备份期间,这个数据文件一致的SCN将保存在RMAN备份的控制文件中,如下所示:

 1 shutdown immediate;
 2 startup mount;
 3 run {
 4   allocate channel dl type disk;
 5   allocate channel d2 type disk;
 6   backup database incremental 0
 7   format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
 8   tag = 'WHOLE_INC0_CLOSED';
 9 }
10 alter database backup controlfile to 'D:\oracle\CODE\tmp\backup.ctl' reuse;
11 alter database open;
  • 第1行 在备份一个关闭的数据库之前,该数据库必须要关闭,在RMAN提示符下,可以执行shutdown和startup等数据库控制命令;
  • 第2行 在运行任何RMAN备份命令时,必须将数据库的控制文件加载,因为所有的数据库模式信息都保存在目标控制文件中,同时,RMAN备份操作在该控制文件中进行存储,所以目标控制文件必须能被目标实例打开;
  • 第4-5行 在这个备份过程中,RMAN将为备份打开两个通道,每个通道在目标数据库上创建一个会话,并在磁盘上打开一个备份片。多个通道允许RMAN以并行方式执行数据块拷贝操作,使用多个通道使RMAN提高向磁盘或磁带的输出速度;
  • 第7-8行:注意,FORMAT和TAG关键字的顺序不同,在backup命令中,可以交换这两个关键字的顺序;
  • 第10行 在RMAN提示符下,可以运行其他数据库控制命令,在这一行中,将一个控制文件的备份拷贝保存在备份目录下,这个alter database命令与RMAN的backup命令不同,因为这个控制文件的拷贝没有记录到目标数据库控制文件或目录表中;
  • 第11行 当完成备份后,打开数据库。

为了运行刚才生成的备份脚本,启动RMAN并连接到目标数据库PRACTICE和目录数据库RCAT上,使用@标识符运行刚才创建的脚本。

1 RMAN>@D:\oracle\CODE\chap12\b_whole_inc0_closed.rcv;

当运行完成这个关闭数据库的备份脚本后,可以使用list命令来查看备份集编号、备份片和备份的文件,尤其注意的是,一个备份命令生成两个备份集和两个备份片,原因是该备份分配了两个通道。
注意这个输出与步骤二的输出基本相同,不同的是这里生成了两个备份集并写入到各自的备份中。
简而言之,已经为备份PRACTICE数据库中的所有数据文件以及当前的控制文件生成了RMAN备份脚本可以运行该脚本并观察其输出结果,然后用RMAN LIST命令、用SQL查询目录数据库并检查操作系统上的文件来验证备份的结果。

 

练习22:创建恢复管理器的增量式备份

前面讲述的数据文件备份功能都需要拷贝整个数据文件或数据文件中所有使用过的数据块,对于向PRACTICE这样小型的数据库,拷贝整个文件或者所有数据块都不会占用很多空间、花费很长时间,然而,很少有类似于PRACTICE这样小的数据库。有大量数据文件的大型数据库的备份需要很长时间并占用大量空间,通常情况下,数据库的大量数据在两次备份之间保持不变。Oracle已经提供只拷贝最近修改过的数据块,即数据块级的增量备份,只要需要,就可以用基本的增量级别为0的备份和需要的后续级别的增量备份一起还原与恢复数据库,因为不需要重复备份那些没有更改的数据块,所以在增量级别备份中生成备份片将节省大量的空间。
在上一个练习中,数据库在打开状态下为整个PRACTICE数据库以及控制文件生成了一个增量级别为0的基本备份,在本练习中,将生成一个累积增量备份级为1的备份,接着将要建立一个增量级别为2的备份。级别为1的备份将拷贝自级别0备份以来所有更改过的数据块,而级别2的备份将拷贝所有自级别1备份以来所有更改过的数据块。
步骤一:生成RMAN增量备份脚本
下面代码包括的命令将对整个PRACTICE数据库执行差异增量备份:

1 run {
2   allocate channel dl type disk;
3   backup 
4     incremental level = 1 cumulative 
5     database
6     format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
7     tag = 'WHOLE_INC1';
8 }

上面的命令与本章前面给出的脚本非常相似,除了tag名称和备份片文件名的format不同外,还有一个不同点,就是这个脚本包括了一个通知RMAN数据文件的备份是一个累积增量级别1的备份。
步骤二:生成RMAN增量备份脚本
与前面的过程类似,连接到目标数据库PRACTICE和目录数据库上执行备份操作:

1 RMAN>@D:\oracle\CODE\chap12\b_whole_inc1.rcv

当执行b_whole_inc1.rcv时,这个备份需要占用相同的时间,但其备份片文件却要小得多,这是因为包含了更改过的数据字典的数据块很少,也没有SCOTT表,TINA.DATE_LOG中只插入几行记录。

步骤三:生成RMAN增量备份脚本
再次使用list命令来检查备份的结果并检查操作系统以确认备份片文件是否存在,是否看到哪里有一个样例模板?这个命令的输出除了一下部分外,其他都与它们的备份命令的输出命令相同:

  • 键值和备份片名称不同
  • Incremental列的数值不同

步骤四:运行另一个RMAN增量备份脚本
在讨论RMAN归档日志备份之前,需要运行另一个类似被练习的备份,运行增量级别为2的备份。为了完成这个任务,生成一个名为b_whole_inc1.rcv文件的拷贝文件b_whole_inc2.rcv,打开这个文件并将所有的1修改成2。
例如:在b_whole_inc2.rcv中:

  • Incremental=1修改为incremental=2
  • Tag=’WHOLE_INC1’修改为tab=’WHOLE_INC2’

 

练习23:创建恢复管理器的归档日志备份

当PRACTICE数据库运行时,会在归档路径下产生归档日志文件,这些文件绝对需要保护,否则就不能将数据库恢复到过去某个时间点或当前时间状态。前面练习介绍了如何以用户管理的方法管理这些归档文件的备份,那如何使用RMAN来管理这些至关重要的文件呢?可以使用BACKUP ARCHIVELOG命令可以将这些归档日志文件拷贝到备份集的一个备份片中。当使用RMAN备份这些文件时,可以告诉RMAN通知日志序列范围或日志生成的时间范围等限制条件来选择需要备份的文件或者将他们全部拷贝到一个备份集中。
RMAN也允许对这些文件执行强制管理,作为数据库的操作,重做生成并存储在归档日志文件中。有些情况,这些文件会占满磁盘,RMAN的一个DELETE INPUT选项可以从磁盘上删除已经拷贝过的归档日志文件。
步骤一:创建RMAN归档日志备份脚本
只要简单地创建一个RMAN命令来备份归档日志,RMAN可以完成备份归档文件工作。

1 run {
2   allocate channel d1 type disk;
3   sql "ALTER SYSTEM ARCHIVE LOG CURRENT";
4   backup archivelog all
5     format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t';
6 }

在命令中定义了需要备份归档日志的路径、磁带或磁盘,然后可以有选择地确定当前联机的重做日志文件是否已经归档,最后通知RMAN拷贝所有的归档日志到一个备份集的备份片中。
步骤二:运行RMAN归档日志备份脚本
连接到目标数据库PRACTICE和目录数据库上运行该脚本:

1 RMAN>@D:\oracle\CODE\chap12\b_archive.rcv

在这个脚本执行过程中,会得到由RMAN产生的输出消息,这些消息显示了备份片的名称以及正在备份归档序列。

步骤三:验证RMAN备份脚脚本
运行LIST没命令检查v$表,检查该文件输出路径:

1 RMAN>list backup;

这个命令列出所有刚才为归档日志文件所创建的备份。如果生成大量的备份,则输出结果会滚屏输出,显示拷贝了的归档日志序列的序列号以及每个日志文件的SCN域。列出这些归档备份后,需要检查操作系统的文件,在目录D:\oracle\CODE\chap12中保存备份输出所产生的备份片文件。

 

RMAN的部署

前面了解了如何方便进行增量和归档日志备份,现在讨论如何这些增量置于一个示例规划中,这个示例规划包括每日数据文件、控制文件以及归档日志的备份策略。当部署增量备份策略时,需要平衡一旦数据库失效后备用资源进行恢复所需的时间。一个称为标准的备份情况需要在周末进行增量级别为0的备份,然后在整个星期内,需要进行不同的级别1或级别2的备份,这个每周循环可以使每一周都有一个基准增量备份以及没周内少量的增量备份。例如:可以在数据库的活动处于低谷是进行备份工作:

  • 星期天 清晨 0基备份(运行b_whole_inc0.rcv脚本)
  • 星期一 清晨 2基备份(运行b_whole_inc2.rcv脚本)
  • 星期二 清晨 2基备份(运行b_whole_inc2.rcv脚本)
  • 星期三 清晨 2基备份(运行b_whole_inc2.rcv脚本)
  • 星期四 清晨 1基备份(运行b_whole_inc1.rcv脚本)
  • 星期五 清晨 2基备份(运行b_whole_inc2.rcv脚本)
  • 星期六 清晨 2基备份(运行b_whole_inc2.rcv脚本)

  有这个累积增量备份部署,既可以至少三个备份集来还原与恢复工作。例如,如果在星期六中午发生了数据库失效,则RMAN restore命令需要星期天、星期四和星期六的备份集。为了运行累积增量备份,需要在本练习描述的脚本的incremental后增加CUMULATIVE关键字。
当为归档日志文件部署备份策略是,必须绝对确保已经获得了每个备份的归档日志文件至少一个(最好多个)拷贝。如果必须清理归档日志的目的地防止写满文件系统以及中断数据库操作。RMAN有一个比较谨慎的部署选项DELETE INPUT由此可以完成两个任务。归档日志备份策略在删除输入之前已经为每个归档日志做了三份拷贝,该脚本如何为PRACTICE数据库实现每个归档日志文件的三份拷贝:

  • 在新的备份策略的前一两天内对PRACTICE数据库应用ARCHIVELOG ALL选项以实现为所有已经存在的归档日志文件做基准备份(运行b_archive);
  • 每天为包括最近两天的重做所有已经存在的归档日志文件做备份(运行b_archive_2days.rcv);
  • 每天为包括从五天以前到前两天的重做日志文件进行备份(运行b_archvie_delete3.rcv);

这个策略需要确保由数据库创建的每个归档日志文件都至少三份拷贝,在执行这个归档日志备份策略时需要下面两个脚本:b_archive_2days.rcv和b_archvie_delete3.rcv。

1 run {
2   allocate channel d1 type disk;
3   sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
4   backup archivelog
5     form time 'SYSDATE-2'
6     format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t';
7 }

 当为磁盘分配了一个通道并归档了当前联机重做日志后,备份自两天以前生成的所有归档日志。运行该脚本,则每天将备份前两天的归档日志文件,这个脚本中没有删除备份过的归档日志。

1 run {
2   allocate channel d1 type disk;
3   sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
4   backup archivelog
5     form time 'SYSDATE-3' until time 'SYSDATE-2'
6     format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t'
7     delete input;
8  }

当运行archive_delete3.rcv时,DELETE INPU将通知RMAN在成功备份之后删除归档日志文件,当这个脚本运行后,查看操作系统的归档存放路径,被删除的文件将不再出现在磁盘上。数据库每天生成3个重做日志,每天的下午一点运行两个备份脚本:b_archive_2days.rcv和b_archvie_delete3.rcv。

  • 星期二的备份 备份集1包括归档日志1、2、3。没有归档日志被删除;
  • 星期三的备份 备份集2包括归档日志1-6。没有归档日志被删除;
  • 星期四的备份 备份集3包括归档日志4-9。备份集4拷贝了归档日志1-3并从磁盘上将其删除;
  • 星期五的备份 备份集5包括归档日志7-12。备份集拷6贝了归档日志4-6并从磁盘上将其删除;
  • 星期六的备份 备份集7包括归档日志10-15。备份集8拷贝了归档日志7-9并从磁盘上将其删除;

如果需要查看一个特定的归档日志文件备份多少次,可以用如下方式的RMAN list命令获得:

1 RMAN>list backupset of archivelog like '%archive/db_PRACTICE_%'
可以在操作系统的计划任务安排这些RMAN任务:
  • At 1:00 /every:Sunday       cmd /c <path>\b_whole_inc0.bat
  • At 1:00 /every:Monday       cmd /c <path>\b_whole_inc2.bat
  • At 1:00 /every:Tuesday      cmd /c <path>\b_whole_inc2.bat
  • At 1:00 /every:Wednesday  cmd /c <path>\b_whole_inc2.bat
  • At 1:00 /every:Thursday    cmd /c <path>\b_whole_inc1.bat
  • At 1:00 /every:Friday         cmd /c <path>\b_whole_inc2.bat
  • At 1:00 /every:Saturday    cmd /c <path>\b_whole_inc2.bat
  • At 2:00                            cmd /c <path>\b_archive_2days.bat
  • At 2:30                            cmd /c <path>\b_arhive_delete3.bat

 

posted @ 2010-03-09 09:08  shishanyuan  阅读(1924)  评论(0编辑  收藏  举报