作为一名DBA必须能对数据库进行备份以确保数据库始终处于受保护状态,而不出现任何失效的情况。进行自动备份操作时,需要关注如下问题:
- 经常备份的内容是什么?
- 可以完全恢复数据库吗?
- 是否已经有一个归档日志文件的良好备份吗?
- 是否有不能恢复的数据库操作妨碍了数据库的恢复?
- 哪些备份是孤立的并可以删除?
- 恢复需要哪些备份才能实现?
- 可以进行快速恢复吗?
RMAN备份配置完成并成功运行后,仍需要给予密切关注,作为DBA验证备份工作必须进行,不需要的旧备份需要删除。在前面练习中推荐了一种典型的增量备份策略。当日常自动备份进行时,这些备份一直在累积。下图显示了几个星期之后日常备份是如何建立起来的,该图显示了在星期天进行基准增量备份后,每天进行增量备份。如果每个备份操作都完好按照计划进行,则意味着数据库已经得到保护,DBA可以高枕无忧了。
为了安全起见需要经常检查备份工作的情况以及数据库是否按计划得到保护,有时因为缺少磁盘空间、硬件错误等问题导致自动备份的失败,或者由于磁带介质管理发生问题,如果在紧急情况下出现备份没有完成或者不可用等情况,那问题就严重,甚至可能危机DBA的职位。
在练习中会出现许多用于检查和维护PRACTICE数据库目录备份的RMAN命令,可以通过以下三个方面来探讨一个成功RMAN的部署:
- 如何通过已有的脚本来运行RMAN任务?(参见练习24)
- 如何确定数据库已经由RMAN备份保护起来了?(参见练习25)
- 如何清理过时、不需要的脚本,释放备份存储空间,并保持目录处于一个便于管理的大小?(参见练习26)
RMAN命令
RMAN提供了几个用于维护备份的命令,虽然这些命令在21-23练习中使用过,这里将更详细进行介绍。
(一) LIST
LIST命令将使RMAN读取目录或控制文件来显示备份的有关细节,如果列出一个单一的备份集,将会看到生成的备份片、时间、SCN值、文件名等属于该备份的信息。一般情况下,列表的结果输出到屏幕上,如果在命令行中或RMAN提示符下指定了输出消息日志文件,那么结果会输出到该文件中。如果需要显示特定备份的细节,可以限定备份键值、备份标识、时间范围、设备类型或者指定的匹配模式,也可以查询备份内部特定的对象、特定的表空间、数据文件、控制文件以及归档日志等详细情况。
(二) REPORT
REPORT命令对于需要操作的数据库备份高亮显示,与LIST命令类似,发布的REPORT命令将通知RMAN读取目录或目录控制文件并收集备份的有关信息。这些REPORT命令能够判断是否可以快速恢复数据库以及找到不再需要的陈旧备份,也可以采用如下方式运行报告(report)命令以获取需要的信息:
- 需要备份什么文件?
- 哪些文件没有最新的备份?
- 哪些文件因为不可以恢复的操作的原因不能恢复?
Report将会找到一个孤立的备份,该备份被执行多次而且被新的备份孤立,冗余(Redundancy)选项定义了一个备份在孤立以前能够保留的次数,其中孤立备份报告默认冗余值是一个备份。
(三) CHANGE
CHANGE命令帮助管理已知RMAN备份的状态,对于每个文件RMAN都分配一个可维护的通道来访问磁盘或磁盘上的文件。CHANGE命令有几个更改目录和备份文件的选项:
- Delete 从操作系统上删除备份片文件,并标记该备份记录为已删除(deleted);
- Available 为了还原将映像拷贝或备份片的状态修改为Available,默认情况下,所有的备份都设置为Available;
- Unavailable 为了还原,将映像拷贝或备份片的状态修改为Unavailable;
- Uncatalog 从目录中删除备份。
(四) CROSSCHECK
CROSSCHECK命令验证RMAN备份中已知的备份片文件是否存在磁盘或者磁带上,CROSSCHECK可以作为CHANGE命令的一个选项执行,当对磁盘的备份使用CROSSCHEC命令时,RMAN读取目录查找该备份所在的位置,如果找到备份文件,RMAN需要验证备份片头部的正确性。
(五) VALIDATE
VALIDATE命令确定一个或多个备份集是否能被还原或者是已经损坏,VALIDATION比CROSSCHECK包含了更多的验证功能。当执行该命令时,RMAN将查找介质上所有的备份片并扫描每个文件,当读取备份片中的每个数据块时,已经存储的备份操作的校验将重新计算并进行校验。如果每个文件的校验和正确,则RMAN确认该备份集的所有备份片都处于有序状态而且有效。备份片验证时的任何错误写入到告警日志文件、服务器跟踪文件、V$BACKUP_CORRUPTION或V$COPY_CORRUPTION动态视图中。该命令不仅可以对指定的备份集进行验证,而且可以在RESTORE命令中使用VALIDATE选项模拟还原数据库或部分数据库;最后RMAN可以使用UNTIL参数设定期望的恢复停止点,验证恢复是否可以在前一个时间点完成。
除了上面五个管理备份与目录的命令外,还可以使用CREATE、REPLACE以及DELETE等命令脚本。
练习24:存储脚本
恢复管理器命令可以在RMAN提示符下运行或通过脚本执行,也可以将脚本保存在资料库中,然后在RMAN提示符下执行这些存储的脚本。每个注册的数据库必须有属于自己的存储脚本;脚本不能在不同数据库之间共享。例如:如果有两个数据库在目录中注册并且都要运行一个名为b_whole_inc0的脚本,则必须在目录中分别为每个数据库创建自己的脚本。
本练习将要学习如何将前面使用过的脚本文件作为存储脚本保存。
步骤一:创建并替换存储脚本
用21-23练习创建备份存储脚本b_whole_inc0.rcv、b_whole_inc1.rcv、b_archive_2days.rcv和b_archive_delete3.rcv:
2 allocate channel d1 type disk;
3 backup
4 incremental level = 0
5 database
6 format ' D:\oracle\CODE\chap13\db_%d_%s_%p_%t '
7 tag = ' WHOLE_INC0 ' ;
8 release channel d1;
9 }
10
11 create script b_whole_inc1 {
12 allocate channel d1 type disk;
13 backup
14 incremental level = 1 cumulative
15 database
16 format ' D:\oracle\CODE\chap13\db_%d_%s_%p_%t '
17 tag = ' WHOLE_INC1 ' ;
18 release channel d1;
19 }
20
21 create script archive_log_current {
22 sql " ALTER SYSTEM ARCHIVE LOG CURRENT " ;
23 }
24
25 create script b_archive_2days {
26 allocate channel d1 type disk;
27 execute script archive_log_current;
28 backup archivelog
29 from time ' SYSDATE-2 '
30 format ' D:\oracle\CODE\chap13\ar_%d_%s_%p_%t ' ;
31 release channel d1;
32 }
33
34 create script b_archive_delete3 {
35 allocate channel d1 type disk;
36 execute script archive_log_current;
37 backup archivelog
38 from time ' SYSDATE-3 ' until time ' SYSDATE-2 '
39 format ' D:\oracle\CODE\chap13\ar_%d_%s_%p_%t '
40 delete input;
41 release channel d1;
42 }
上述脚本定义将完成和21-23练习备份的脚本文件同样的任务,下面是关于scripts.rcv内容的说明:
- 在存储脚本时,不需要运行块。脚本中的命令将在加载时编译然后作为一个整体执行;
- 存储脚本的语法在保存到目录中时进行检查,这种校验保证了任何存储脚本都没有语法错误。在格式化语句中存储脚本不检查子目录是否存在;
- 所有RMAN的存储脚本执行完成后,分配的通道并没有自动释放,所以应该显示释放这些通道;
- 当存储脚本文件时,生成脚本的命令第一次生成脚本,也可以使用REPLACE SCRIPT命令以新的脚本代替已经存在的脚本;
- 存储脚本可以从许多文件中或在RMAN提示符下生成,不需要同时载入到一个脚本文件中;
- 如果替换的脚本不存在或需要进行替换,则使用REPLACE SCRIPT命令,而不是CREATE SCRIPT来生成这个存储脚本。
为了生成存储脚本,必须链接到恢复目录以及目标数据库,尽管可以在RMAN命令提示符中输入每一行命令来生成存储脚本,但最好还是运行scripts.rcv文件:
2 RMAN > connect catalog rman1010 / rman@rcat
3 RMAN > connect target sys / system@practice
4 RMAN > @scripts.rcv
如果只是为了在恢复目录中增加数据,为什么还链接到目标数据库呢?因为在目录中创建的脚本只用于该目标数据库。(如果还有其他的数据库也注册在该目录中,则当链接到另一个目标数据库时还需要运行scripts.rcv)当替换脚本文件运行时,这个独立的脚本将进行语法检查并存储在目录数据库中,脚本文件中的每个存储脚本都有类似如下的信息显示:
(图3 )
如果输入错误或者RMAN不能编译这些命令,则RMAN将显示错误并说明该文件不符合规则的信息。
步骤二:列表显示存储脚本
如何知道脚本已经在目录中生成?在RMAN提示符下没有一个比较方便的方法显示所有存储的脚本,但有一个名为RC_STORED_SCRIPT的视图,其中每一行分别记录了目录数据库中的每一个存储的脚本。具体方法如下:
2 WIN > sqlplus / nolog
3 SQL > connect rman1010 / rman@rcat
4 SQL > set linesize 1000
5 SQL > SELECT db_name, script_name
6 FROM rc_stored_script
7 WHERE db_name = ' PRACTICE ' ;
(图5 )
小技巧:退出SQL*PLUS,返回到RMAN提示符下,在RMAN提示符下,再次输入exit又回退到RMAN提示符下。
(图7)
可以在RMAN下使用PRINT命令打印存储脚本的内容,下面将显示每一个存储脚本命令的内容:
2 RMAN > print script b_whole_inc0;
3 RMAN > print script b_whole_inc1;
4 RMAN > print script b_archive_2days;
5 RMAN > print script b_archive_delete3;
(图9)
步骤三:执行并删除存储脚本
RMAN EXECUTE SCRIPT命令在RMAN提示符下运行存储脚本,尝试运行刚才生成的一个脚本来执行一次完全数据库备份。运行存储在目录数据库中的b_whole_inc0脚本来备份PRACTICE数据库:
(图11)
脚本执行命令必须置于运行块中,如果运行几个不同的脚本,需要置于单独的运行块中。如下运行一次整体数据库增量级别1的备份以及近两天之内生成的归档日志文件的备份:
2 execute script b_whole_inc1;
3 execute script b_archive_2days;
4 }
(图13)
(图15)
为了删除存储脚本,使用REMOVE SCRIPT命令指定脚本的名称:
(图17)
在本练习中,只创建了少量的脚本,对于大型的规划部署,将会创建诸如备份、维护以及恢复等多种任务复杂脚本。从存储脚本运行备份操作的最大优点就是集中存放,分离的脚本文件不需要在服务器上导出维护,而RMAN也可以运行在没有驻留在目标数据库的服务器上。
练习25:确认备份
数据库得到保护是否就可以防止失效?是否可以使用服务器管理的备份按商业要求进行数据库的恢复?这些问题对于成功的RMAN部署是一个关键的测试,但这些测试对于大型的数据库需要花费大量的时间和磁盘空间。
- RMAN是否有一种方法可以验证目标数据库已经由当前的备份保护起来了?答案是确认的;
- 是否可以发现数据库某些部分由于不可恢复的操作而没有受到保护?答案是,可以;
- 是否可以确认目录中注册的备份任然保存在磁盘或者磁带上?答案是。
在本练习中,将会使用LIST、CHANGE、REPORT和VALIDATE命令,也可以查询目标控制文件和目录来检查但前备份的详细清单。通过这些方法,可以确认对PRACTICE数据库已经进行了充分的备份。
步骤一:用LIST确认备份
在这个任务中,将介绍可以列出的信息类别和数据库文件以及如何过滤不需要的内容。在介绍如何用LIST命令确认备份之前,先通过示例来讲解LIST命令的各个选项。
1) 种类 LIST命令将显示RMAN相关备份信息的三种类型中的一种,可以查询RMAN数据库形态(INCARNATION)信息、备份(BACKUP)以及映像拷贝(IMAGE COPY):
- INCARNATION 显示数据库的形态,包括重置日志的SCN和日期/时间值。每个数据库键值以及形态键值都不相同;
- BACKUP 显示数据库文件的备份,包括备份集号、备份级别(增量号以及完全备份)以及完成时间、每个备份集都有自己的键值。默认情况下,备份列表显示备份集和数据文件,而不是显示归档日志和控制文件;
- MAGE COPY 显示数据库文件的拷贝,包括检查点SCN、时间、以及该拷贝完成的日期/时间值,每个映像拷贝的键值都不同。默认情况下,该拷贝列表显示数据文件的映像拷贝,而不显示归档日志和控制文件。
2) 数据库文件及过滤器 当列表备份与拷贝时,应指定RMAN需要显示的数据库文件类型:数据文件、控制文件或者归档日志文件。如果没有指定显示的文件类型,默认情况下备份与拷贝的列表将显示数据文件。为了查看不同的数据库对象列表(数据文件、表空间、控制文件、归档日志文件或者数据库),应在LIST BACKUP或COPY命令上增加以下关键字:
- Database 显示目标数据库所有数据文件的备份或映像拷贝;
- Tablespace 在一个单引号字符串中显示表空间的所有数据文件备份或映像拷贝,可以列表多个数据文件;
- Datafile 在一个单引号的字符串内以文件号或文件名显示数据文件的备份或映像拷贝,可以列表多个数据文件;
- Controlefile 显示目标数据库中的控制文件的备份或映像拷贝;
- Archivelog 显示归档日志文件的备份或映像拷贝。
3) 数据文件 为了以不同的方式说明SYSTEM和USERS表空间文件的备份与映像拷贝的清单,在RMAN提示符下输入如下命令:
2 RMAN > list backup;
3 RMAN > list backup of database;
4 RMAN > list backup of tablespace SYSTEM, USERS;
5 RMAN > list backup of datafile 1 , 3 , 7 ;
6 RMAN > list backup of datafile
7 ' D:\oracle\PRACTICE\system01.dbf ' ,
8 ' D:\oracle\PRACTICE\users01.dbf ' ,
9 ' D:\oracle\PRACTICE\users02.dbf ' ;
(图19)
(图21)
(图23)
2 RMAN > list copy;
3 RMAN > list copy of database;
4 RMAN > list copy of tablespace SYSTEM, USERS;
5 RMAN > list copy of datafile 1 , 3 , 7 ;
6 RMAN > list copy of datafile
7 ' D:\oracle\PRACTICE\system01.dbf ' ,
8 ' D:\oracle\PRACTICE\users01.dbf ' ,
9 ' D:\oracle\PRACTICE\users02.dbf ' ;
当列表该数据库的备份和拷贝时,将得到组成该数据库所有部分的全部备份与映像拷贝。
(图25)
(图27)
4) 控制文件 为了查看控制文件的备份与映像拷贝,可以执行只输出控制文件的list命令:
2 RMAN > list copy of controlfile;
(图29)
(图31)
5) 归档日志 对于归档日志列表的过滤选项与数据文件和控制文件都不同。必须在list命令中明确指定哪个归档日志文件的清单。使用关键字Arachivelog将指定一个归档日志文件备份或映像拷贝的列表。列表的结果可以是所有的归档日志文件、匹配一种归档日志模式或者指定文件范围的列表。范围类型必须属于以下之一:
- 时间 可以用FROM TIME、UNTILE TIME或者二者结合的关键字指定范围,后跟单引号的日期字符串。日期字符串可以使字符形式与TO_DATE函数结合的字符串形式、SYSDATE的日期算式和其他类型如LAST_DAY、ADD_MONTHS等的日期函数。FROM TIME将会包括从指定时间开始以来进行重做更改的归档重做日志文件;UNTILE TIME则包括从指定时间作为最后的重做更改时间以来的归档重做日志文件;
- SCN SCN跨越了重做日志文件,可以用关键字FROM SCN、UNTIL SCN或二者结合的关键字来指定范围,后跟一个整数值。FROM SCN将会包括具有大于或等于SCN值的归档重做日志文件,UNTIL SCN将会包括具有小于或等于SCN值的归档重做日志文件;
- 日志序号 重做日志序列的值是针对重做日志文件的,可以用关键字FROM LOGSEQ、UNTIL LOGSEQ 或二则结合的关键字来制定范围,后跟一个整数值。FROM LOGSEQ将会包括具有大于或等于该日志序列号的归档日志文件,UNTIL LOGSEQ将会包括具有小于或等于该日志序列的归档日志文件;
2 RMAN > list backup of archivelog all;
3 RMAN > list backup of archivelog like ' %oradata% ' ;
4 RMAN > list backup of archivelog from time ' SYSDATE - 14 ' ;
5 RMAN > list backup of archivelog until time ' SYSDATE - 7 ' ;
6 RMAN > list backup of archivelog
7 from time ' SYSDATE - 14 '
8 until time ' SYSDATE - 7 ' ;
9 RMAN > list backup of archivelog from SCN 100000 ;
10 RMAN > list backup of archivelog until SCN 110000 ;
11 RMAN > list backup of archivelog from SCN 100000 until SCN 110000 ;
12 RMAN > list backup of archivelog from logseq 130 ;
13 RMAN > list backup of archivelog until logseq 139 ;
14 RMAN > list backup of archivelog from logseq 130 until 139 ;
(图33)
(图35)
上面的实例说明了如何查看RMAN的备份以及RMAN的映像拷贝的归档日志文件。罗列的几个示例有助于理解如何定义范围模式,当连接到PRACTICE目标数据库以及目录数据库时,可以运行这些命令,调整SCN值以及日志序列号可以看到不同的输出结果。
6) 日期格式选项 参看下表说明如何在列表中用RMAN建立日期值;
RMAN日期字符串选项
日期字符串 |
值 |
SYSDATE |
当前的日期时间 |
TRUNC(SYSDATE) |
当天午夜 |
SYSDATE - 7 |
比当前日期少7天 |
‘13-JAN-2002’ |
如果会话的值是NLS_DATE_FORMAT=‘DD-MON-YYYY’则是2002年1月13日午夜 |
TO_DATE(‘13-JAN-2002 13:00’, ‘DD-MON-YYYY HH24:MI’) |
不论是NLS_DATE_FORMAT的值是什么,该时间是2002年1月13日下午1时 |
ADD_MONTHS(SYSDATE, 1) |
当前日期时间之后的一个月 |
ADD_MONTH(SYSDATE, -1) |
当前日期时间之前的一个月 |
LAST_DAY(SYSDATE, 1) |
当前日期时间前一天 |
NEXT_DAY(‘SYSDATE’, ‘SUNDAY’) |
当前日期时间的下一个星期天的日期 |
7) 更多的过滤选项
可以用基于几个条件来过滤输出,如果使用RMAN一段时间但没有删除孤立的备份,则输出结果会超额。这个列表使用过滤规则来解决,过滤规则包括:
- Completion time 列表输出的结果中只出现限制在时间范围内的备份与映像拷贝。用AFTER关键字指定时间下限,用BEFORE关键字指定时间上限,用BETWEEN关键字指定时间范围;
- Tag 列表输出结果中只出现限制在特定的tag名称的备份与映像拷贝,如果没有提供tag名称,则将包括所有标示的备份与映像拷贝;
- Recoverable 列表的结果只限定于那些可以被恢复的数据库,也可以有选择地为可恢复性指定停止点。这个选项将显示所有适于基准备份的备份以及适于恢复的正确形态。例如:如果进行一次级别为3的增量备份而没有基准(增量级别为0、完全备份或映像拷贝)备份,则该备份不能用于恢复;
- Device type 列表的结果只限于那些具有磁盘或’SBT_TAPE’类型的备份或映像拷贝;
- Like列表的结果只限于那些含有的数据文件匹配了文件名模式的映像拷贝,%通配符可以匹配任何字符序列’_’字符则只匹配一个字符。
2 RMAN > list backup completed after ' SYSDATE - 14 ' ;
3 RMAN > list backup completed before ' SYSDATE - 7 ' ;
4 RMAN > list backup completed between ' SYSDATE - 14 ' and ' SYSDATE - 7 ' ;
5 RMAN > list backup tag = WHOLE_INC0;
6 RMAN > list backup recoverable;
7 RMAN > list backup device type disk;
8 RMAN > list copy like ' %system% ' ;
9 RMAN > list backup completed after ' SYSDATE - 14 '
10 tag = WHOLE_INC0
11 device type disk
12 recoverable;
(图37)
这些示例说明了如何使用过滤规则来限制列表的输出,为了查看映像拷贝的清单,可以用COPY代替关键字BACKUP,也可以将这些过滤器与其他数据库对象的选项组合使用,比如为查看USERS表空间本月完成、tag名为“WHOLE_INC0”的磁盘备份,可以按如下方式操作:
2 Completed after ' LAST_DAY(ADD_MONTHS(SYSDATE, -1)) + 1 '
3 TAG = WHOLE_INC0
4 Device type disk;
(图39)
如果该备份存在,则该list命令会列出所需要的结果。注意,过滤规则的顺序是无关的,另外每个过滤条件不需要在同一行书写。
8) 使用列表工作 当以这些选项列出了备份与映像拷贝后,如何确认PRACTICE数据库已经得到保护?根据生成的列表可以确认得到的备份与期望的策略一致,以下采用如下描述的增量备份策略
- 星期日 累积增量级别为0的备份,tag为SUN_LEVEL0;
- 星期一 累积增量级别为2的备份,tag为SUN_LEVEL2;
- 星期二 累积增量级别为2的备份,tag为SUN_LEVEL2;
- 星期三 累积增量级别为2的备份,tag为SUN_LEVEL2;
- 星期四 累积增量级别为1的备份,tag为SUN_LEVEL1;
- 星期五 累积增量级别为2的备份,tag为SUN_LEVEL2;
- 星期六 累积增量级别为2的备份,tag为SUN_LEVEL2;
- 每天 备份所有最近两天的归档日志;
- 每天 备份所有超过三天的归档日志并从磁带删除;
- 每天 将当前的控制文件拷贝到每个整理数据库增量备份中;
采用该备份策略,每个数据库文件中的备份输出是什么?每个归档日志是什么?每个控制文件呢?假设超过21天的备份都被删除了,下面这个列表将显示期望看到的输出结果。
2 list backup completed after ' SYSDATE - 21 ' ;
3 # 21 backup sets completed in the last 21 days
4 list backup of controlfile completed after ' SYSDATE - 21 ' ;
5 # 3 backup sets completed on Sunday
6 list backup completed after ' SYSDATE - 21 ' tag = SUN_LEVEL0;
7 #Repeat above for other tag values
8 # 42 backup sets - two backups daily for 21 days
9 list backup of archivelog all completed after ' SYSDATE - 21 ' ;
10 #For a specific archive log , should have 3 backups
11 list backup of archivelog from logseq 130 until logseq 130 completed after ' SYSDATE - 21 ' ;
12 #Make sure we can recover to 21 days previous
13 list backup recoverable until time ' SYSDATE - 21 ' ;
这些命令的列表输出结果很长,因此,使用RMAN的log命令来运行,然后检查日志文件的输出,查看列表输出是否有期望获得的备份清单。
2 RMAN > connect targt system / system@practice
3 RMAN > connect catalog rman1010 / rman@rcat
4 RMAN > @list.rcv
5 RMAN > exit
(图41)
(图43)
(图45)
步骤二:用REPORT确认备份
List命令显示得到什么内容,而Report则显示需要什么。有四个Report的选项,其中两个(Need backup和Unrecoverable)可以方便地用于确认当前的备份是否可以进行恢复。
- Need backup 说明要达到完整备份,数据文件还需要适合某些条件(日期、增量级别或冗余数)的新备份。恢复将需要归档重做日志和增量备份。根据这个报告可以确认数据库中的数据文件是否还需要更多的增量备份或其他重做的时间,同时也可以报告哪些数据文件没有足够的冗余备份;
- Unrecoverable 说明需要备份的数据文件中的数据块发生了不可恢复的操作(即Nologing操作);
- Obsolete 说明不再需要的备份可以删除。对于该报告可以指定额外的备份数(冗余备份)。例如,如果觉得两个冗余备份比大多数情况下的一个冗余备份更合适,则可以报告所有比这两个冗余备份还要早的备份;
- Schema 显示目标数据库的数据库物理模式,使用目录时,可以在制定的条件(时间、日志序列和SCN)下观察物理模式。
因为report具有分析功能,所以用于特殊report的参数属于REPORT生成类型。在本练习中,将查看每个report并讨论他们如何在备份策略中发现漏洞。
- Need Backup报告 Need Backup选项显示了一个日期范围内还没有备份的数据库的内容。
1 RMAN > report need backup days 2 database;
- Unrecoverable报告 对目标数据库进行Unrecoverable报告将会验证操作更改的数据块是否可以应用重做记录。如果需要另一个增量备份以防止一个NOLOGING操作应用重做时出现问题,RMAN将会给出报告:
1 RMAN > report need backup incremental 3 database;
- Schema报告 Schema报告对于长时间恢复或不可恢复数据块并不给出警告,可以比较目标数据库和当前数据文件或查看模式是否一致。
1 RMAN > report unrecoverable;
2 RMAN > report schema;
3 RMAN > report schema at time ' SYSDATE - 7 ' ;
4 RMAN > report schema at time " TO_DATE('01/8/2010', 'MM/DD/YYYY') " ;
5 RMAN > report schema at scn 1000 ;
6 RMAN > report schema at logseq 131 ;
(图47)
步骤三:用SQL*PLUS确认备份
对目录用户增加SQL命令产生的结果类似于LIST命令的结果,使用SQL来查询目录,查看备份集、备份片以及组成但前备份的数据文件的目录内容,也可以使用备份集标识或备份集键值来查找所需要的信息,查询可以可以需要对目标控制文件或目录用户表。查询这些视图的最大优点是:可以控制输出的表现形式,列表有固定的输出格式,而SQL可以有多种格式化的方法。下表显示了包含备份与映像拷贝信息的关键视图。
RMAN备份与拷贝的重要数据字典与目录视图
目标数据库视图 |
目录视图 |
描述 |
V$BACKUP_SET |
RC_BACKUP_SET |
RMAN备份集信息 |
V$BACKUP_PIECE |
RC_BACKUP_PIECE |
RMAN备份片文件信息 |
V$BACKUP_DATAFILE |
RC_BACKUP_DATAFILE |
RMAN备份文件信息 |
V$DATAFILE_COPY |
RC_DATAFILE_COPY |
RMAN映像拷贝文件 |
V$BACKUP_CONTROLFILE |
RC_BACKUP_CONTROLFILE |
RMAN备份控制文件信息 |
V$CONTROLEFILE_COPY |
RC_CONTROLEFILE_COPY |
RMAN控制文件的映像拷贝 |
V$BACKUP_REDOLOG |
RC_BACKUP_REDOLOG |
RMAN备份归档日志信息 |
控制文件视图中的列和目标路视图中的非常相似,但也有一些差别:
- 目录视图有一个列的内容是标记数据库和数据库的形态,而目标数据字典视图没有,控制文件只包含当前形态的编码;
- 目录视图含有一个备份键值,作为备份与拷贝的内部RMAN目录索引号,控制文件视图中则没有这个键值;
目标控制文件与目录可能含有对方没有的记录行。如果超过时限,则目标控制文件中的备份记录将不再出现在V$视图中。如果从目录中删除备份,则这些备份不会出现在目录视图中,但仍然保留在目标控制文件中。
1) 备份集与备份片 可以在目标数据库和目录数据库中看到RMAN进行的备份集,可以查询这些视图,显示备份集和备份片的信息:
2 SQL > SELECT recid, set_count,
3 decode(backup_type, ' D ' , ' FULL ' ,
4 ' I ' , ' INCREMENTAL ' ,
5 ' L ' , ' LOGS ' ) TYPE,
6 incremental_level ILevel, completion_time Completed
7 FROM v$backup_set;
(图49)
2 decode(backup_type, ' D ' , ' FULL ' ,
3 ' I ' , ' INCREMENTAL ' ,
4 ' L ' , ' LOGS ' ) TYPE,
5 incremental_level ILevel, completion_time Completed
6 FROM rc_backup_set
7 WHERE db_key = (SELECT max(db_key) FROM rc_database
8 WHERE name = ' PRACTICE ' );
(图51)
为了目录用户与目标控制文件比较备份片,可以分别对V$BACKUP_PIECE和RC_BACKUP_PIECE视图执行类似的查询。这些视图包含了重要的列,如handle和tag;
2) 数据文件 除RMAN LIST命令之外,还可以对目录中的视图进行查询以获得数据文件拷贝和备份的详细信息。运行下面的查询就可以与以上RMAN LIST COPY和LIST BACKUP 命令类似的信息:
2 SQL > set linesize 1000
3 SQL > SELECT file#, completion_time time,
4 checkpoint_change# change#, name
5 FROM v$datafile_copy;
6 SQL > SELECT file#, completion_time time,
7 checkpoint_change# change#, set_count
8 FROM v$backup_datafile;
(图53)
2 SQL > SELECT file#, completion_time time,checkpoint_change# change#, name,
3 bdf_key key, decode(Status, ' A ' , ' AVAIL ' , ' U ' , ' UNAVAIL ' , ' D ' , ' DELETED ' ) Status
4 FROM rc_datafile_copy
5 WHERE db_name = ' PRACTICE ' ;
6 SQL > SELECT file#, completion_time time,checkpoint_change# change#, set_count,
7 bdf_key key11, decode(Status, ' A ' , ' AVAIL ' , ' U ' , ' UNAVAIL ' , ' D ' , ' DELETED ' ) Status
8 FROM rc_backup_datafile
9 WHERE db_name = ' PRACTICE ' ;
(图55)
3) 备份控制文件 在V$CONTROLFILE_COPY、V$BACKUP_CONTROLFILE、RC_CONTROLFILE_COPY和RC_BACKUP_CONTROLFILE视图中可以找到控制文件映像拷贝和备份。这些目录视图提供了比LIST命令更多的关于控制文件备份的信息,在SQL*Plus中使用SQL语句,可以查看其他的列并可以格式化输出的结果;
4) 备份归档日志 除了LIST BACKUP ARCHIVELOG命令外,还可以向目录用户查询以显示指定备份的信息,以目录拥有者的身份启动一个SQL*Plus会话并运行类似上一个任务中的查询语句;
2 SQL > SELECT sequence#, count( * )
3 FROM v$backup_redolog
4 GROUP BY sequence#;
(图57)
2 SQL > SELECT sequence#, count( * )
3 FROM rc_backup_redolog
4 WHERE db_name = ' PRACTICE '
5 AND status = ' A '
6 GROUP BY sequence#;
(图59)
非常注意:这里的查询比较简单,一旦熟悉这些视图,就可以按照自己的RMAN部署来定制这些查询。同时,如果在目录中有多个数据库和数据库的形态注册,则应该使用db_key和dbinc_key两个列作为条件,确保查询的语句中的where部分包括了正确的数据库和形态。
步骤四:交叉检查备份
了解备份信息的关键是确定当前的备份情况是否已经处于有序状态,如果在操作系统下删除备份片,那么控制文件和目录将不知道该创造做,因此经常进行交叉检查以确认目录包含了有关备份片的正确信息。
下面的命令将检查目标控制文件和目录已知的所有备份:
2 RMAN > crosscheck backup;
3 RMAN > release channel;
输出的结果如下:
(图61)
单词“available”意思是该备份片已被找到,可以用tag选项限制对带有tag或特殊的tag名称的备份交叉检查。
2 RMAN > crosscheck backup completed between ' SYSDATE-7 ' an ' 30-Jan-2002 ' ;
3 RMAN > crosscheck backup completed between ' 01-Jan-2002 ' and ' 30-Jan-2002 ' ;
4 RMAN > crosscheck backup tag WHOLE_INC0;
5 RMAN > crosscheck backup of archivelog like ' %/100.% ' ;
6 RMAN > crosscheck backup of archivelog from logseq 100 until logseq 110 ;
7 RMAN > crosscheck backup of archivelog from ' SYSDATE-7 ' and ' SYSDATE ' ;
(图63)
为了交叉检查(crosscheck)特定的备份集或者映像拷贝,可以在change命令中使用crosscheck选项,而不仅仅使用crosscheck命令:
2 RMAN > change datafilecopy 545 crosscheck;
步骤五:验证备份
RMAN正因为在restore命令中提供了validate选项才具有了模拟还原的能力,这种验证的方法是RMAN可以选择用于还原的备份集或拷贝。RMAN也可以使用VALIDATE BACKUPSET的命令来验证制定备份集的还原性。这两种还原验证方式都可以对整个数据库、表空间、数据文件、控制文件或归档日志文件应用。
警告:RMAN的验证并不测试还原(应用增量备份和重做),因此,验证并不是一个综合的测试。可以验证还原,然后只验证增量备份的还原。
1)还原验证 首先验证整个数据库的还原并让RMAN选择使用的备份集和拷贝。这样验证方法在一个运行快中使用了还原(restore)命令,验证备份集和拷贝的还原。
下面的实例验证了磁带上的备份控制文件、所有表空间和归档重做日志的还原操作:
2 allocate channel d1 type disk;
3 restore database validate;
4 restore archivelog all validate;
5 }
(图65)
如果输出Fisnished restore说明验证完成了,则说明验证成功,否则将显示错误的消息。
2)验证备份集 第二种验证方法需要制定备份集的细节,对PRACTICE数据库进行两个增量备份。例如,备份集130是级别为0的增量备份,而备份集131级别为1,这两个增量备份都包含一个控制文件的拷贝:
2 allocate channel d1 type disk;
3 validate backupset 81 ;
4 }
(图67)
验证期间,将读取备份片并模拟还原操作,如果出现:Validation complete,则是说明还原可以工作,否则将显示错误信息。
为了模拟失败的验证,将备份片重新命名为一个新的文件名,并验证备份集。这时将得到一个错误;然后使用任何文本文件命名为备份片的原始文件名;再次验证备份集,又将得到其他的错误。删除刚才拷贝用于模拟损坏的备份片的文本文件,并将原始的备份片恢复到初始名称,最终验证将产生一个成功的消息。
练习26:恢复目录的清理
在本练习中将介绍三种方法删除陈旧备份。为了删除陈旧的备份,RMAN提供了带有delete选项的change命令,使用report、交叉检查(crosscheck)和SQL确定当前恢复不需要的孤立备份,确定后删除这些孤立的备份。
步骤一:查找孤立的备份
在完全恢复期间,RMAN将使用最近的备份或映像拷贝来还原数据库文件,当需要进行时间点恢复时,RMAN还原离时间点最近的备份。存在最近的备份进行恢复而不再使用的备份就是孤立备份。如果选择恢复时间比最近的时间早,则可能会需要这些独立备份,所以拥有少量的额外备份也是有道理,但是积累了太多备份,则应该删除这部分备份。
RMAN 有一个报告可以显示超过冗余范围的孤立备份集,公司或许更适合三个星期的备份保持范围,在这种情况下就没有人会让DBA将数据库恢复到三个星期以前的状态。
查找已经孤立的以及21天(三个星期)前生成的备份:
2 until time ' SYSDATE-21 ' device type disk;
(图69)
(由于不存在21天前的备份,这里获取三天前时间点,以下均同)
该报告返回的任何备份或拷贝都可以删除,因为默认的冗余值为“1”,所以可以忽略冗余部分
(图71)
这个命令将只保留21天以来进行的一个备份拷贝,一旦发生了21天前的备份是增量级别为1的备份情况,为了使用这些备份,将需要22天前进行的增量级别为0的备份,而这个备份有可能已经删除了。
使用list命令显示21天前的备份列表:
(图73)
警告:如果在某个时刻进行完全或增量级别为0的备份,并创建了所有的增量备份或者归档日志文件则只能恢复到这个时刻。因此,如果不确定是否还要恢复到过去某个时间点,则应保留一个旧版本和所有的归档日志。实际中可以根据业务的需要决定备份的周期,如磁带循环使用的周期是三个月,则只能将备份恢复到三个月以前。
步骤二:删除孤立的备份
一旦确定了要删除的备份集,如何使用RMAN来删除这些备份?可以通过分配删除通道并使用change命令来删除备份集或映像拷贝。例如,如果REPORT命令确认要删除一个备份集,则可以使用以下的命令从操作系统中删除这些备份片,并将其在目录中的状态修改为已删除:
2 RMAN > report obsolete redundancy 2 device type disk;
3 RMAN > #Allocate a channel of type delete;
4 RMAN > allocate channel for delete type disk;
5 RMAN > #Delete the backup set (s)
6 RMAN > change backupset 81 delete;
7 RMAN > #Release the allocated delete channel.
8 RMAN > release channel;
(图75)
(图77)
这个操作的缺点必须运行report并根据report的输出结果生成删除命令,下个步骤将介绍删除陈旧备份的另一种方法。
为了查找并删除孤立的备份,运行几个增量级别为0的备份:
2 RMAN > run {execute script b_whole_inc0;}
3 RMAN > run {execute script b_whole_inc0;}
4 RMAN > run {execute script b_whole_inc0;}
5 RMAN > report obsolete redundancy 4 device type disk;
(图79)
这个obsolete报告将显示孤立的备份,删除显示的孤立备份,这些备份文件将从磁盘和目录中删除。
(图81)
步骤三:删除陈旧的备份
可以手工删除查找备份集编号并逐个删除,然而为了自动化删除陈旧的备份集,可以从恢复目录视图中查询备份集并将change命令spool到一个文件中。在RMAN下运行该文件将会删除陈旧的备份,下面SQL*Plus代码段将生成RMAN脚本。
2 set linesize 100 trimspool on
3 define fil = ' D:\oracle\CODE\tmp\delete_copies.rcv '
4 spool & fil
5 prompt allocate channel for delete type disk;;
6 SELECT ' change backupset ' || bs_key || ' delete; ' FROM rc_backup_set WHERE completion_time < SYSDATE - 2 ;
7 prompt release channel;;
8 spool off;
(图83)
当连接到目标数据库时,在RMAN提示符下调用delete_copies.rcv将使目录删除21天以前生成的备份集。
(由于不存在21天前的备份,这里获取两天前时间点)
步骤四:查找过期的备份
大多数介质管理器都有文件保存期限。例如,如果一个文件超过三个月而介质管理器的保存期也设置为三个月,则该文件将标注为过期。介质管理器将不再对他进行访问,而且这些文件将被其他新的备份删除,将保存期与RMAN的crosscheck选项结合使用可以删除陈旧的备份。
一旦这些文件被删除,可以对备份集执行交叉检查:
2 RMAN > crosscheck backupset;
3 RMAN > release channel;
(图87)
所有被操作系统删除的文件将被交叉检查crosscheck命令标记为过期。
警告:应该仔细操作,确保没有从磁盘上删除近期可能需要的备份,为了安全起见最好在其他地方保存几份以前的备份,或者在执行交叉检查(crosscheck)命令之前将备份转移到其他路径下,接着对目录进行查询并完全确信不再需要这些备份了,然后再删除。
步骤五:删除过期的备份
这个步骤中将删除前一步骤中已经标注为“过期”的孤立备份集和映像拷贝,为了删除物理的备份以及将资料库中的记录删除为DELETED,可以使用一下命令:
但删除备份片后,运行report和list命令,确保可以将数据库恢复到三个星期以前的状:
2 RMAN > list backup recoverable until time ' SYSDATE-21 ' ;
(图89)