概念
控制文件是一个比较小的二进制文件,记录了物理数据库的当前状态;每一个控制文件只属于一个数据库,数据库可以有多个控制文件(处于安全考虑,一般多几个就相当于多了几个备份),但是一个控制文件不能对应多个数据库;数据库处于打开状态,服务器会随时修改控制文件的内容;任何用户都不能修改控制文件的数据。
所存信息
- 数据库名字
- 数据库标识符(创建数据库时自动产生)
- 数据库创建时间戳(创建数据库时产生)
- 联机重做日志文件的名字和准确位置
- 当前日志的序列号
- 校验点信息
- 日志的历史信息
- 归档日志文件的准确位置和状态
- 数据文件的名字和准确位置
- 表空间的信息
- 备份的准确位置和状态
使用和维护
获取控制文件信息的数据字典(动态视图)
- 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 NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE 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 512 DATAFILE '/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的)