一、控制文件存储内容总结
- 数据库信息:库名、创建时间等
- 实例信息
- 物理结构信息:redo信息、表空间信息、文件信息
- RMAN信息
- 归档信息
- 备份与恢复的信息(RMAN)
- object 删除信息
- 检查点信息
- 回滚段的信息
二、控制文件的存储形式
ORACLE采用每个块都生成一个镜像块,所以我们看到的控制文件其实真正有效的数据只占一半,目的是为了来避免块分裂
块分裂:也就是块状态的不一致性,它是因为数据库是以数据库块为单位读的,而操作系统是以操作系统块读的,这样就可能会在数据库读一致时,导致状态不一致。
可以通过以下语句进行验证
- SELECT SUM(RECORD_SIZE * RECORDS_TOTAL) / 1024 / 1024 USE_M
- FROM V$CONTROLFILE_RECORD_SECTION;
- SELECT BLOCK_SIZE * FILE_SIZE_BLKS / 1024 / 1024 FILE_SIZE_M
- FROM V$CONTROLFILE;
控制文件将内部数据记录分为两类:循环重用记录 和 非循环重用记录。
- 循环重用记录包含可以从控制文件中删除的信息。如: RMAN 备份记录、归档日志历史信息等,循环重用记录可以被删除,并且不会影响产品数据库。
- 非循环重用记录是那些不能被删除的记录。 非循环重用记录包括:数据文件列表、日志文件列表等。
三、写控制文件触发条件
- 每次在线日志文件、数据文件的新增、修改、删除,归档等都会更新控制文件
- 热备份的时候
- 触发系统事件时:删除object、日志切换等
- 增量检查点将每三秒会唤醒DBWR,并将当前数据库的一致性信息更新到控制文件,包括实例恢复的起点REDO地址(RBA TARGET),或称LOWER RBA。(增量检查点不更新数据文件头部)
四、清理控制文件中记录
我们可以通过重建控制文件或者设置control_file_record_keep_time=0来重用循环重用记录。
- 手工清理v$archived_log记录
Removing entries in v$archived_log referencing a particluar DEST_ID (文档 ID 845361.1)- 清理:
- EXECUTE dbms_backup_restore.resetCfileSection(11);
- 验证:
- SELECT RESETLOGS_ID, SEQUENCE# FROMV$ARCHIVED_LOG ORDER BY 1;
- 清理:
- 手工清理v$rman_status 记录
- 清理:
-
EXECUTE dbms_backup_restore.resetCfileSection(28);
-
- 验证:
-
SELECT COUNT(*) FROM V$RMAN_STATUS;
-
- 清理:
- 其它
清理其它内容,我们可以参考resetCfileSection函数中ID号的说明- 通过查看dbms_backup_restore包的创建代码查看
$ORACLE_HOME/rdbms/admin/dbmsbkrs.sql - 通过语句查看
-
SELECT ROWNUM - 1, TYPE FROM V$CONTROLFILE_RECORD_SECTION;
-
- 通过查看dbms_backup_restore包的创建代码查看