
ControlFile Manage
控制文件概述
控制文件是一个很小的二进制文件,在启动Oracle数据库时需要从中读取信息,其大小一般是在创建数据库时确定的。在对Oracle数据库进行操作的过程中,会不断地将信息写回控制文件,因此在Oracle数据库打开的过程中,控制文件必须是可用的。
控制文件中记录了数据文件、重做日志名称和位置、日志序列号、检查点和日志历史信息,以及RMAN(一种备份和恢复工具)备份信息。当Oracle服务器出现实例失败或介质失败时,通过控制文件所记载的日志和检查点信息,Oracle可以确定执行恢复所需要的日志文件。
RMAN可以简化用户所要执行的备份与恢复操作,并且其备份信息会被存放到控制文件中。
控制文件一旦丢失或损坏,就会导致整个数据库不可用,因此保证控制文件的可用性,对Oracle数据库来说是至关重要的。例如,当使用RMAN进行备份时,其备份信息会记录到控制文件中,假定控制文件出现了丢失或损坏,那么因为备份信息丢失可能会导致其备份文件不能使用。对于Oracle数据库,可以采用复用控制文件的方法来达到保护控制文件的目的。
①当MOUNT数据库时,Oracle会按照初始化参数文件中的control_file参数的设置查找并打开控制文件;
②当OPEN数据库时,oracle会根据控制文件所记录的数据文件和重做日志文件信息,打开数据文件和重做日志文件。
控制文件内容
①控制文件:记载了数据文件、重做日志文件、日志历史等信息。

②控制文件永久参数:控制文件中会为每个数据文件预留180B的空间,该空间将用于记载数据文件的名称、尺寸、状态以及检查点等信息。在执行CREATE DATABASE命令建立数据库时,通过设置永久参数可以设定数据库包含的最大数据文件以及重做日志文件个数等,这些永久参数的设置会影响控制文件的尺寸。
MAXDATAFILES:用于指定控制文件可记载的最大数据文件个数。
MAXLOGFILES:用于指定数据库中重做日志组的最大个数。
MAXLOGMEMBERS:用于指定每个日志组的最大日志成员个数。
MAXLOGHISTORY:用于指定控制文件可记载日志历史的最大个数。
MAXINSTANCES:用于指定可以同时访问数据库的最大实例个数。
控制文件操作
①保证控制文件的可用性:
保留控制文件的多个副本,多个控制文件副本互为镜像,内容保持完全一致。
当一个控制文件发生损坏或丢失时,可以使用其他控制文件副本启动数据库,而不需要进行数据库恢复。在适当实际增加新的控制文件,使控制文件仍然保持有多个镜像。每个Oracle数据库至少应该包含两个或两个以上的控制文件,控制文件的总数不能超过8个。
做法:合理放置控制文件,在设计数据库时,尽可能将控制文件分布到不同的磁盘上,以避免磁盘损坏导致所有控制文件丢失。另外,在修改了Oracle数据库的物理结构后,最好对控制文件进行一次备份。
②复用控制文件的方法:
停止数据库,查看初始化参数文件,找到control_files,其中描述了目前使用的控制文件和位置。为了增加新的控制文件镜像,可以先用操作系统赋值一个新的控制文件,然后修改该参数的位置。
注意:数据库打开时,控制文件时动态的,不能在数据库运行过程中复用控制文件,只有停止数据库后控制文件才是静止和一致的,否则增加镜像的过程中就会失败。
Step1:
数据库启动状态下,修改服务器端初始化参数文件
Step2;
关闭数据库,确保复制后的控制文件与源控制文件内容完全相同

Step3:
复制控制文件,使用当前的两个控制文件的任意一个,复制为新的控制文件

Step4:
重新启动数据库

Step5:
查看结果

注意:在实际的生产数据库中,为了避免磁盘介质故障,造成控制文
件同时丢失,建议将增加的新镜像放在一个新的磁盘驱动器上。

③镜像丢失的维护
尝试在关闭数据库的状态下,删除一个控制文件到回收站,来模拟控制文件的丢失,然后启动数据库,观察控制文件丢失一个镜像的现象,并采取相应的维护措施,使数据库能够正常工作。
Step1:
查看当前控制文件

Step2:
删除最后一个控制文件control03.ctl,尝试immediate关闭数据库

Step3:
使用当前的两个控制文件的任意一个,复制为control3
Step4:
使用abort关闭数据库实例,并且重新启动到open状态
(注意:上一步数据库关闭到了mount状态时停止)

控制文件查询
①控制文件相关视图
V$BACKUP、 V$DATAFILE、 V$TEMPFILE、 V$TABLESPACE、 V$TABLESPACE、 V$ARCHIVE、 V$LOG、V$LOGFILE、V$LOGHIST、 V$ARCHIVED_LOG 、 V$DATABASE
②查询控制文件信息




备份控制文件
①意义:
当控制文件全部丢失或损坏,但数据文件和重做日志没有丢失或损坏。如果有一份在用数据文件、重做日志文件以及控制文件清单,可以尝试使用CREATE CONTROLFILE命令来重建控制文件。如果想要改变数据库名称或永久参数(MAX_DATAFILE等)的话,就只能重建控制文件。
注意:建立控制文件是一项非常危险的工作,如果建立控制文件不成功,可能会潜在地顺坏数据文件和重做日志文件。所以在建立控制文件之前,必须首先备份好数据文件和重做日志文件,避免损坏用户的数据库。另外,建立控制文件要求用户必须拥有SYSDBA系统权限。
②控制文件备份:
控制文件本身也有必要适当进行备份,特别时数据库的结构有了很大的修改。Oracle提供了一个系统命令,可以将控制文件以脚本的形式备份到跟踪文件中,可以将此备份文件的脚本通过修改用于控制文件的重建。
Step1:
备份控制文件到二进制文件
(先创建备份还原文件夹和相关目录)


Step2:
使用备份生成SQL语句,用于以后重建控制文件

Step3:
使用RMAN备份控制文件
重建控制文件
重建控制文件可以修改控制文件中的永久参数,对于其他重建控制文件可模仿进行。
Step1:
将控制文件备份到跟踪文件,以获得控制文件的重建脚本

Step2:
配置控制文件重建脚本

执行命令:
:set nu
:32,$d
:set nonu
:wq
结果为:

Step3:
关闭并数据库并执行建控制文件脚本



SUMMARY
①增加或减少一个控制文件:
Step1:查询控制文件信息
Step2:修改control_files参数减少一个控制文件(alter system set control_files="","" scope=spfile)
Step3:增加或删减控制指定文件
Step4:重启数据库
启动过程中,如果出现版本号不一致的问题:
ORA-00214: 解决方法:用高版本号的控制文件覆盖低版本号的控制文件
②控制文件部分丢失
Method1:将存在的控制文件复制到目标路径并更改控制文件名为正确的即可
Method2:修改控制文件参数,将丢失的控制文件去掉
③控制文件全部丢失;
利用控制文件的重建脚本,重建控制文件
Step1:将控制文件备份到跟踪文件,获得控制文件重建脚本
alter database backup controlfile to trace as ‘目标路径/recreate_ctl.sql’
Step2:创建重建控制文件脚本
cat recreate_ctl.sql | grep -v ^- | grep -v ^$ > create_ctl.sql
Step3:删除所有控制文件
Step4:nomount状态
Step5:重建控制文件
Step6:开启数据库
完
小陈今天的分享就到这里啦!
期待下一期的邂逅!




