Oracle数据库文件 —— 控制文件

控制文件管理

【学习目标】

在本章中,我们将学习Oracle数据库控制文件的有关知识和操作。控制文件是Oracle数据库3类重要的物理文件之一。控制文件中记载了数据库的物理结构等重要的数据库信息,是用于维护数据库完整性的重要文件。

【本章要点】

<!--[if !supportLists]--&gt<!--[endif]--&gt控制文件的内容

<!--[if !supportLists]--&gt<!--[endif]--&gt控制文件的复用

<!--[if !supportLists]--&gt<!--[endif]--&gt控制文件的重建

<!--[if !supportLists]--&gt<!--[endif]--&gt查询控制文件信息

【关键术语】

Control file 控制文件                          Multiplex复用

Backup 备份


<!--[if !supportLists]--&gt一、<!--[endif]--&gtOracle数据库控制文件

控制文件中记载了数据库的物理结构等重要的数据库信息,如数据文件和日志文件信息。控制文件是用于维护数据库完整性的重要文件。Oracle正是使用该文件在实例和数据库之间建立关联的。当发生实例故障时,控制文件记载的信息可用于实例的恢复。

<!--[if !supportLists]--&gt1.<!--[endif]--&gt控制文件概述

在数据库的启动过程中,当装载(MOUNT)数据库时,Oracle会按照初始化参数文件中的control_files参数的设置查找并打开控制文件;而当打开(OPEN)数据库时,Oracle会根据控制文件所记录的数据文件和重做日志信息,打开数据文件和重做日志文件。

控制文件是一个很小的二进制文件,在启动Oracle数据库时需要从中读取信息,它的大小一般是在创建数据库时确定的。在对Oracle数据库进行操作过程中,会不断地将信息写回控制文件,所以在Oracle数据库打开的过程中,控制文件必须是可用的。

<!--[if !supportLists]--&gt2.<!--[endif]--&gt使用相关视图查看控制文件的相关信息

V$CONTROLFILE                   --列出实例中所有控制文件的名字及状态信息

V$PARAMETER                     --列出所有参数的位置及状态信息

V$CONTROLFILE_RECORD_SECTION    --列出控制文件中记录的部分信息

SHOW PARAMETER CONTROL_FILES    --列出控制文件的名字、状态、位置等


 

SQL> select * from v$controlfile;

STATUS  NAME                               IS_ BLOCK_SIZE FILE_SIZE_BLKS

-----------  --------------------------------------------------    ------------------ ---------- --------------

             /u01/app/oracle/oradata/orcl/control01.ctl    NO       16384    430

             /u01/app/oracle/oradata/orcl/control02.ctl    NO       16384    430

             /u01/app/oracle/oradata/orcl/control03.ctl    NO       16384    430

 

控制文件中记载了数据文件、重做日志名称和位置、日志序列号、检查点和日志历史信息,以及RMAN(一种备份和恢复工具)备份信息。当Oracle服务器出现实例失败或介质失败时,通过控制文件所记载的日志和检查点信息,Oracle可以确定执行恢复所需要的日志文件。从Oracle8版本开始,Oracle提供了使用RMAN执行备份与恢复的方法,RMAN可以简化用户所要执行的备份与恢复操作,并且其备份信息会被存放到控制文件中。

控制文件一旦丢失或损坏,就会导致整个数据库不可用。所以保证控制文件的可用性,对Oracle数据库来说是至关重要的。例如,当使用RMAN进行备份时,其备份信息会记录到控制文件中,假定控制文件出现丢失或损坏,那么因为备份信息丢失可能会导致其备份文件不能使用。对于Oracle数据库,可以采用复用控制文件的方法来保护控制文件。

<!--[if !supportLists]--&gt二、<!--[endif]--&gt控制文件的内容

前面已经给大家介绍过,在控制文件中要记载数据文件、重做日志、日志历史等信息。GTyhKJxkSJQAAAABJRU5ErkJggg==
















