您的位置:首页 > 数据库 > Oracle

oracle控制文件

2015-12-02 13:49 225 查看

概念

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

所存信息

数据库名字

数据库标识符(创建数据库时自动产生)

数据库创建时间戳(创建数据库时产生)

联机重做日志文件的名字和准确位置

当前日志的序列号

校验点信息

日志的历史信息

归档日志文件的准确位置和状态

数据文件的名字和准确位置

表空间的信息

备份的准确位置和状态

使用和维护

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

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的)

最后给出思维导图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: