Oracle データベースの制御ファイル(control file)とSPFILE(Server Parameter File)は、データベースの構成情報を保持する最も重要なファイルです。これらが失われると、データファイルやアーカイブログが無事でもデータベースを起動できません。
本記事では、RMAN を使った制御ファイルと SPFILE のバックアップ方法(AUTOBACKUP・手動バックアップ・バイナリコピー)と、完全に失われた場合のリストア手順(NOMOUNT → 復元 → RECOVER → OPEN)、そして多重化による予防策まで解説します。
・制御ファイルと SPFILE の役割と格納内容
・CONTROLFILE AUTOBACKUP(自動バックアップ)の設定
・BACKUP CURRENT CONTROLFILE による手動バックアップ
・ALTER DATABASE BACKUP CONTROLFILE TO(バイナリコピー)
・SPFILE のバックアップ方法
・制御ファイルが全て失われた場合のリストア手順
・SPFILE が失われた場合の復元手順
・制御ファイルの多重化による予防策
制御ファイルと SPFILE の役割
| ファイル | 格納内容 | 消失時の影響 |
|---|---|---|
| 制御ファイル (control file) |
・データベース名 / DBID ・データファイル / REDO ログファイルのパス ・RMAN バックアップ情報(nocatalog モード時) ・チェックポイント情報 / SCN |
DB を MOUNT できない(NOMOUNT までしか起動不可) |
| SPFILE (Server Parameter File) |
・全初期化パラメータ(SGA / PGA / processes 等) ・ALTER SYSTEM での動的変更が永続化 |
DB を起動できない(PFILE がなければ NOMOUNT も不可) |
-- 制御ファイルのパス SELECT name FROM v$controlfile; -- 例: /oracle/oradata/ORCL/control01.ctl -- /oracle/fra/ORCL/control02.ctl -- SPFILE のパス SHOW PARAMETER spfile; -- 例: /oracle/product/19c/dbs/spfileORCL.ora -- PFILE を使っているか SPFILE を使っているか確認 SELECT DECODE(value, NULL, 'PFILE', 'SPFILE') AS using_type FROM v$parameter WHERE name = 'spfile';
CONTROLFILE AUTOBACKUP(自動バックアップ)
RMAN の CONTROLFILE AUTOBACKUP を ON にすると、BACKUP コマンド実行時に制御ファイルと SPFILE が自動的にバックアップされます。これが最も重要な設定であり、全環境で ON にすべきです。
rman target /
# AUTOBACKUP を ON にする(推奨: 必須設定)
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
# AUTOBACKUP の保存先を指定(FRA 以外に保存する場合)
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT
FOR DEVICE TYPE DISK TO '/oracle/backup/cf_auto_%F';
# %F: 一意のファイル名を自動生成
# 現在の設定を確認
RMAN> SHOW CONTROLFILE AUTOBACKUP;
RMAN> SHOW CONTROLFILE AUTOBACKUP FORMAT;
AUTOBACKUP が ON なら、BACKUP DATABASE や BACKUP TABLESPACE を実行するたびに制御ファイルと SPFILE が自動的にバックアップされます。追加の手順は不要で、バックアップ忘れを防げます。新規構築した DB では最初にこの設定を行ってください。
手動バックアップ
RMAN で制御ファイルをバックアップ
rman target /
# 制御ファイルのバックアップ(バックアップセットとして)
RMAN> BACKUP CURRENT CONTROLFILE;
# 特定のパスにバックアップ
RMAN> BACKUP CURRENT CONTROLFILE
FORMAT '/oracle/backup/controlfile_%d_%T.bkp';
# データベースバックアップに含める(通常はこれで十分)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
# AUTOBACKUP ON なら制御ファイル + SPFILE も自動で含まれる
SQL*Plus でバイナリコピーを作成
-- 制御ファイルのバイナリコピーを作成(RMAN 不要)
ALTER DATABASE BACKUP CONTROLFILE TO '/oracle/backup/control_copy.ctl';
-- トレースファイルに制御ファイル再作成スクリプトを出力
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
-- → アラートログのトレースディレクトリに CREATE CONTROLFILE 文が出力される
-- 出力先を指定(12c 以降)
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
AS '/oracle/backup/create_controlfile.sql';
| 方法 | 出力形式 | 用途 |
|---|---|---|
| RMAN BACKUP CURRENT CONTROLFILE | RMAN バックアップセット | RMAN で復元する場合(標準) |
| ALTER DATABASE BACKUP CONTROLFILE TO path | バイナリコピー(.ctl) | ファイルコピーで復元できる(シンプル) |
| ALTER DATABASE BACKUP CONTROLFILE TO TRACE | CREATE CONTROLFILE SQL スクリプト | 最終手段: 制御ファイルを手動再作成する場合 |
SPFILE のバックアップ
rman target / # SPFILE のバックアップ RMAN> BACKUP SPFILE; # PFILE としてテキストコピーを作成(SQL*Plus) SQL> CREATE PFILE='/oracle/backup/initORCL.ora' FROM SPFILE; -- PFILE はテキスト形式なので編集可能 -- 万が一 SPFILE が消失した場合、PFILE から起動して SPFILE を再作成できる
SPFILE が失われた場合、PFILE がないと
STARTUP NOMOUNT すらできません。CREATE PFILE FROM SPFILE で定期的にテキストコピーを作成し、バックアップディスクとは別の場所に保管してください。制御ファイルの復元手順
全ての制御ファイルが失われた場合のリストア手順です。DB を NOMOUNT(制御ファイルなし)で起動してから復元します。
# (1) NOMOUNT で起動(制御ファイルなしで起動) rman target / RMAN> STARTUP NOMOUNT; # (2) AUTOBACKUP から制御ファイルを復元 RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP; # RMAN が FRA または AUTOBACKUP FORMAT のパスから自動的に最新を検出 # (3) MOUNT モードにする RMAN> ALTER DATABASE MOUNT; # (4) データベースをリカバリ RMAN> RECOVER DATABASE; # (5) RESETLOGS で OPEN RMAN> ALTER DATABASE OPEN RESETLOGS;
# AUTOBACKUP が見つからない場合、バックアップセットを直接指定 RMAN> STARTUP NOMOUNT; # DBID を指定(nocatalog モードで必要な場合がある) RMAN> SET DBID 1234567890; RMAN> RESTORE CONTROLFILE FROM '/oracle/backup/cf_auto_c-1234567890-20260329-01'; RMAN> ALTER DATABASE MOUNT; RMAN> RECOVER DATABASE; RMAN> ALTER DATABASE OPEN RESETLOGS;
# バイナリコピーがある場合はファイルコピーだけで復元可能 # (1) DB を停止 SQL> SHUTDOWN ABORT; # (2) バイナリコピーを全制御ファイルの場所にコピー # $ cp /oracle/backup/control_copy.ctl /oracle/oradata/ORCL/control01.ctl # $ cp /oracle/backup/control_copy.ctl /oracle/fra/ORCL/control02.ctl # (3) MOUNT モードで起動 SQL> STARTUP MOUNT; # (4) リカバリ + OPEN SQL> RECOVER DATABASE USING BACKUP CONTROLFILE; SQL> ALTER DATABASE OPEN RESETLOGS;
バックアップから復元した制御ファイルは「過去の時点」の情報を持っています。RECOVER で現在時点まで復旧した後、
ALTER DATABASE OPEN RESETLOGS でログシーケンスをリセットしてDB を開く必要があります。これは正常な動作であり、データが失われることはありません。SPFILE の復元手順
# (1) PFILE でとりあえず NOMOUNT 起動 # PFILE がない場合はダミーの最小 PFILE を作成 # echo "DB_NAME=ORCL" > /oracle/product/19c/dbs/initORCL.ora rman target / RMAN> STARTUP NOMOUNT; # (2) AUTOBACKUP から SPFILE を復元 RMAN> RESTORE SPFILE FROM AUTOBACKUP; # (3) 復元した SPFILE で再起動 RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP;
-- PFILE のテキストコピーが保管してある場合 SQL> STARTUP NOMOUNT PFILE='/oracle/backup/initORCL.ora'; -- PFILE から SPFILE を再作成 SQL> CREATE SPFILE FROM PFILE='/oracle/backup/initORCL.ora'; -- SPFILE で再起動 SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;
制御ファイルの多重化(予防策)
制御ファイルを複数の異なるディスクに配置(多重化)することで、1 つのディスクが故障しても他のコピーから起動できます。Oracle は全コピーを同期的に更新するため、どのコピーも同じ内容です。
-- (1) 現在の制御ファイルパスを確認
SQL> SHOW PARAMETER control_files;
-- control_files = /oracle/oradata/ORCL/control01.ctl
-- (2) SPFILE のパラメータを変更(3 つに多重化)
SQL> ALTER SYSTEM SET control_files=
'/oracle/oradata/ORCL/control01.ctl',
'/oracle/fra/ORCL/control02.ctl',
'/oracle/backup/ORCL/control03.ctl'
SCOPE=SPFILE;
-- (3) DB を停止
SQL> SHUTDOWN IMMEDIATE;
-- (4) OS で制御ファイルをコピー
-- $ cp /oracle/oradata/ORCL/control01.ctl /oracle/fra/ORCL/control02.ctl
-- $ cp /oracle/oradata/ORCL/control01.ctl /oracle/backup/ORCL/control03.ctl
-- (5) DB を起動
SQL> STARTUP;
・最低 2 つ以上(異なるディスクに配置)
・推奨は 3 つ(データ領域 + FRA + バックアップ領域)
・同じディスクに 3 つ置いても意味がない(ディスク障害で全滅)
・ASM 環境では ASM が自動的に冗長化するため、手動多重化は不要な場合もある
全ファイル消失時の完全リカバリ手順
制御ファイル + SPFILE の両方が失われた最悪のケースです。
# (1) ダミー PFILE で NOMOUNT 起動 # echo "DB_NAME=ORCL" > $ORACLE_HOME/dbs/initORCL.ora rman target / RMAN> STARTUP NOMOUNT; # (2) DBID を設定(nocatalog モードの場合) RMAN> SET DBID 1234567890; # DBID はアラートログや以前の RMAN LIST BACKUP で確認 # (3) AUTOBACKUP から SPFILE を復元 RMAN> RESTORE SPFILE FROM AUTOBACKUP; # (4) 復元した SPFILE で再起動(NOMOUNT) RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP NOMOUNT; # (5) 制御ファイルを復元 RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP; # (6) MOUNT モードにする RMAN> ALTER DATABASE MOUNT; # (7) データベースのリカバリ RMAN> RECOVER DATABASE; # (8) RESETLOGS で OPEN RMAN> ALTER DATABASE OPEN RESETLOGS;
nocatalog モードで AUTOBACKUP を検索する際、DBID が必要です。DBID はデータベースの一意識別子で、
SELECT DBID FROM V$DATABASE で確認できます。この値をバックアップディスクとは別の場所に記録しておいてください。記録がない場合、AUTOBACKUP のファイル名に含まれる DBID から推定することも可能です。バックアップの確認
rman target / # 制御ファイルの AUTOBACKUP 一覧 RMAN> LIST BACKUP OF CONTROLFILE; # SPFILE のバックアップ一覧 RMAN> LIST BACKUP OF SPFILE; # バックアップの有効性を検証 RMAN> RESTORE CONTROLFILE VALIDATE; RMAN> RESTORE SPFILE VALIDATE;
よくある質問
BACKUP CURRENT CONTROLFILE や BACKUP SPFILE を毎回実行する必要があります。忘れると復旧不可能になるリスクがあるため、AUTOBACKUP ON は必須です。(1) DB を停止
(2) 正常なファイルを壊れたファイルの場所にコピー
(3) DB を起動
RMAN によるリストアは不要です。これが多重化の最大のメリットです。
ALTER SYSTEM での変更が永続化されます。現在の Oracle 環境では SPFILE が標準です。PFILE は SPFILE 消失時のバックアップとして保管します。ls /oracle/backup/cf_auto_c-* でファイル名を確認し、c- の後の数値が DBID です。将来のために SELECT DBID FROM V$DATABASE の結果を記録しておいてください。まとめ
制御ファイルと SPFILE のバックアップ・復元の要点をまとめます。
| やりたいこと | コマンド |
|---|---|
| 自動バックアップを有効化(最重要) | CONFIGURE CONTROLFILE AUTOBACKUP ON |
| 制御ファイルの手動バックアップ | BACKUP CURRENT CONTROLFILE |
| バイナリコピーの作成 | ALTER DATABASE BACKUP CONTROLFILE TO ‘/path/copy.ctl’ |
| 再作成スクリプトの出力 | ALTER DATABASE BACKUP CONTROLFILE TO TRACE |
| SPFILE のバックアップ | BACKUP SPFILE |
| PFILE のテキストコピー作成 | CREATE PFILE=’/path/init.ora’ FROM SPFILE |
| 制御ファイルの復元 | STARTUP NOMOUNT; RESTORE CONTROLFILE FROM AUTOBACKUP |
| SPFILE の復元 | STARTUP NOMOUNT; RESTORE SPFILE FROM AUTOBACKUP |
| 制御ファイルの多重化 | ALTER SYSTEM SET control_files=’path1′,’path2′,’path3′ SCOPE=SPFILE |
増分バックアップは「RMAN 増分バックアップ完全ガイド」、バックアップの自動化は「RMAN バックアップを自動化する方法」、アーカイブログの管理は「アーカイブログを自動削除する方法」も併せて参照してください。