其中初始化参数文件中的DB_NAME必须与控制文件中记载的数据库名称相同。

控制文件分保存的信息分为可变的和不可变的

<!--[if !supportLists]--&gt1.<!--[endif]--&gt可变部分

RMAN备份信息。到了control_file_record_keep_time 之后,就会被覆盖

参数 control_file_record_keep_time 是一个位于控制文件中比较重要的参数。 它决定了控制文件里可重复使用的记录所能保存的最小天数。当一条新的记录需要添加到可重用记录 的空间时,并且最老的记录在可重用记录空间中还没有老化,即实际保留的天数未超过这个参数规定的天数,则控制文件中可重用记录部分的空间将被自动扩展,此时控制文件尺寸 将会变大。

control_file_record_keep_time 定义信息     

 

    Property              Description

-----------------------------------------------------------

Parameter type         Integer

Default value           7 (days)             --缺省值

Modifiable              ALTER SYSTEM     --使用ALTER SYSTEM 修改

Range of values         0 to 365 (days)      --其值的范围从0-365

Basic                  No

----------------------------------------------------------    

]

 

 

<!--[if !supportLists]--&gt1) <!--[endif]--&gt官方定义

  CONTROL_FILE_RECORD_KEEP_TIME指定一个可重用的记录在控制文件中最少可重复使用的天数

如果由于需要一个新的记录被添加到可重复使用的部分,最旧的记录还未达到指定的值,记录部分扩展。如果该参数被设置为0,然后可重复使用的部分永远不会扩大,记录根据需要被重用。

 

注意事项:

此参数只适用于在控制文件中的记录,可循环重用(如归档日志记录和各种备份记录)。 它不适用于记录,如数据文件,表空间和重做记录,不会被重用,除非表空间中删除相应的对象。

<!--[if !supportLists]--&gt2) <!--[endif]--&gt可重用的模块

        ARCHIVED LOG                       BACKUP CORRUPTION

        BACKUP DATAFILE                    BACKUP PIECE

        BACKUP REDO LOG                   BACKUP SET

        COPY CORRUPTION                   DATAFILE COPY

        DELETED OBJECT                     LOGHISTORY

     OFFLINE RANGE   

 

<!--[if !supportLists]--&gt2.<!--[endif]--&gt不可变部分(控制文件永久参数)

 

关于数据库的那些信息,文件位置,大小,日志位置,数据库名,等等是不会丢失的!

 

控制文件中会为每个数据文件预留180字节的空间,该空间将用于记载数据文件的名称、尺寸、状态以及检查点等信息,假定数据库最多可以包含1000个数据文件,那么控制文件就要为数据文件分配大约180KB的空间。在执行CREATE DATABASE命令建立数据库时,通过设置永久参数可以设定数据库可以包含的最大数据文件以及重做日志个数等,这些永久参数的设置会影响控制文件的尺寸。这些参数是:

<!--[if !supportLists]--&gt<!--[endif]--&gtMAXDATAFILES:用于指定控制文件可记载的最大数据文件个数。

<!--[if !supportLists]--&gt<!--[endif]--&gtMAXLOGFILES:用于指定数据库中重做日志组的最大个数。

<!--[if !supportLists]--&gt<!--[endif]--&gtMAXLOGMEMBERS:用于指定每个日志组的最大日志成员个数。

<!--[if !supportLists]--&gt<!--[endif]--&gtMAXLOGHISTORY:用于指定控制文件可记载日志历史的最大个数。

<!--[if !supportLists]--&gt<!--[endif]--&gtMAXINSTANCES:用于指定可以同时访问数据库的最大实例个数。

 

 

 

SQL> SELECT type, record_size, records_total, records_used

  2  FROM v$controlfile_record_section; 

 

TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED

---------------------------- ----------- ------------- ------------

DATABASE                             316             1            1

CKPT PROGRESS                       8180            11            0

REDO THREAD                          256             8            1

