Oracle数据库包含数据文件、控制文件和日志文件3种类型的物理文件,其中数据文件是用来存储数据的,而控制文件和日志文件则用于维护Oracle数据库的正常运行。
控制文件是Oracle数据库中最重要的物理文件之一,每个Oracle数据库中都必须至少有一个控制文件。在启动数据库实例时,Oracle首先会根据初始化参数查找到控制文件,并读取控制文件中的内容,然后根据控制文件中的信息(如数据库名称、数据文件和日志文件的名称及位置等)在实例和数据库之间建立起关联。如果无法找到控制文件或控制文件被损坏,则数据库实例将无法被启动,并且很难修复。
在Oracle数据库中,控制文件是一个很小的二进制文件(一般在10 MB范围内),含有数据库的结构信息,包括数据文件和日志文件的信息。可以将控制文件理解为物理数据库中的一个元数据存储库。控制文件在数据库创建时被自动创建,并在数据库发生物理变化时被更新。控制文件被不断更新,并且在任何时候都要保证控制文件是可用的。只有Oracle进程才能够安全地更新控制文件的内容,所以任何时候都不要试图手动编辑控制文件。
由于控制文件在数据库中占有重要地位,因此保护控制文件的安全非常重要,Oracle系统提供了备份文件和多路复用的机制。当控制文件被损坏时,可以通过先前的备份来恢复控制文件。系统还提供了手动创建控制文件,以及将控制文件备份成文本文件的方式,从而使用户能够更加灵活地管理和保护控制文件。
控制文件中记录了对应数据库的结构信息(如数据文件和日志文件的名称、位置等信息)和数据库当前的参数设置,主要包含如下内容:
- 数据库名称和SID标识。
- 数据文件和日志文件列表(包括文件名称和对应路径信息)。
- 数据库创建的时间戳。
- 表空间信息。
- 当前重做日志文件序列号。
- 归档日志信息。
- 检查点信息。
- 回滚段(UNDO SEGMENT)的起始和结束。
- 备份数据文件信息。
对控制文件进行日常管理包括及时备份控制文件、及时备份控制文件。
Oracle数据库中的控制文件是在创建数据库时自动创建的,一般情况下,控制文件至少有一个副本。当Oracle数据库中的实例被启动时,控制文件用于在数据库(包括数据文件、控制文件、日志文件)和实例(指Oracle内存管理结构)之间建立起关联,它在进行数据库操作时必须被打开。当数据库的物理组成发生变化(如增加一个重做日志文件)时,Oracle将自动把这个变化信息记录到控制文件中。如果数据库的物理组成发生了变化,则建议及时备份控制文件。
一旦控制文件被损坏,数据库就无法被顺利启动,而且修复控制文件也变得非常困难。由于控制文件对整个数据库起着非常重要的作用,因此数据库管理员在管理控制文件时,需要采用多种策略或准则来保护控制文件,目前采用的方法主要包括多路复用控制文件和备份控制文件。
为了提高数据库的安全性,至少要为数据库建立两个控制文件,并且最好将这两个控制文件分别保存在不同的磁盘中,这样就可以避免由于某个磁盘故障而发生无法启动数据库的危险,该管理策略被称为多路复用控制文件。通俗地说,多路复用控制文件是指在系统的不同位置上同时存储多个控制文件的副本,在这种情况下,如果多路复用控制文件所在的某个磁盘发生物理损坏导致其所包含的控制文件被损坏,数据库将被关闭(在数据库实例启动的情况下),此时就可以先利用另一个磁盘中所保存的控制文件来恢复被损坏的控制文件,然后重新启动数据库,以达到保护控制文件和数据的目的。
在初始化参数CONTROL_FILES中列出了当前数据库的所有控制文件名。Oracle将根据CONTROL_FILES参数中的信息同时修改所有的控制文件,但只读取其中第一个控制文件中的信息。需要注意的是,在整个数据库运行期间,如果任何一个控制文件被损坏,那么实例就不能再继续被运行。实现控制文件的多路复用主要包括更改CONTROL_FILES参数和复制控制文件两个步骤,具体流程如下:
在SPFILE文件中,CONTROL_FILES参数被用于设置数据库的控制文件路径(包括文件名),Oracle通过该参数来定位并打开控制文件,如果需要对控制文件进行多路复用,就必须先更改CONTROL_FILES参数的设置,更改这个参数可以使用ALTER SYSTEM语句,具体方法如下列示例代码:
alter system set control_files=
'/opt/oracle/oradata/ORCLCDB/control01.ctl',
'/opt/oracle/oradata/ORCLCDB/control02.ctl',
'/OracleFiles/ControlFiles/control03.ctl'
scope=spfile;
我的环境是CentOS系统,Windows系统的话,按Windows系统中的实际路径来; 在上述代码中,前两个控制文件control01.ctl和control02.ctl是在创建数据库时自动创建的,第三个控制文件control03.ctl是要手动添加的(用于实现多路复用的功能),并且它们位于不同的磁盘上(为了降低故障率),但当前还没有创建该文件,需要先关闭数据库,然后通过手动复制来创建该文件。
通过下面的语句查看添加的控制文件是否已经起作用,可以看到并没有control03.ctl,因为还没有该文件。
–通过查询数据字典v$controlfile来确认添加的控制文件是否已经起作用
select name as 控制文件 from v$controlfile;
在对CONTROL_FILES参数进行设置后,需要创建第三个控制文件,以达到复用控制文件的目的,具体步骤如下:
注意:我的环境是CentOS系统,Windows系统直接在服务里停止Oracle数据库即可,找到控制文件,复制控制文件。
①切到oracle用户下,关闭监听再关闭实例##停监听
lsnrctl stop
##进入sqlplus
sqlplus /nolog
##以sysdba权限登录到sqlplus
SQL> connect /as sysdba
##关闭oracle实例
SQL> shutdown immediate
②创建控制文件control03.ctl
切换到root用户,创建控制文件control03.ctl存放目录;
##创建存放control03.ctl存放目录
mkdir -p /OracleFiles/ControlFiles/
##通过复制control01.ctl创建control03.ctl
cp /opt/oracle/oradata/ORCLCDB/control01.ctl /OracleFiles/ControlFiles/control03.ctl
##修改control03.ctl文件的所有者及所属组
chown -R oracle:oinstall /OracleFiles/
注意:必须修改control03.ctl文件的所有者及所属组为oracle:oinstall,要不然数据库无法启动。
③启动数据库,查看新添加的控制文件是否起作用切换到oracle账号,开启监控,启动oracle实例;
##停监听
lsnrctl start
##以sysdba权限登录到sqlplus
sqlplus / as sysdba
##启动oracle实例
SQL> startup;
##通过查询数据字典v$controlfile来确认添加的控制文件是否已经起作用
SQL> select name as 控制文件 from v$controlfile;
可以看到数据库正常启动,控制文件contorl03.ctl已经起作用。
为了提高数据库的可靠性,降低由于丢失控制文件而造成灾难性后果的可能性,DBA需要经常对控制文件进行备份。特别是当修改了数据库结构之后,需要立即对控制文件进行备份。
备份控制文件需要使用ALTER DATABASE BACKUP CONTROLFILE语句。
可以备份为两种文件形式:一种是备份为二进制文件;另一种是备份为脚本文件。将数据库的控制文件备份为一个二进制文件,即复制当前的控制文件,代码如下:
alter database backup controlfile
to '/opt/oracle/oradata/ORCLCDB/control_file1.bkp';
将数据库的控制文件备份为一个可读的文本文件,代码如下:
alter database backup controlfile to trace;
将控制文件以文本形式备份时,所创建的文件也称为跟踪文件,该文件实际上是一个SQL脚本,可以利用它来“重新创建”新的控制文件。
跟踪文件的存储位置由SPFILE文件中的USER_DUMP_DEST参数来决定。使用SHOW命令显示跟踪文件(即那个备份的可读的文本文件)的存储位置,代码如下:
show parameter user_dump_dest;
当对控制文件进行备份后,即使发生磁盘物理损坏,也只需要在初始化文件中重新设置CONTROL_FILES参数的值,使它指向备份的控制文件,即可重新启动数据库。
现在假设参数CONTROL_FILES所指定的某个控制文件被损坏,但该控制文件的目录仍然可以被访问(因为所在盘区并没有损坏),并且这个控制文件具有一个多路复用文件,那么可以直接将其复制到对应的目录下,无须修改初始化参数,其操作步骤如下:
①关闭数据库,代码如下
SQL> shutdown immediate;
②复制这个损坏的控制文件对应的一个多路复用文件,覆盖原始目录下的损坏文件。
③重新启动数据库,代码如下:SQL> startup;
如果某个磁盘分区发生了物理性的永久损坏,而导致Oracle系统不能访问CONTROL_FILES参数指定的某个控制文件,并且在这个控制文件具有一个多路复用文件的情况下,用户可以修改初始化参数以将控制文件指定到新的可以被访问的位置上,其操作步骤如下:
①关闭数据库实例(SHUTDOWN),将当前控制文件的一个多路复用文件复制到一个新的可用位置上。
②编辑初始化参数CONTROL_FILES,用新的控制文件的位置替换掉原始损坏的位置,或者删除原始损坏的位置,添加一个新的控制文件的位置。
③重新启动数据库(STARTUP)。
如果控制文件的位置不再适合时,可以从数据库中删除该控制文件,其操作过程如下:
①关闭数据库(SHUTDOWN)。
②编辑初始化参数CONTROL_FILES,清除打算要删除的控制文件的名称。
③重新启动数据库(STARTUP)。
上述第②步操作,仅仅是在初始化参数CONTROL_FILES中删除了指定的控制文件,但物理磁盘上的控制文件仍然存在,在这个操作之后,需手动清除磁盘上的物理文件。
注意:不能将控制文件全部删除,应保留两个或两个以上文件,否则数据库将无法被启动。
控制文件是一个二进制文件,其中被分隔成许多部分,分别记录各种类型的信息。每一类信息成为一个记录文档段。控制文件的大小在创建时即被确定,其中各个记录文档段的大小也是固定的。例如,在创建数据库时通过MAXLOGFILES子句设定了数据库中最多的重做日志文件数量,那么在控制文件中就会为LOGFILE记录文档分配相应的存储空间。
使用v$controlfile_record_section视图查看控制文件中记录文档段的类型、文档段中每条记录的大小、记录文档中最多能够存储的条目数、已经创建的数目等信息。
代码如下:
select type,record_size,records_total,records_used from v$controlfile_record_section;