一、控制文件存儲內容總結
- 數據庫信息:庫名、創建時間等
- 實例信息
- 物理結構信息: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;