2010年(61)
分类: Oracle
2010-02-02 08:31:34
前篇介绍了使用RMAN进行各种备份,进阶篇则主要是RMAN的一些功能扩展和增强,学完前面的内容你已经可以完成的各项备份,而通过对本篇的学习,你可以更好、更快、更科学、更合理……(完形填空,请自觉在适当位置补充8万个更开头的形容词)地完成数据库的备份。
本小节的内容又多又杂,为了方便大家阅读,下面将以选择题的形式逐个介绍,如果你赶时间那啥,可以只看自己关注的那部分。
虽然说用BACKUP命令生成的备份集中只备份那些使用了的数据块,备份集实际大小已经较目标数据库的数据文件小了很多。不过对于修改并不频繁但数据文件体积较大的数据库,在执行备份时肯定就希望有一种功能,备份时如果能够只备份那些修改过的数据,这样一来备份集不是又会小很多吗。这点Oracle自然也想到了,增量备份功能正是为满足这一需求而出现的。
如果数据库运行于非归档模式下,那么你只能在数据库干净关闭(以NORMAL、IMMEDIATE、TRANSACTIONAL方式关闭)的情况下才能进行一致性的增量备份,如果数据库运行于归档模式下,那既可以在数据库关闭状态进行,也可以在数据库打开状态进行备份(再次说明了打开归档模式的优势,归档日志只是多占些磁盘空间,好处不是一些,是很多,也相当于又给数据库加了层保险)。
建立增量备份相当简单,实质就是指定一个参数INCREMENTAL LEVEL=n,在执行BACKUP命令时加上即可,增量备份可以创建两个级别,用整型数字0 …n 表示( n 最大不超过4),从0级开始,所有增量备份都必须先创建0级备份。0级备份相当于数据库的完整备份。
需要注意,通过BACKUP DATABASE也是创建数据库的完整备份,但这种的完全备份并不等同于增量备份中的0级备份(虽然都是数据库的完整备份),因为常规的完全备份中不包含增量备份策略,并不支持在其基础上创建增量备份集。
在创建增量备份时,既可以对整库进行备份,也可以仅对表空间甚至数据文件级创建增量备份,例如:
建立增量级别0的全库备份:
为数据文件 user01.dbf 建立增量级别1的备份:
为表空间 USERS 建立增量级别1的备份:
RMAN 提供了两种增量备份类型: DIFFERENTIAL (差异)和 CUMULATIVE (累积),这两种增量类型在创建备份集时的算法是不一样的。默认情况下 RMAN 创建的增量备份是 DIFFERENTIAL 方式,如果要建立 CUMULATIVE 方式的增量备份,需要在执行BACKUP命令时显式指定。
例如,以CUMULATIVE增量备份方式创建数据库完整备份:
关于增量备份概念性解释,比如 DIFFERENTIAL 与 CUMULATIVE 两种方式间的区别请参考本篇外传,括弧,外传整理中,如果您看到本篇的时候外传还没出,这个……别着急,耐心等候,面包和牛奶都会有的。
不少朋友对RMAN的增量备份认识有误解,认为通过增量备份,不仅能够减少备份集大小,而且也会提高备份的效率,节省备份时间,对此我想说,某些极特殊情况下,这种说法不完全错。
在9i及之前的版本中,不管是否是增量备份,RMAN在执行备份时都需要先将所有数据块全部读入内存,检查每一个数据块头的SCN信息,并与增量备份的父备份集相比较来确定块是否被修改过。如果发现块被修改过,则该块所在的数据文件都要重新备份(是的,检查是在块一级,但备份是数据文件级)。由此可知,除非你的系统修改非常频繁(修改太过频繁的系统是否还有必要创建增量备份,这也是个问题),或者I/O设备效率惊人(我是说,惊人的慢),不然增量备份只是节省了存储空间,既不能减少备份时间,也不能达到提高备份效率的目的,甚至还有可能导致备份时间更长(因为多了数据块检查的操作)。
在中Oracle提供了一个新的特性:块修改跟踪(Block Change Tracking)。启用块修改跟踪后,RMAN不用再去扫描数据文件中的每一个块了,直接通过块修改跟踪文件就可以获取哪些块发生了修改的信息。
提示:
可通过下列语句启用块修改跟踪:
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE'/LOACTION/TRK_FILENAME';
如果使用了OMF特性(Oracle-Managed Files),Oracle会自动创建块修改跟踪文件。
可通过下列语句禁用块修改跟踪:
SQL> ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
可以通过下列语句查询是否启用块修改跟踪:
SQL> SELECT STATUS FROM V$BLOCK_CHANGE_TRACKING;需要提醒一句,务必要认识到,虽然备份时间可能减短,并且备份集大小可能减小,但是进行恢复操作时,所需花费的时间有可能会增加,因为数据库恢复时不得不读取多个备份集才能完成恢复操作。
备份与恢复本身就是相对的,有个成语叫此消彼涨用来形容它俩的关系再合适不过。
策略,啧啧,想不到咱也能说出这么专业的词儿啊,人家说专家就是能把任何事务都描述得很专业,俺一定要再多学几个类似的词,要让自己离专家的距离更近一些,或者,俺直接搬到专家们床头边上住去。
如果你所的数据库规模非常大,并且备份执行也比较频繁(废话,不大不频繁也得这么干,优秀的DBA一定要拥有对应其身份的良好的工作习惯),有必要对你这些备份文件的保存制订合理的策略。该挪的挪,该搬的搬,该删除的删,合理释放,最大化利用有限的磁盘空间嘛。
在通过RMAN创建的备份片段中,由于备份文件也是由RMAN创建和维护,所以手工删除并不明智,并且RMAN也提供了备份保留策略,合理制订,由RMAN自动删除过旧的备份文件更加安全也更加方便。
RMAN 中提供了两种备份保留策略:基于时间和基于冗余数量的备份保留策略。
说得简单些,就是你希望数据库最早能恢复到几天前。比如将恢复时间段设置为7,那么RMAN所保留的备份就是可以保证你将数据库恢复到一周内任何时刻下的那些文件。
设置基于时间的备份保留策略可以通过CONFIGURE命令,例如:
注:n=大于0的正整数。
执行该命令后,RMAN将始终保留那些将数据库恢复到n天前的状态时需要用到的备份,比如,恢复时间段被设置为7天,那么各个数据文件的备份必须满足如下条件:
任何不满足上述条件的备份都将被RMAN废弃并可通过DELETE OBSOLETE命令删除。O K ,基本知识讲完了,下面考验你的时刻到了,提问:如果满足条件的备份你也想删,咋整?啥?这么快就忘了?赶紧再回去看看8.3节。
提示:
控制文件中记录保存时间有可能对备份保留策略影响!
对于在NOCATALOG下创建的备份,RMAN的备份集信息都是保存在目标端控制文件中,不过需要注意的是,Oracle数据库的控制文件并不是无限扩展,其中能够保存的记录也是有限的,对于RMAN的备份信息来说,控制文件中保存的这部分信息受制于初始化参数:CONTROL_FILE_RECORD_KEEP_TIME。
初始化参数CONTROL_FILE_RECORD_KEEP_TIME用来指定记录在控制文件中的最少保存时间,以天为单位,默认值为7。也就是说默认情况下备份集信息最短会在控制文件中保存7天,超过7天以后,如果控制文件由于空间不足(控制文件中并不仅仅只存储备份集信息)需要重用记录,那么超出7天的记录可能会被自动覆盖,在重用记录时它并不管你在RMAN中设置的备份保留时间是多久(控制文件在Oracle数据库中的地位那是相当高的)。
因此对于基于时间的备份保留策略,一般建议CONTROL_FILE_RECORD_ KEEP_TIME初始化参数值不小于你在RMAN中设置的备份保留时间。
另外,CONTROL_FILE_RECORD_KEEP_TIME初始化参数也有可能对基于冗余数量的备份策略造成影响,只不过冗余数量无法直接与时间作对比,因此在设置值时,DBA只能视实际情况,根据备份时创建的备份集可能占用的空间来估计初始化参数CONTROL_FILE_RECORD_KEEP_TIME的参数值了。
当前控制文件中分配的空间中,可存储记录和已存储记录数,可以通过查询视图V$CONTROLFILE_RECORD_SECTION获取。基于冗余数量实质上是某个数据文件以各种形式(包括备份集和镜像复制)存在的备份的数量。如果某个数据文件的冗余备份数量超出了指定数量,RMAN将废弃最旧的备份。
同样,基于数量的备份保留策略也是通过CONFIGURE命令设置,例如:
n= 大于0的正整数。
DBA 也可以通过下列命令设置成不采用任何备份保留策略:
如果不设置任何备份保留策略,使用REPORT OBSOLETE和DELETE OBSOLETE命令时也不会有任何匹配的记录,不过REPORT OBSOLETE和DELETE OBSOLETE命令也支持REDUNDANCY和RECOVERY WINDOW参数,参数值的对应规则与CONFIGURE命令配置备份保留策略完全相同,因此如果你决定将显示和删除过期的命令写在脚本中定期执行的话,不通过备份保留策略,而是直接通过REPORT和DELETE命令本身实现这一点也是可行的。
为RMAN设置了备份保留策略之后,RMAN会自动判断哪些备份集或镜像复制文件不必再保留。这些备份文件将会被标记为“废弃”(Obsolete),可以通过REPORT OBSOLETE命令查看当前处于废弃状态的备份文件,或者通过DELETE OBSOLETE命令删除这些废弃的备份。例如:
RMAN> REPORT OBSOLETE;
正在使用目标数据库控制文件替代恢复目录
RMAN 保留策略将应用于该命令
将 RMAN 保留策略设置为 3 天的恢复窗口
已废弃的备份和副本
类型 关键字 完成时间 文件名/句柄
-------------------- ------ ------------------ --------------------
备份集 21 04-7月 -07
备份段 21 04-7月 -07 D:\BACKUP\C-3391142503-20070704-01
RMAN> DELETE OBSOLETE;
RMAN 保留策略将应用于该命令
将 RMAN 保留策略设置为 3 天的恢复窗口
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
删除以下已废弃的备份和副本:
类型 关键字 完成时间 文件名/句柄
-------------------- ------ ------------------ --------------------
备份集 21 04-7月 -07
备份段 21 04-7月 -07 D:\BACKUP\C-3391142503-20070704-01
是否确定要删除以上对象 (输入 YES 或 NO)? y
已删除备份段
备份段 handle=D:\BACKUP\C-3391142503-20070704-01 recid=21 stamp=627061645
1 对象已删除在执行删除命令时有两点需要了解:
对于增量备份,不管是基于时间还是基于冗余数量,RMAN都是检测0级备份是否满足需求。