REDO LOG                              72            16            3

DATAFILE                             428           100            5

FILENAME                             524          2298            9

TABLESPACE                            68           100            6

TEMPORARY FILENAME                    56           100            1

RMAN CONFIGURATION                  1108            50            0

LOG HISTORY                           56           292            1

OFFLINE RANGE                        200           163            0

ARCHIVED LOG                         584            28            0

BACKUP SET                            40           409            0

BACKUP PIECE                         736           200            0

BACKUP DATAFILE                      116           282            0

BACKUP REDOLOG                        76           215            0

DATAFILE COPY                        660           223            1

BACKUP CORRUPTION                     44           371            0

COPY CORRUPTION                       40           409            0

DELETED OBJECT                        20           818            1

PROXY COPY                           852           249            0

BACKUP SPFILE                         36           454            0

DATABASE INCARNATION                  56           292            2

FLASHBACK LOG                         84          2048            0

RECOVERY DESTINATION                 180             1            0

INSTANCE SPACE RESERVATION            28          1055            1

REMOVABLE RECOVERY FILES              32          1000            0

RMAN STATUS                          116           141            0

THREAD INSTANCE NAME MAPPING          80             8            8

MTTR                                 100             8            1

DATAFILE HISTORY                     568            57            0

STANDBY DATABASE MATRIX              400            10           10

GUARANTEED RESTORE POINT             212          2048            0

RESTORE POINT                        212          2083            0

 

 

 

 

控制文件大小实验:

 

 

//trace备份控制文件

SQL> alter database backup controlfile to trace as '/home/oracle/ctl';

//创建重建控制文件脚本

[oracle@oracle ~]$ cat ctl | grep -v ^- | grep -v ^$ > c.sql

oracle@oracle ~]$ vim c.sql 

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 180

LOGFILE

  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M,

  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M,

  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M

DATAFILE

  '/u01/app/oracle/oradata/orcl/system01.dbf',

  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',

  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

  '/u01/app/oracle/oradata/orcl/users01.dbf',

  '/u01/app/oracle/oradata/orcl/example01.dbf'

"c.sql" 18L, 637C written                                    

//重建控制文件

[oracle@oracle ~]$ sqlplus / as sysdba

SQL> shutdown immediate;

SQL> startup nomount;

SQL> @/home/oracle/c.sql

Control file created.

SQL>SELECT type, record_size, records_total, records_used

FROM v$controlfile_record_section; 

 

8192   一个占用56

设置   300      584   8192/56=146    146*4=584

设置   200      292   146*2

设置   600      876   146*6

 

 

 

 

 

<!--[if !supportLists]--&gt三、<!--[endif]--&gt控制文件操作

<!--[if !supportLists]--&gt1.<!--[endif]--&gt复用控制文件

<!--[if !supportLists]--&gt1) <!--[endif]--&gt保证控制文件的可用性

保证控制文件的可用性的方法是通过保留控制文件的多个复本,多个控制文件副本互为镜像,内容总是保持完全一致。这样当一个控制文件发生损坏或丢失,仍然可以使用其它的控制文件副本启动数据库,而不需要进行数据库恢复。然后,在适当时机增加新的控制文件,使控制文件仍然保持有多个镜像。每个Oracle数据库至少应该包含两个或两个以上的控制文件,控制文件的总数不能超过8个。

应该合理地放置控制文件,在设计数据库时,尽可能将控制文件分布到不同的磁盘上,以避免磁盘损坏导致所有控制文件丢失。另外,在修改了Oracle数据库的物理结构后,最好对控制文件进行一次备份。

<!--[if !supportLists]--&gt2) <!--[endif]--&gt复用控制文件的方法

控制文件的复用是如何实现的呢?又怎样才能增加新的控制文件镜像呢?

AaxhN3WSVx9fAAAAAElFTkSuQmCC

