一、什么是控制文件

控制文件是Oracle数据库中十分重要的文件。Oracle启动时,首先会读取参数文件,读取了参数文件,实例所需要的共享内存和后台进程就可以启动了,这就是数据库实例的nomunt阶段。完成这个步骤后,就需要通过参数文件中的control_file参数,找到数据库的控制文件,然后打开控制文件,对控制文件进行校验。这就是Oracle数据库实例启动过程中的Mount阶段。

二、控制文件包含哪些信息

控制文件中包含了Oracle数据库十分重要的信息,其中包括整个数据库的物理结构、所有数据文件、REDO LOG文件等信息。但个案控制文件还包含其他重要信息,比如归档模式下的日志归档情况、rman备份时的catalog信息等。

通过如下语句查询控制文件包含的信息

select s.TYPE,s.RECORD_SIZE,s.RECORDS_TOTAL,s.RECORDS_USED from v$controlfile_record_section s;

三、控制文件的管理

四、重建控制文件

控制文件(control file)是一个相当小的文件(最多能增长到64M左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名(必须和db_name参数匹配)、创建数据库的时间戳、归档重做日志的历史(有时这会让控制文件变大)、RMAN信息等。

控制文件应该通过硬件(RAID)多路保存,如果不支持镜像,则要通过Oracle多路保存。应该有不止一个副本,而且它们应该保存在不同的磁盘上,以防止万一出现磁盘故障而丢失控制文件。丢失控制文件并不是致命的,但是会使恢复变得困难很多。

如果丢失了所有的控制文件并且没有任何的备份,我们可以通过重建控制文件来打开数据库。其中,重建控制文件至少需要以下信息:

1.数据库名

2.字符集

3.数据文件名称

4.初始化参数,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;

1.环境准备

数据库版本

我们在Oracle11g中进行测试。

点击(此处)折叠或打开

1.SQL>

2.SQL> select * from v$version;

3.

4.BANNER

5.--------------------------------------------------------------------------------

6.Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

7.PL/SQL Release 11.2.0.3.0 - Production

8.CORE 11.2.0.3.0 Production

9.TNS for Linux: Version 11.2.0.3.0 - Production

10.NLSRTL Version 11.2.0.3.0 - Production

11.

12.SQL>

删除控制文件

1.通过查询control_files初始化参数,获取控制文件路径;

点击(此处)折叠或打开

1.SQL>

2.SQL> show parameter control_files

3.

4.NAME TYPE VALUE

5.------------------------------------ ----------- ------------------------------

6.control_files string /u01/app/oracle/oradata/HOEGH/

7.control01.ctl, /u01/app/oracle

8./oradata/HOEGH/control02.ctl

9.SQL>

2.然后,使用rm命令删除控制文件;

点击(此处)折叠或打开

1.[oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control01.ctl

2.[oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control02.ctl

3.[oracle@HOEGH ~]$

3.此时,强制关闭数据库,然后重启数据库,报ORA-00205错误。需要注意的是,此时执行shutdown immediate命令,数据库无法正常关闭,只能关闭到mounted状态;需要使用shutdown abort命令强制关闭数据库。

点击(此处)折叠或打开

1.SQL>

2.SQL> shutdown immediate

3.Database closed.

4.ORA-00210: cannot open the specified control file

5.ORA-00202: control file: \'/u01/app/oracle/oradata/HOEGH/control01.ctl\'

6.ORA-27041: unable to open file

7.Linux Error: 2: No such file or directory

8.Additional information: 3

9.

10.

11.SQL> select status from v$instance;

12.

13.STATUS

14.------------

15.MOUNTED

16.

17.SQL>

18.SQL> shutdown abort

19.ORACLE instance shut down.

20.SQL>

21.

22.

23.

24.SQL>

25.SQL> startup

26.ORACLE instance started.

27.

28.Total System Global Area 941600768 bytes

29.Fixed Size 1348860 bytes

30.Variable Size 515902212 bytes

31.Database Buffers 419430400 bytes

32.Redo Buffers 4919296 bytes

33.ORA-00205: error in identifying control file, check alert log for more info

34.

35.

36.SQL>

2.获取数据库名

首先生成文本格式的参数文件;

点击(此处)折叠或打开

1.SQL>

2.SQL> create pfile from spfile;

3.

4.File created.

5.

6.SQL>

打开参数文件,查看db_name参数值,即为数据库名称。

点击(此处)折叠或打开

1.[oracle@hoegh dbs]$ cat initHOEGH.ora

2.HOEGH.__db_cache_size=419430400

3.HOEGH.__java_pool_size=4194304

4.HOEGH.__large_pool_size=4194304

5.HOEGH.__oracle_base=\'/u01/app/oracle\'#ORACLE_BASE set from environment

6.HOEGH.__pga_aggregate_target=377487360

7.HOEGH.__sga_target=566231040

8.HOEGH.__shared_io_pool_size=0

9.HOEGH.__shared_pool_size=130023424

10.HOEGH.__streams_pool_size=0

11.*.audit_file_dest=\'/u01/app/oracle/admin/HOEGH/adump\'

12.*.audit_trail=\'db\'

13.*.compatible=\'11.2.0.0.0\'

14.*.control_files=\'/u01/app/oracle/oradata/HOEGH/control01.ctl\',\'/u01/app/oracle/oradata/HOEGH/control02.ctl\'

15.*.db_block_size=8192

16.*.db_domain=\'\'

17.*.db_name=\'HOEGH\'

18.*.diagnostic_dest=\'/u01/app/oracle\'

19.*.dispatchers=\'(PROTOCOL=TCP) (SERVICE=HOEGHXDB)\'

20.*.memory_max_target=943718400

21.*.memory_target=943718400

22.*.open_cursors=300

23.*.processes=150

24.*.remote_login_passwordfile=\'EXCLUSIVE\'

25.*.undo_tablespace=\'UNDOTBS1\'

26.[oracle@hoegh dbs]$

3.启动到nomount状态,获取字符集

由于需要执行查询语句select userenv('language') from dual;来获取字符集,因此需要将数据库启动到nomount状态。

点击(此处)折叠或打开

1.SQL>

2.SQL> startup nomount

3.ORACLE instance started.

4.

5.Total System Global Area 941600768 bytes

6.Fixed Size 1348860 bytes

7.Variable Size 515902212 bytes

8.Database Buffers 419430400 bytes

9.Redo Buffers 4919296 bytes

10.SQL>

11.SQL> select userenv(\'language\') from dual;

12.

13.USERENV(\'LANGUAGE\')

14.----------------------------------------------------

15.AMERICAN_AMERICA.US7ASCII

16.

17.SQL>

18.SQL>

4.获取数据文件名称

通过ls命令获取数据文件列表。

点击(此处)折叠或打开

1.[oracle@hoegh HOEGH]$ ls -lh

2.total 1.8G

3.-rw-r----- 1 oracle oinstall 314M May 30 11:07 example01.dbf

4.-rw-r----- 1 oracle oinstall 51M May 30 11:07 redo01.log

5.-rw-r----- 1 oracle oinstall 51M May 30 11:07 redo02.log

6.-rw-r----- 1 oracle oinstall 51M May 30 11:07 redo03.log

7.-rw-r----- 1 oracle oinstall 541M May 30 11:07 sysaux01.dbf

8.-rw-r----- 1 oracle oinstall 721M May 30 11:07 system01.dbf

9.-rw-r----- 1 oracle oinstall 30M Oct 13 2014 temp01.dbf

10.-rw-r----- 1 oracle oinstall 96M May 30 11:07 undotbs01.dbf

11.-rw-r----- 1 oracle oinstall 5.1M May 30 11:07 users01.dbf

12.[oracle@hoegh HOEGH]$

5.生成创建控制文件脚本

这样,创建控制文件所需的基本信息都已经有了,我们来生成创建控制文件脚本。

点击(此处)折叠或打开

1.STARTUP NOMOUNT

2.CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG

3.MAXLOGFILES 5

4.MAXLOGMEMBERS 3

5.MAXDATAFILES 100

6.MAXINSTANCES 1

7.MAXLOGHISTORY 226

8.LOGFILE

9.GROUP 1 \'/u01/app/oracle/oradata/HOEGH/redo01.log\' SIZE 50M,

10.GROUP 2 \'/u01/app/oracle/oradata/HOEGH/redo02.log\' SIZE 50M,

11.GROUP 3 \'/u01/app/oracle/oradata/HOEGH/redo03.log\' SIZE 50M

12.DATAFILE

13.\'/u01/app/oracle/oradata/HOEGH/system01.dbf\',

14.\'/u01/app/oracle/oradata/HOEGH/sysaux01.dbf\',

15.\'/u01/app/oracle/oradata/HOEGH/undotbs01.dbf\',

16.\'/u01/app/oracle/oradata/HOEGH/users01.dbf\',

17.\'/u01/app/oracle/oradata/HOEGH/example01.dbf\',

18.\'/u01/app/oracle/oradata/HOEGH/temp01.dbf\'

19.CHARACTER SET US7ASCII

20.;

6.重建控制文件

需要注意的是,在执行上述创建脚本时会报错,系统提示临时文件不属于数据文件,如下所示:

点击(此处)折叠或打开

1.SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql

2.ORA-01081: cannot start already-running ORACLE - shut it down first

3.CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG

4.*

5.ERROR at line 1:

6.ORA-01503: CREATE CONTROLFILE failed

7.ORA-01160: file is not a data file

8.ORA-01110: data file : \'/u01/app/oracle/oradata/HOEGH/temp01.dbf\'

9.

10.

11.SQL>

修改脚本并重新执行,重建控制文件后,数据库会打开到mount状态。

点击(此处)折叠或打开

1.SQL>

2.SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql

3.ORACLE instance started.

4.

5.Total System Global Area 941600768 bytes

6.Fixed Size 1348860 bytes

7.Variable Size 515902212 bytes

8.Database Buffers 419430400 bytes

9.Redo Buffers 4919296 bytes

10.

11.Control file created.

12.

13.SQL>

14.SQL> select status from v$instance;

15.

16.STATUS

17.------------

18.MOUNTED

19.

20.SQL>

7.打开数据库

在打开数据库时,会报错,提示system01数据文件需要执行介质恢复,我们执行recover database即可。

点击(此处)折叠或打开

1.SQL>

2.SQL> alater database open;

3.SP2-0734: unknown command beginning \"alater dat...\" - rest of line ignored.

4.SQL>

5.SQL> alter database open;

6.alter database open

7.*

8.ERROR at line 1:

9.ORA-01113: file 1 needs media recovery

10.ORA-01110: data file 1: \'/u01/app/oracle/oradata/HOEGH/system01.dbf\'

11.

12.

13.SQL>

14.SQL> recover database;

15.Media recovery complete.

16.SQL>

17.SQL> alter database open;

18.

19.Database altered.

20.

21.SQL>

22.SQL> select * from v$version;

23.

24.BANNER

25.--------------------------------------------------------------------------------

26.Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

27.PL/SQL Release 11.2.0.3.0 - Production

28.CORE 11.2.0.3.0 Production

29.TNS for Linux: Version 11.2.0.3.0 - Production

30.NLSRTL Version 11.2.0.3.0 - Production

31.

32.SQL>

33.SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME

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

SYSTEM

SYSAUX

UNDOTBS1

TEMP

USERS

EXAMPLE

6 rows selected.

8.总结

下面总结一下重建控制文件的步骤:

1.获取数据库名;

2.获取字符集名;

3.获取数据文件名;

4.重建控制文件;

5.执行介质恢复;

6.打开数据库。

Oracle 物理结构(四) 文件-控制文件的更多相关文章

  1. ORACLE 移动数据文件 控制文件 重做日志文件

    ORACLE数据库有时候需要对存储进行调整,增加分区.IO调优等等,此时需要移动数据文件.重做日志文件.控制文件等等,下文结合例子总结一下这方面的知识点. 进行数据文件.重做日志文件.控制文件的迁移前 ...

  2. 【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?

    真题1. 如何备份控制文件?备份控制文件的方式有哪几种? 答案:备份控制文件的方式有多种. ① 备份控制文件可以在线进行: SQL> ALTER DATABASE BACKUP CONTROLF ...

  3. Oracle 物理结构(七) 文件-归档日志文件

    Oracle 物理结构(七) 文件-归档日志文件

  4. Oracle 物理结构(六) 文件-数据文件

    Oracle 物理结构(六) 文件-数据文件

  5. ORACLE查看数据文件-控制文件-日志文件-表空间信息

    1.查看当前数据库中的所有用户:select username from dba_users; 2.查看当前会话登录的用户:show user或select username from user_us ...

  6. Oracle 物理结构(二) 文件-口令文件

    一.口令文件作用 1.口令文件基本介绍 Oracle数据库口令文件存放有超级用户的口令及其他特殊用户的用户名/口令. 口令文件在数据库创建时,自动创建,存放在$ORACLE_HOME/dbs. 此文件 ...

  7. Oracle 物理结构(三) 文件-参数文件

    一.参数文件介绍 Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, 决定了数据库的物理 结构.内存.数据库的限制及系统大量的默认值.数据库的 ...

  8. Oracle 物理结构(五) 文件-在线日志文件

    一.什么是在线日志文件 默认情况下redo的块大小是磁盘的扇区大小,通常是512字节,但是现在很多磁盘开始支持4k的扇区,oracle能自动识别并使用4k的大小,但是使用4k的redo block会有 ...

  9. Oracle 物理结构(一) 文件-Inventory

    一.Inventory的定义与作用 oraInventory存放的是Oracle软件安装的目录信息,Oralce的安装升级都需要用到这个目录,来看看Oracle文档中对这个目录的一点说明:All Or ...

随机推荐

  1. Python笔记001-Python入门

    第一章:Python入门 1.Python介绍 1.1 简介 Python是一种解释型,面向对象的语言.由吉多·范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布.官网: ...

  2. docker 实践三:操作容器

    在学习了 docker 镜像的内容后,我们在来看 docker 的另一个核心点:容器. 注:环境为 CentOS7,docker 19.03 docker 的容器是镜像的一个运行实例.docker 镜 ...

  3. SAS学习笔记36 二分类logistic回归

    这里所拟合模型的AIC和SC统计量的值均小于只有截距的模型的相应统计量的值,说明含有自变量的模型较仅含有常数项的要好 但模型的最大重新换算 R 方为0.0993,说明模型拟合效果并不好,可能有其他危险 ...

  4. 基于Task的多线程

    /// <summary> /// 基于Task的多线程 /// </summary> public class Tasks { public static void Task ...

  5. 谷歌(Google)学术镜像,谷歌镜像

    谷歌(Google)学术镜像,谷歌镜像 2019-09-03 15:32:26 Hinton-wu 阅读数 6743 文章标签: 谷歌google学术镜像 更多 分类专栏: 其他   版权声明:本文为 ...

  6. [Vue]Vue keep-alive

    keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 ...

  7. (十六)SpringBoot之使用 Caching- - EhCache

    一.案例 1.1 引入maven依赖 <!-- caching --> <dependency> <groupId>org.springframework.boot ...

  8. 奇妙的算法【4】-汉诺塔&哈夫曼编码

    1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着6 ...

  9. .NetCore如何使用ImageSharp进行图片的生成

    ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形.验证码等方式进行探讨和实践. 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片, ...

  10. 通过gpio控制一个进程开启或关闭

    目标: 板子上有个进程需要通过读取gpio的值, 当gpio值为1 时, 开启指定的进程,当gpio为0时, 杀掉这个指定的进程. #include <stdio.h> int main( ...