Oracle 制御ファイルについての確認

## はじめに
以前のQiitaの記事で制御ファイルの概要について触れましたが、実態については十分に説明できていませんでした。制御ファイルはデータファイルと異なり、その内容が抽象的というか、イメージしにくいファイルです。

そのため、今回は制御ファイルの役割についてを、自分の理解や学習を目的に、より詳しく深堀って記載しました。

## 制御ファイルについて
**1.制御ファイルとは何か**

制御ファイルはOracleの公式ガイド[1]にも記載されている通り、制御ファイルには「データベース名」や「対応するデータファイルとREDOログファイルの名前と位置」といった基本情報が格納されています。

また、制御ファイルは、データベースの起動時に読み込まれるものです。具体的にどのような情報が読み込まれるのかについては、後述しています。

[1]Oracleの制御ファイルの管理についてのガイド

https://docs.oracle.com/cd/E57425_01/121/ADMIN/control.htm

**2.制御ファイルがどこにあるか？**
制御ファイルの場所を確認するには、以下のSQLコマンドを使用します。

```sql
select * from V$CONTROLFILE;
```
このコマンドを実行すると、現在使用している制御ファイルのパスが表示されます。
実行例として、SQL Developerの画面キャプチャも参考にしてもらえればと思います。
キャプチャ内では、黄色の線が引かれた箇所が制御ファイルの場所です。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/aad85fa1-a054-b075-edd5-b7f41627f437.png)


これらのビューの一覧や詳細は、以下のOracleのデータベースリファレンスに掲載されています。

https://docs.oracle.com/cd/F19136_01/refrn/preface.html

## 制御ファイルの格納内容について
制御ファイルは、バイナリ形式のファイルであり、通常のSQLクエリでその内容を直接確認することはできません。
つまり、制御ファイルの中身を直接「select」して、「ふむふむ、こういう情報が入っているのか!!」といった形で確認することはできません。
そのため、V$CONTROLFILE_RECORD_SECTIONビューを使用して間接的に確認しました。

V$CONTROLFILE_RECORD_SECTIONビューでは、以下のようなタイプの情報が格納されています（SQL Developerのキャプチャにも示されています）。

 - DATABASE
 - DATAFILE
 - REDO LOG
 - ARCHIVED LOG
 - BACKUP SET
 - PROXY

```sql
V$CONTROLFILE_RECORD_SECTION
```
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/8cd71ada-d5a5-f344-9c4e-9b802b13009d.png)


それぞれの内容については調べましたが、詳細が記載されていないことがありました。
そのため、わかりやすい解説を求めて、ChatGPT先生に質問しました（1番は1個1個調べるのが大変というだらしない理由ですが）。ChatGPT大先生はいつでも優しく教えてくれます。
以下は、ChatGPT超大先生の回答そのまま記載しています。（このレベル感で回答してくれるのすごいですよね）