方法很简单,停止数据库后,我们可以首先查看初始化参数文件,找到参数control_files,如图6-3所示,其中描述了目前使用的控制文件和位置。为了增加新的控制文件镜像,可以先用操作系统命令复制一个新的控制文件,然后修改该参数的设置。














注意:在数据库打开时,控制文件是动态的,不能在数据库运行过程中复制控制文件,只有停止数据库后控制文件才是静止和一致的。否则增加镜像的过程就会失败。

 

<!--[if !supportLists]--&gt3) <!--[endif]--&gt镜像丢失的维护

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

控制文件镜像丢失的维护

<!--[if !supportLists]--&gt① <!--[endif]--&gt查看当前的控制文件

 

SQL> SELECT name FROM v$controlfile;

NAME

-----------------------------------------

/disk1/orcl/control01.ctl

/disk2/orcl/control02.ctl

/disk3/orcl/control03.ctl

 

<!--[if !supportLists]--&gt② <!--[endif]--&gt关闭数据库,删除最后一个控制文件CONTROL03.CTL到回收站

 

SQL> SHUTDOWN

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

 

<!--[if !supportLists]--&gt③ <!--[endif]--&gt手工删除控制文件/disk3/orcl/control03.ctl

<!--[if !supportLists]--&gt④ <!--[endif]--&gt重新启动数据库,观察现象

 

SQL> STARTUP

ORACLE 例程已经启动。

Total System Global Area   64035360 bytes

Fixed Size                   453152 bytes

Variable Size              29360128 bytes

Database Buffers           33554432 bytes

Redo Buffers                 667648 bytes

ORA-00205: ?????????????????????

 

数据库停止在NOMOUNT状态,错误ORA-00205表示控制文件错误,但这条信息并不明确。

 

 

 

<!--[if !supportLists]--&gt⑤ <!--[endif]--&gt查看跟踪记录信息

通过查看跟踪记录信息,可以进一步确定错误类型。跟踪文件位于$Oracle_Base/admin/db01/bdump,名称为Alert_db01.log。该文件是db01数据库的跟踪警告文件,文件的最后有如下信息。

 

Fri Apr 14 14:52:00 2006

ORA-00202: controlfile: '/disk3/orcl/control03.ctl'

ORA-27041: unable to open file

OSD-04002: 无法打开文件

 

可以看出'/disk3/orcl/control03.ctl'无法打开

<!--[if !supportLists]--&gt⑥ <!--[endif]--&gt修改服务器端参数文件

 

SQL>  ALTER SYSTEM SET control_files =

'/disk1/orcl/control01.ctl','/disk2/orcl/control02.ctl'

SCOPE=SPFILE;

系统已更改。

 

<!--[if !supportLists]--&gt⑦ <!--[endif]--&gt关闭并重新启动数据库,使初始化参数的修改生效。

 

SQL> SHUTDOWN

ORA-01507: ??????

ORACLE 例程已经关闭。

SQL> STARTUP

ORACLE 例程已经启动。

Total System Global Area   64035360 bytes

Fixed Size                   453152 bytes

Variable Size              29360128 bytes

Database Buffers           33554432 bytes

Redo Buffers                 667648 bytes

 

<!--[if !supportLists]--&gt⑧ <!--[endif]--&gt查看控制文件信息

 

SQL> SELECT name FROM v$controlfile;

NAME

-----------------------------------------

/disk1/orcl/control01.ctl

/disk2/orcl/control02.ctl

 

可以看到,控制文件只有两个镜像,至此数据库已经打开并可以正常工作了。

 

<!--[if !supportLists]--&gt2.<!--[endif]--&gt为控制文件增加镜像

在数据库启动状态下,修改服务器端初始化参数文件

 

SQL> ALTER SYSTEM SET control_files =

'/disk1/orcl/control01.ctl','/disk2/orcl/control02.ctl','/disk3/orcl/control03.ctl'

SCOPE=SPFILE;

 

