oracle控制文件

来源:互联网 发布:2015年轴承行业数据 编辑:程序博客网 时间:2024/06/03 04:02

概念

控制文件是一个比较小的二进制文件,记录了物理数据库的当前状态;每一个控制文件只属于一个数据库,数据库可以有多个控制文件(处于安全考虑,一般多几个就相当于多了几个备份),但是一个控制文件不能对应多个数据库;数据库处于打开状态,服务器会随时修改控制文件的内容;任何用户都不能修改控制文件的数据。

所存信息

  • 数据库名字
  • 数据库标识符(创建数据库时自动产生)
  • 数据库创建时间戳(创建数据库时产生)
  • 联机重做日志文件的名字和准确位置
  • 当前日志的序列号
  • 校验点信息
  • 日志的历史信息
  • 归档日志文件的准确位置和状态
  • 数据文件的名字和准确位置
  • 表空间的信息
  • 备份的准确位置和状态

使用和维护

获取控制文件信息的数据字典(动态视图)

  • v$archived #归档archived意思是:归档的。
  • v$archived_log
  • v$backup
  • v$database
  • v$datafile
  • v$log
  • v$logfile
  • v$loghist
  • v$tablespace
  • v$tempfile

控制大小

由于oracle服务器会经常操纵控制文件,所以控制文件应该尽量小,但是oracle并没有提供可行方案去直接改变控制文件大小,所以我们只能通过间接的方式来调整,为此我们必需了解控制文件组成——可重用部分和不可重用部分。

  • 可重用部分
    利用CONTROL_FILE_RECORD_KEEP_TIME参数来控制,这个参数默认为7天,意思是可重用部分的数据保留7天,之后可以被覆盖。可重用部分是供rman(恢复管理器使用的,这部分可以自动扩展)

  • 不可重用部分
    利用create database或者create controlfile语句中的下列关键字来间接影响

    • MAXDATAFILES
    • MAXINSTANCES
    • MAXLOGFILES
    • MAXLOGHISTORY
    • MAXLOGMEMBERS
  • 注意,控制文件如果太小,那么在做扩展时,可能需要重建数据库,所以应该留有余地。

查看

怎么查看控制文件的配置呢?

  • 查看控制文件中部分记录的相关信息
SQL> select type,record_size,records_total,records_used   2  from v$controlfile_record_section  3  where type IN('DATAFILE','TABLESPACE','REDO LOG');

这里写图片描述

  • 查看控制文件的位置和名字
SQL> select value  2  from v$parameter  3  where name = 'control_files';

这里写图片描述

SQL> col name for a20  #调整格式SQL> select * from v$controlfile;

这里写图片描述

移动和增加

怎样添加和移动控制文件呢?其实这两种意图的操作是大同小异的,基本步骤一样,稍后介绍。
那为什么要提那家和移动控制文件呢?这个是出于安全的考虑,oracle的文档建议我们,一个数据库要有多个控制文件,且应该放在不同的物理磁盘上,这样能防止磁盘的物理损坏。但是默认安装的情况下,控制文件会被放在同一个磁盘上。
由于启动时候初始化参数文件的不同,而初始化参数文件包含了控制文件的相关信息(详情可以看看 oracle实例管理),所以移动或增加控制文件,我们需要对初始化参数文件进行操作

  • 基于正文初始化参数文件(pfile)添加或移动控制文件

    • 利用数据字典v$controlfile来获取现有控制文件名字
    • 正常关闭数据库,shutdown或者shutdown immediate
    • 把新的控制文件名添加到初始化参数文件的CONTROL_FILES参数中
    • 将现有的控制文件复制到指定位置
    • 重新启动oracle数据库
    • 利用数据字典v$controlfile来验证是否添加正确
  • 基于二进制初始化参数文件(spfile)添加或移动控制文件

    • 利用数据字典v$controlfile来获取现有控制文件名字
    • 通过alter system set control_files命令来修改控制文件位置,例如:
      alter system set control_files = '/home/oracle/control01.ctl','/home/root/control02.ctl','/home/user3/control03.ctl' scope=spfile;

    *正常关闭数据库,shutdown或者shutdown immediate

备份控制文件

控制文件对于数据库极其重要,仅仅有添加或移动控制文件是不够的。这里我们还可以对控制文件进行备份。

  • 备份二进制文件
SQL> alter database backup controlfile to '/home/oracle/backup/control.bak';

注意,使用控制文件备份来对数据库进行恢复,是不完全的恢复。

  • 备份正文文件
SQL> alter database backup controlfile to trace;

这条命令将创建控制文件的命令添加到追踪文件,这个追踪文件中包含了重建控制文件的SQL语句,用户在得到这个追踪文件的时候应该复制一份并且重命名,这样才不会丢失。

  • 做一次操作~~(建议用虚拟机来做,且先拍快照)

    • 首先我们要开监听,开数据库,然后sys登录,接着执行alter database backup controlfile to trace;
    • 这里写图片描述
    • 接着,我们总要知道trace跟踪文件的位置,所以可以查查参数
    • show parameter BACKGROUND_DUMP_DEST
    • 这里写图片描述
    • 找到trace文件,一般命名是:实例名_ora_序号.trc结尾,我们用ls -lrt找到最新的几个,vim找到一个如下的
    • 这里写图片描述
    • 复制一份到安全的地方并且重命名成我们容易理解(“噢,这就是那个控制文件的备份”)
    • 这里写图片描述
    • 然后我们来模拟一下事故,比如说误删了控制文件
    • 先找到控制文件位置,记下来
    • 这里写图片描述
    • 关闭数据库
    • SQL> shutdown
    • 删除其中一个控制文件
    • 这里写图片描述
    • 再次启动数据库看看报错
    • 这里写图片描述
    • 这时我们去查看一下刚刚做的备份跟踪文件(都是英文,大家要找到下面图片那一段Below are two sets of …….)
    • 从文件中可以得到以下代码(加了注释,运行时自行删除)

      STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG    MAXLOGFILES 16    MAXLOGMEMBERS 3    MAXDATAFILES 100    MAXINSTANCES 8    MAXLOGHISTORY 292LOGFILE  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512DATAFILE  '/u01/app/oracle/oradata/orcl/system01.dbf',  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',  '/u01/app/oracle/oradata/orcl/users01.dbf',  '/u01/app/oracle/oradata/orcl/example01.dbf'CHARACTER SET AL32UTF8;
    • 根据文件中的信息来运行就好
    • 这里写图片描述
    • 去看看控制文件是否恢复
    • 这里写图片描述
    • 启动数据库看看
    • 这里写图片描述
    • 到这里,一切都恢复正常了

发现的问题

  • 在做恢复的模拟时,我去找追踪文件,发现太多trace了,我就删了所有的trace文件,而这个时候数据库还在运行状态,接着我以为再次alter database backup controlfile to trace;去查看trace目录时,竟然没有trace生成。接着我关闭数据库看看有没有——没有。重新开启数据库后,发现这时才有trace文件生成,但却不是备份想要的那个trace,这个时候再运行一次alter database backup controlfile to trace;才找到需要的哪个备份trace。
  • 这个故事告诉我们,如果想删除trace文件,请先关闭数据库(虽然说空间允许的情况下一般是不删除trace的)

最后给出思维导图

这里写图片描述

0 0
原创粉丝点击