控制文件还能用作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
Configure snapshot controlfile name to 'location/file_name';