<!--[if !supportLists]--&gt① <!--[endif]--&gt关闭数据库,以确保复制后的控制文件与源控制文件内容完全相同

 

SQL> SHUTDOWN

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

 

<!--[if !supportLists]--&gt② <!--[endif]--&gt复制控制文件

可以使用当前的两个控制文件任意一个,复制为新的控制文件。

在本实例中,在/disk1/orcl/目录下,将控制文件control01.ctl复制为/disk1/orcl/control03.ctl

<!--[if !supportLists]--&gt③ <!--[endif]--&gt重新启动数据库

 

SQL> STARTUP

ORACLE 例程已经启动。

Total System Global Area   64035360 bytes

Fixed Size                   453152 bytes

Variable Size              29360128 bytes

Database Buffers           33554432 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

 

<!--[if !supportLists]--&gt④ <!--[endif]--&gt查看结果

 

SQL> select name from v$controlfile;

NAME

---------------------------------------------

/disk1/orcl/control01.ctl

/disk2/orcl/control02.ctl

/disk3/orcl/control03.ctl

 

 

<!--[if !supportLists]--&gt四、<!--[endif]--&gt备份与重建控制文件

<!--[if !supportLists]--&gt1.<!--[endif]--&gt控制文件重建的意义

当控制文件全部丢失或损坏,但数据文件和重做日志没有丢失和损坏。如果有一份在用数据文件、重做日志以及控制文件清单,还是可以尝试使用CREATE CONTROLFILE命令来重建控制文件。另外,如果要改变数据库名称或永久参数(MAX_DATAFILE)的话,也只能重新建立控制文件。

但是,必须要注意,建立控制文件是一项非常危险的工作,如果建立控制文件不成功,可能会潜在地损坏数据文件和重做日志。所以在建立控制文件之前,必须首先备份所有数据文件和重做日志,避免损坏用户的数据库。另外,建立控制文件要求用户必须要具有SYSDBA系统权限。

<!--[if !supportLists]--&gt2.<!--[endif]--&gt控制文件的备份

控制文件本身也有必要在适当的时候进行备份,特别是数据库的结构进行了很大的修改。那么,可不可以将控制文件复制到另外一个位置,就算是备份了呢?这样做没有任何意义,因为控制文件里面的信息是不断更新的,如果把这样的备份用于启动数据库就会失败。Oracle 9i提供了一个系统命令,可以将控制文件以脚本的形式备份到跟踪(或二进制)文件中,可以将此备份的脚本通过修改用于控制文件的重建。这条命令如下:

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

<!--[if !supportLists]--&gt五、<!--[endif]--&gt小结

控制文件是用于维护数据库完整性的重要文件,控制文件中记录了日志文件和数据文件以及检查点等信息,控制文件的位置由初始化参数文件指明,控制文件在装载数据库阶段打开。为了保证控制文件的可用性,通常需要通过移动、增加或删除镜像文件的方法来对其进行维护。


<!--[if !supportLists]--&gt六、<!--[endif]--&gt练习

1.当复用了控制文件后,其中一个控制文件损坏,理想的解决方法是( )

A.删除损坏的控制文件即可

B.用好的控制文件,覆盖坏的控制文件

C.删除参数文件

D.必须进行数据库恢复

2.如何修改数据库所允许的重做日志个数( )

A.修改初始化参数 B.重建参数文件

C.修改控制文件 D.重建控制文件

3.增加控制文件的镜像文件,说法正确的是( )

A.不能位于不同的物理磁盘驱动器 B.必须在实例启动时进行

C.需要修改初始化参数文件 D.需要重建控制文件

4.控制文件中不包含( )

A.数据文件信息 B.重做日志文件信息

C.实例信息 D.数据库有关信息

5.以下视图信息,不是来自控制文件的是( )

AV$DATAFILE BV$TABLESPACE

CV$DATABASE DV$INSTANCE

 

<!--EndFragment--&gt

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29781254/viewspace-1744993/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29781254/viewspace-1744993/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值