控制文件
控制文件
1. 功能和特点
- 记录当前数据库的物理状态
- 维护数据库的一致性
- 是一个二进制小文件
- 在mount阶段被读取
- 记录RMAN备份的元数据库
控制文件直接相关联的进程:CKPT,CKPT 进程向控制文件和数据文件头部更新检查点信息,来体现数据库的状态信息。
物理状态记录在控制文件中:
select name from v$datafile;
select member from v$logfile;
查看控制文件位置:
show parameter control;
select name from v$controlfile;
通常使用多个控制文件存放在不同位置(多路复用),互为镜像
cd /u01/app/oracle/oradata/ORCL
2. 实时更新机制
① 当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle服务器进程会立即更新控制文件以反映数据库结构的变化
② 日志写进程LGWR负责把当前日志序列号记录到控制文件中
③ 检查点进程CKPT负责把校验点的信息记录到控制文件中
④ 归档进程ARCN负责把归档日志的信息记录到控制文件中
通过视图v$controlfile_record_section可以了解到控制文件中记录了大量的数据库当前状态信息
3. 控制文件多元化(多路复用)
配置多个控制文件,最好是3个(最多8个),多路复用是相互镜像
3.1 控制文件多路复用的过程
① 启动实例:parameter file参数文件 ---> 记录控制文件的位置信息control_files=
② 挂载存储:打开控制文件mount ---> database open
3.2 增加一个控制文件(数据库默认是2个)
注:尽量把控制文件放在不同目录下
3.2.1 启动实例:修改control_files=3个控制文件
查看控制文件的位置信息
show parameter control
修改控制文件的位置信息(此处实验不再存放不同目录)
alter system set control_files='/u01/app/oracle/oradata/ORCL/control01.ctl','/u01/app/oracle/oradata/ORCL/control02.ctl','/u01/app/oracle/oradata/ORCL/control03.ctl' scope=spfile;
3.2.2 重启数据库到nomount状态
shutdown immediate
startup nomount
show parameter control
3.2.3 打开控制文件:在磁盘上生成一个新的控制文件
!cp /u01/app/oracle/oradata/ORCL/control01.ctl /u01/app/oracle/oradata/ORCL/control03.ctl
alter database mount;
alter database open;
4. 备份与重建控制文件
4.1 备份backup controlfile
数据库运行情况下不能在系统层级cp控制文件的,可以使用backup语句
alter database backup controlfile to '/u01/app/oracle/oradata/ORCL/control.ctl.bak';
4.2 备份到trace文件
可以在mount或者open模式下生成一个trace文件,包含重建控制文件的语句,默认文件内容保存在Default Trace File中
alter database backup controlfile to trace;
select * from v$diag_info;
也可以存放到自定义的文件夹里
alter database backup controlfile to trace as '/u01/app/oracle/oradata/ORCL/control.trc';
4.3 恢复控制文件方法
控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,重建控制文件必须使系统在NOMOUNT状态下
1)单个文件损坏了:参照多元化章节,通过简单复制解决
2)所有的控制文件丢失:
① 如果有binary控制文件备份,利用备份恢复控制文件
② 如果没有备份,利用trace脚本文件重新创建控制文件(代价:丢失归档记录信息和RMAN备份信息)
4.4 【实战案例】重建控制文件
4.4.1 Mount或open下生成trace脚本
alter database backup controlfile to trace as '/u01/app/oracle/oradata/ORCL/control.trc';
4.4.2 正常关库,模拟控制文件全部丢失
shutdown immediate
cd /u01/app/oracle/oradata/ORCLrm -f control0*
4.4.3 启动数据库报错,查看报警日志
startup
cd /u01/app/oracle/diag/rdbms/orcl/orcl/trace/
tail -100f alert_orcl.log
4.4.4 nomount状态下:恢复控制文件(手工重建控制文件)
vi /u01/app/oracle/oradata/ORCL/control.trc
找到下面的内容并执行重建控制文件:
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 200M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORCL/redo03.log' SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
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'
CHARACTER SET AL32UTF8
;
可以看到执行后三个控制文件又重新建立了。这时数据库已在mount下说明:这个重建控制文件的过程主要有两大部分内容:
第一部分是脚本中的可见信息:
- 定义 db_name,
- 指定几个参数限定控制文件的最大值,
- 在线日志的物理信息
- 数据文件的物理信息
- 使用的字符集
第二部分是隐含的不可见信息,比如SCN信息,重建复制了当前所有数据文件头部的最新SCN信息复制到了控制文件中。以便接下来打开数据库。
select file#,checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
4.4.5 将数据库切换到open状态
alter database open;
4.4.6 添加临时数据文件信息
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp01.dbf' SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;