什么是控制文件
oracle控制文件是一个跟踪数据库的物理组成的二进制文件,仅与一个数据库相关联,每个数据库有唯一的控制文件,可以维护多个相同的拷贝。控制文件是oracle数据库用来查找数据库文件,并从总体上管理漱口状态的根文件。控制文件包含以下信息:
数据库名称和数据库唯一标识符(DBID)
创建数据库的时间戳
有关数据库文件、联机重做日志、归档日志的信息
表空间信息
RMAN备份信息
控制文件的作用
包含数据文件、重做日志文件等打开数据库所需要的信息。控制文件跟踪数据库的结构变化。例如,当管理员添加、重命名、删除数据文件或重做日志文件是,数据库将更新控制文件,记录相应的修改。
包含数据库打开时需要使用的元数据。例如,控制文件中包含包括检查点在内等用于恢复数据库所需的信息。在实例恢复过程中,检查点能指示出redo stream需要的起始SCN。每次提交更改之前检查点确保SCN已保存到磁盘上的数据文件中。至少每隔三秒,检查点进程会在控制文件中记录有关重做日志中的检查点的位置。
在数据库使用期间,oracle数据库不断读取和写入控制文件,并且只要数据库处于打开状态,控制文件就必须是可用的,以便可以写入。例如,恢复数据库涉及控制文件中读取数据库中包含的所有数据文件名称。其他的操作,如添加数据文件,会更新存储在控制文件中的信息。
控制文件的结构
与数据库相关的信息存储在控制文件中的不同部分中。每个部分是有关数据库的某个方面的一组记录。例如,控制文件中有一个部分追踪数据文件,并包含你一个记录集合,每个数据文件有一条记录。每个部分存储在多个逻辑控制文件块中。同一部分可以跨越多个块。
控制文件中包含以下类型的记录:
循环重用记录
这些记录包含可以被覆盖的非关键信息。当所有可用的记录槽用完时,数据库需要扩展控制文件或覆盖最旧的记录,以便为新记录腾出空间。循环重用记录可以删除,并且不会影响数据库运行,如:RMAN备份记录,归档日志历史信息等信息。
非循环重用记录
这些记录包含不经常更改且不能被覆盖的关键信息。包括表空间、数据文件、联机重做日志文件、重做线程。oracle数据库绝不会重用这些记录,除非从表空间中删除相应的对象。
如何查看控制文件
方法一,直接查看v$controlfile_record_section视图。
v$controlfile_record_section的数据来源于X$KCCRS内部表,其定义如下:
select inst_id,
decode(indx,0,'DATABASE',1,'CKPT PROGRESS',2,'REDO THREAD',
3,'REDO LOG',4,'DATAFILE',5,'FILENAME',6,'TABLESPACE',
7,'TEMPORARY FILENAME',8,'RMAN CONFIGURATION',9,'LOG HISTORY',
10,'OFFLINE RANGE',11,'ARCHIVED LOG',12,'BACKUP SET',
13,'BACKUP PIECE',14,'BACKUP DATAFILE',15,'BACKUP REDOLOG',
16,'DATAFILE COPY',17,'BACKUP CORRUPTION',18,'COPY CORRUPTION',
19,'DELETED OBJECT',20,'PROXY COPY',21,'BACKUP SPFILE',
23,'DATABASE INCARNATION',24,'FLASHBACK LOG',25,'RECOVERY DESTINATION',
26,'INSTANCE SPACE RESERVATION',27,'REMOVABLE RECOVERY FILES',
28,'RMAN STATUS',29,'THREAD INSTANCE NAME MAPPING',30,'MTTR',
31,'DATAFILE HISTORY',32,'STANDBY DATABASE MATRIX',
33,'GUARANTEED RESTORE POINT',34,'RESTORE POINT',
35,'DATABASE BLOCK CORRUPTION',36,'ACM OPERATION',
37,'FOREIGN ARCHIVED LOG','UNKNOWN') TYPE,
rsrsz,
rsnum,
rsnus,
rsiol,
rsilw,
rsrlw
from x$kccrs
where indx not in (22);
为什么使用上述定义,可以通过查看$ORACLE_HOME/rdbms/admin/dbmsbkrs.sql得知,该脚本是DBMS_BACKUP_RESTORE包的创建代码,如果数据库中不存在DBMS_BACKUP_RESTORE包,可以使用该脚本创建。其中有一段对类型定义常量的部分如下:
--********************************
-- Controlfile Sizing Procedures--
--******************************--
-- These procedures are used to resize a record section of the controlfile
-- and to calculate the size of a controlfile having specified counts of
-- records of each type.
--
-- Valid record types are defined as the following constants:
RTYP_DB_INFO constant binary_integer := 0;
RTYP_CKPTPROG constant binary_integer := 1;
RTYP_THREAD constant binary_integer := 2;
RTYP_LOGFILE constant binary_integer := 3;
RTYP_DATAFILE constant binary_integer := 4;
RTYP_FILENAME constant binary_integer := 5;
RTYP_TABLESPACE constant binary_integer := 6;
RTYP_RESERVED1 constant binary_integer := 7;
RTYP_TEMPFILE constant binary_integer := 7;
RTYP_RMAN_CONFIGURATION constant binary_integer := 8;
RTYP_LOG_HISTORY constant binary_integer := 9;
RTYP_OFFLINE_RANGE constant binary_integer := 10;
RTYP_ARCHIVED_LOG constant binary_integer := 11;
RTYP_BACKUP_SET constant binary_integer := 12;
RTYP_BACKUP_PIECE constant binary_integer := 13;
RTYP_BACKUP_DFILE constant binary_integer := 14;
RTYP_BACKUP_LOG constant binary_integer := 15;
RTYP_DFILE_COPY constant binary_integer := 16;
RTYP_BACKUP_DFILE_CORR constant binary_integer := 17;
RTYP_DFILE_COPY_CORR constant binary_integer := 18;
RTYP_DELETED_OBJECT constant binary_integer := 19;
RTYP_RESERVED3 constant binary_integer := 20;
RTYP_PROXY constant binary_integer := 20;
RTYP_RESERVED4 constant binary_integer := 21;
RTYP_BACKUP_SPFILE constant binary_integer := 21;
RTYP_DB2 constant binary_integer := 22;
RTYP_INCARNATION constant binary_integer := 23;
RTYP_FLASHBACK constant binary_integer := 24;
RTYP_RA_INFO constant binary_integer := 25;
RTYP_INST_RSVT constant binary_integer := 26;
RTYP_AGED_FILES constant binary_integer := 27;
RTYP_RMAN_STATUS constant binary_integer := 28;
RTYP_THREAD_INST constant binary_integer := 29;
RTYP_MTR constant binary_integer := 30;
RTYP_DFH constant binary_integer := 31;
RTYP_SDM constant binary_integer := 32;
RTYP_RSP constant binary_integer := 33;
RTYP_NRR constant binary_integer := 34;
RTYP_BLOCK_CORRUPTION constant binary_integer := 35;
RTYP_ACM_OPERATION constant binary_integer := 36;
RTYP_FOREIGN_ARCHIVED_LOG constant binary_integer := 37;
通过上面代码与v$controlfile_record_section视图的创建代码比较就能明白了。
方法二,通过trace文件查看控制文件的创建脚本
--生成trace文件
alter database backup controlfile to trace;
--查看trace文件位置
SELECT a.VALUE || b.symbol || c.instance_name || '_ora_' || d.spid || '.trc' trace_file
FROM (SELECT VALUE FROM v$parameter WHERE name = 'user_dump_dest') a,
(SELECT SUBSTR(VALUE, -6, 1) symbol FROM v$parameter WHERE name = 'user_dump_dest') b,
(SELECT instance_name FROM v$instance) c,
(SELECT spid FROM v$session s, v$process p, v$mystat m WHERE
s.paddr = p.addr AND s.sid = m.sid AND m.statistic# = 0) d;
其中创建控制文件的部分如下所示:
CREATE CONTROLFILE REUSE DATABASE "ORACL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/oracl/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/oracl/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/oracl/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/oracl/system01.dbf',
'/u01/app/oracle/oradata/oracl/sysaux01.dbf',
'/u01/app/oracle/oradata/oracl/undotbs01.dbf',
'/u01/app/oracle/oradata/oracl/users01.dbf'
CHARACTER SET ZHS16GBK;
标红的参数需要特别注意
MAXDATAFILES
这个参数是保存在控制文件里的,在DBCA创建实例的时候可以指定该值的大小。
官方解释:
The MAXDATAFILES option of CREATE DATABASE determines the number of data files a database can have. With Oracle Real Application Clusters, databases tend to have more data files and log files than an exclusive mounted database.
MAXINSTANCES
The MAXINSTANCES optionof CREATE DATABASE limits the number of instances that can access a databaseconcurrently. The default value for this option underz/OS is 15. Set MAXINSTANCES to a value greater than the maximum numberof instances you expect to run concurrently.
MAXLOGFILES和MAXLOGMEMBERS
The MAXLOGFILES option of CREATE DATABASE specifies the maximum number of redo log groups that can be created for the database. The MAXLOGMEMBERS option specifies the maximum number of members or number of copies per group. Set MAXLOGFILES to the maximum number of instances you plan to run concurrently multiplied by the maximum anticipated number of groups per thread.
MAXLOGHISTORY
The MAXLOGHISTORY option of CREATE DATABASE specifies the maximum number of redolog files that can be recorded in the log history of the control file.The log history is used for automatic media recovery of Oracle Real ApplicationClusters.
For Oracle Real Application Clusters, set MAXLOGHISTORY to a large value, such as 100. The control file can then store information about this number of redo log files. When the log history exceeds this limit, the Oracle server overwrites the oldest entries in the log history. The default for MAXLOGHISTORY is 0 (zero), which disables log history.
不重建控制文件清理控制文件中的记录
这里指清除循环重用记录。
方法一,通过重建控制文件或设置control_file_record_keep_time=0。
方法二,使用execute sys.dbms_backup_restore.resetCfileSection清理。
清理v$archived_log对应的记录,执行execute sys.dbms_backup_restore.resetCfileSection(11)
清理v$rman_status对应的记录,执行execute sys.dbms_backup_restore.resetCfileSection(28);
使用参数请参照上一部分介绍。
注:请勿随意在生产环境上执行!