|No.|タイプ |概要|
| ---- | ---- | ---- |
|1| DATABASE| データベース全体に関する基本情報。データベース名や識別子などが含まれます。
|2|CKPT PROGRESS| チェックポイントの進行状況に関する情報。データベースの整合性を維持するために必要です。
|3|REDO THREAD| Redoログスレッドに関する情報。インスタンスごとに管理され、障害発生時のデータリカバリに使用されます。
|4|	REDO LOG| Redoログファイルの構造に関する情報。データの変更履歴が保存されます。
|5|	DATAFILE| データファイルに関する情報。データベースの物理的なストレージ構造を表します。
|6|	FILENAME| データベースで使用されているファイルの名前やパスに関する情報。
|7|	TABLESPACE| テーブルスペースに関する情報。データベース内の論理ストレージ単位です。
|8|	TEMPORARY FILENAME| 一時ファイルに関する情報。一時的なデータ保存に使用されます。
|9|	RMAN CONFIGURATION| RMAN（Recovery Manager）の設定情報。バックアップやリカバリの構成が含まれます。
|10|	LOG HISTORY| Redoログファイルの歴史に関する情報。ログスイッチやアーカイブされたログに関する履歴が含まれます。
|11|	OFFLINE RANGE| オフラインデータファイルの範囲に関する情報。ファイルがオンライン/オフラインになるタイミングを追跡します。
|12|	ARCHIVED LOG| アーカイブされたRedoログファイルに関する情報。障害発生時のデータリカバリに使用されます。
|13|	BACKUP SET| RMANによるバックアップセットに関する情報。複数のバックアップピースから構成される。
|14|	BACKUP PIECE| バックアップピースに関する情報。バックアップセット内の個々のファイルです。
|15|	BACKUP DATAFILE| バックアップされたデータファイルに関する情報。
|16|	BACKUP REDOLOG| バックアップされたRedoログファイルに関する情報。
|17|	DATAFILE COPY| データファイルのコピーに関する情報。RMANなどで作成されたデータファイルのコピーを追跡します。
|18|	BACKUP CORRUPTION| バックアップ中に発生したデータ破損に関する情報。
|19|	COPY CORRUPTION| データファイルのコピー中に発生した破損に関する情報。
|20|	DELETED OBJECT| 削除されたオブジェクトに関する情報。削除されたテーブルやインデックスなどが含まれます。
|21|	PROXY COPY| プロキシバックアップに関する情報。RMANで使用される特定のバックアップ方式です。
|22|	BACKUP SPFILE| バックアップされたSPFILE（サーバーパラメータファイル）に関する情報。
|23|	DATABASE INCARNATION| データベースインカーネーション（生成）に関する情報。リカバリ操作後のデータベースの世代を管理します。
|24|	FLASHBACK LOG| フラッシュバックログに関する情報。フラッシュバック操作に使用されます。
|25|	RECOVERY DESTINATION| リカバリ先のディレクトリに関する情報。リカバリ操作で使用される場所を示します。
|26|	INSTANCE SPACE RESERVATION| インスタンスが使用するスペースの予約に関する情報。
|27|	REMOVABLE RECOVERY FILES| リムーバブルなリカバリファイルに関する情報。削除可能なリカバリファイルを示します。
|28|	RMAN STATUS| RMAN操作のステータス情報。バックアップやリカバリの進行状況を管理します。
|29|	THREAD INSTANCE NAME MAPPING| Redoログスレッドとインスタンス名のマッピングに関する情報。
|30|	MTTR| MTTR（Mean Time to Recover）の設定に関する情報。データベースのリカバリに必要な時間を最適化します。
|31|	DATAFILE HISTORY| データファイルの履歴情報。ファイルの作成や変更履歴が含まれます。
|32|	STANDBY DATABASE MATRIX| スタンバイデータベース（Data Guard）の設定に関する情報。プライマリデータベースとスタンバイデータベースの関係を管理します。
|33|	GUARANTEED RESTORE POINT| 保証されたリストアポイントに関する情報。指定した時点に確実にリストアできるようにするポイントを設定します。
|34|	RESTORE POINT| 通常のリストアポイントに関する情報。リカバリ操作で使用する復元ポイントです。
|35|	DATABASE BLOCK CORRUPTION| データベースブロックの破損に関する情報。
|36|	ACM OPERATION| Oracle ASM（Automatic Storage Management）での操作に関する情報。
|37|	FOREIGN ARCHIVED LOG| 外部アーカイブログに関する情報。Data Guardなどで使用されることがあります。
|38|	PDB RECORD| PDB（Pluggable Database）に関する情報。CDB（Container Database）内のPDBに関連するデータです。
|39|	AUXILIARY DATAFILE| COPY 補助的なデータファイルコピーに関する情報。データリカバリや複製のために使用されます。
|40|	MULTI INSTANCE REDO APPLY| 複数インスタンスでのRedoログ適用に関する情報。Data Guard環境で使用されます。
|41|	PDBINC RECORD| PDBインクルージョン（PDBのインスタンス化）に関する情報。
|42|	TABLESPACE KEY HISTORY| テーブルスペースのキー履歴に関する情報。暗号化されたデータベース環境でのテーブルスペースキーの管理に関連します。

V$CONTROLFILE_RECORD_SECTIONビューでは、以下の列もありますが、これらの列は、「制御ファイル内にこういったサイズで情報が記録され、特定のインデックス位置に格納されているのか」
という概要を理解まででよいかと思いました。何でこのサイズなんだろう？のレベルまでは良いかと思ったため。


 - RECORD_SIZE
 - RECORDS_TOTAL
 - RECORDS_USED
 - FIRST_INDEX
 - LAST_INDEX
 - LAST_RECID
 - CON_ID

詳細は、以下のOracleの公式ドキュメントを参照してください

https://docs.oracle.com/cd/F19136_01/refrn/V-CONTROLFILE_RECORD_SECTION.html#GUID-4554C1D1-452F-4C47-9562-9A0C45F91D7F


### まとめ
制御ファイルの中身そのものを直接確認することはできませんが、以下の点については確認できる。

 - どのような情報や構造が制御ファイルに格納されているか：
 V$CONTROLFILE_RECORD_SECTIONビューを使用することで、制御ファイルがどのようなセクションに分かれているか、また、それぞれのセクションにどのようなタイプの情報が含まれているかを確認できる。

 - どのようなサイズやインデックスを持って情報が記録されているか：
各セクションに割り当てられたレコードのサイズや、レコードがどの位置に格納されているかを知ることで、制御ファイルの内部構造とその使用状況を理解できる。

これらのメタデータを確認することで、制御ファイルの全体的な構造や情報の配置状況を把握することができます。