トップ > DBA上級 バックアップリカバリ > 8章
8章 制御ファイルのリカバリ
本章では制御ファイルが破損した場合のリカバリについて確認していきます。

制御ファイルとは


本章では制御ファイルの障害時のリカバリについて学んでいきます。

制御ファイルはデータベースを構成するファイルでした。

制御ファイルはデータベースの物理構造情報を保持するファイルです。 制御ファイルは以下の情報を保持しています。

・データベース名
・データファイル、REDOログファイルの位置情報
・現在のログ順序番号
etc

また制御ファイルのパスは初期化パラメータのCONTROL_FILESで指定されています。


  SQL> show parameter control_files

  NAME                 TYPE        VALUE
  -------------------- ----------- ------------------------------
  control_files        string      /u01/app/oracle/12101/oradata/
                                   ORCL/control01.ctl, /u01/app/o
                                   racle/12101/oradata/ORCL/contr
                                   ol02.ctl, /u01/app/oracle/1210
                                   1/oradata/ORCL/control03.ctl


制御ファイルは多重化が可能です。今回は3つの制御ファイルで多重化しています。

DB起動時はCONTROL_FILESから制御ファイルを読み込み、MOUNT状態となると 制御ファイルからデータファイル、REDOログのパスを確認し、OPEN状態になります。

制御ファイルは1つでも破損するとデータベースは稼動できません。

ただしすべての制御ファイルが全損するとバックアップを使用してリカバリを実施するのに対し、1つのファイルだけの破損は既存ファイルのコピーで済む為復旧が簡単です。 全損の場合、データベースのりストア作業が必要となる為、リカバリに時間が掛かってしまいます。 その為、制御ファイルは多重化しておく必要があります。

制御ファイルリカバリ


それでは制御ファイルを削除し、復旧してみましょう。

制御ファイル一部破損時のリカバリ


制御ファイルの一部破損時のリカバリは簡単です。破損していない制御ファイルをコピーするだけです。
実際に制御ファイルの1つのファイルを削除して、障害を発生させてみます。

  $ sqlplus / as sysdba

  SQL> select name from v$controlfile;

  NAME
  --------------------------------------------------
  /u01/app/oracle/12101/oradata/ORCL/control01.ctl
  /u01/app/oracle/12101/oradata/ORCL/control02.ctl
  /u01/app/oracle/12101/oradata/ORCL/control03.ctl

  SQL> !rm /u01/app/oracle/12101/oradata/ORCL/control01.ctl


「v$controlfile」は動的パフォーマンスビューで制御ファイルのパスやステータスなどを確認できます。
rmコマンドで1つの制御ファイルを削除しました。DBを再起動してみましょう。


  SQL> startup force
  
  ORACLE instance started.

  Total System Global Area 1068937216 bytes
  Fixed Size                  2296576 bytes
  Variable Size             746587392 bytes
  Database Buffers          314572800 bytes
  Redo Buffers                5480448 bytes
  ORA-00205: error in identifying control file, check alert log for more info

  SQL> select status from v$instance;

  STATUS
  ------------
  STARTED
  

「startup force」はshutdown abortとstartupを両方実施します。 現在は「STARTED」の状態となる為、NOMOUNT状態であることがわかります。 DB起動時にエラーとなりましたが、具体的にどのファイルが破損しているかは、 上記メッセージだけだと分かりません。

アラートログファイルも確認してみましょう。


  SQL> !tail -15 /u01/app/oracle/12101/diag/rdbms/orcl/ORCL/trace/alert*.log
  
  starting up 1 shared server(s) ...
  ORACLE_BASE from environment = /u01/app/oracle/12101/oracle
  Mon Aug 15 10:09:12 2016
  ALTER DATABASE   MOUNT
  Mon Aug 15 10:09:12 2016
  ORA-00210: cannot open the specified control file
  ORA-00202: control file: '/u01/app/oracle/12101/oradata/ORCL/control01.ctl'
  ORA-27037: unable to obtain file status
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3
  ORA-205 signalled during: ALTER DATABASE   MOUNT...
  Mon Aug 15 10:09:13 2016
  Checker run found 1 new persistent data failures
  Mon Aug 15 10:09:15 2016
  Using default pga_aggregate_limit of 2048 MB
  


アラートログにはどのファイルが破損しているかが記載されています。 それではリカバリを実施していきます。

制御ファイルの一部破損時のリカバリ
@DBを停止(DBが起動中の場合)
A破損していない制御ファイルを破損したファイルにコピー
BDBを起動

それではリカバリを実施していきましょう。


  $ cd /u01/app/oracle/12101/oradata/ORCL/
  $ cp -p control02.ctl control01.ctl

  $ sqlplus / as sysdba
  
  SQL> startup
  
  ORACLE instance started.

  Total System Global Area 1068937216 bytes
  Fixed Size                  2296576 bytes
  Variable Size             746587392 bytes
  Database Buffers          314572800 bytes
  Redo Buffers                5480448 bytes
  Database mounted.
  Database opened.


これだけで復旧は完了です。制御ファイルを多重化しておくことで、 復旧作業が簡単であることが分かりますね。

制御ファイルが全損した場合、DBのリストア作業が必要です。 1部破損時の復旧作業と比較し、作業量も時間も格段と多くなります。

制御ファイルの全損時のリカバリ
@DBを停止(DBが起動中の場合)
Aデータベースのリストア
Bアーカイブログ&REDOログのロールフォワード
BDBを起動

制御ファイルの全損時はデータベースの全体をリストアし、リカバリを実施していきます。
では実際に試して行きましょう。


  $ rm control01.ctl control02.ctl control03.ctl

  $ sqlplus / as sysdba
  
  SQL> startup
  
  ORACLE instance started.

  Total System Global Area 1068937216 bytes
  Fixed Size                  2296576 bytes
  Variable Size             746587392 bytes
  Database Buffers          314572800 bytes
  Redo Buffers                5480448 bytes
  ORA-00205: error in identifying control file, check alert log for more info

  $ rman target /
  
  RMAN> restore controlfile from '/u01/app/oracle/backup/ORCL/XXXX.autobkup';
  
  Starting restore at 15-AUG-16
  allocated channel: ORA_DISK_1
  channel ORA_DISK_1: SID=6 device type=DISK

  channel ORA_DISK_1: restoring control file
  channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
  output file name=/u01/app/oracle/12101/oradata/ORCL/control01.ctl
  output file name=/u01/app/oracle/12101/oradata/ORCL/control02.ctl
  output file name=/u01/app/oracle/12101/oradata/ORCL/control03.ctl
  Finished restore at 15-AUG-16

  RMAN> alter database mount;

  Statement processed

  RMAN> restore database ;

  Starting restore at 15-AUG-16
  allocated channel: ORA_DISK_1
  channel ORA_DISK_1: SID=6 device type=DISK
  …途中省略…
  channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
  Finished restore at 15-AUG-16


ではリストアが完了したので、アーカイブログ、REDOログを適用してきます。


  RMAN> recover database;

  Starting recover at 15-AUG-16
  using channel ORA_DISK_1

  starting media recovery
  ・・・途中省略・・・
  archived log file name=/home/oracle/arch/1_14_919689022.dbf thread=1 sequence=14
  archived log file name=/home/oracle/arch/1_15_919689022.dbf thread=1 sequence=15
  archived log file name=/u01/app//oracle/12101/oradata/ORCL/redo01.log thread=1 sequence=16
  archived log file name=/u01/app/oracle/12101/oradata/ORCL/redo02.log thread=1 sequence=17
  archived log file name=/u01/app/oracle/12101/oradata/ORCL/redo03.log thread=1 sequence=18
  media recovery complete, elapsed time: 00:02:07
  Finished recover at 15-AUG-16


では最後にデータベースをOPENにします。 完全リカバリの場合、RESETLOGSオプションは不要ですが、 制御ファイルのリカバリはRESETLOGSオプションが必要になります。


  RMAN> alter database open resetlogs;

  Statement processed


上記が全損時のリカバリの手順となります。一部破損時と比べるとリストア作業が必要となる為、
DBの停止時間が大幅に延びます。停止時間が大きいと影響が大きくなってくる為、
制御ファイルを多重化し、全損を防ぐ構成を心がけましょう。

以上が、RMANバックアップを使用した制御ファイルのリカバリです。

制御ファイルの個別バックアップ



制御ファイルのリカバリはトレースファイルから取得したバックアップの復旧方法もあります。

制御ファイルのバックアップはRMANで取得することが可能ですが、個別にコマンドで取得することも可能です。

[構文] 制御ファイルの個別バックアップ
 RMAN> ALTER DATABASE BACKUP CONTROLFILE TO [ 'バックアップ名' | TRACE ];

上記コマンドは制御ファイルのバックアップをバイナリ形式かトレースファイルにSQLとしてバックアップするかを指定することが出来ます。

「TO 'バックアップ名'」の場合はバイナリ形式でバックアップを取得し、「TO TRACE」の場合は制御ファイルを再作成する為のSQL文をトレースファイルに作成します。

トレースファイルのSQLは、NOMOUNT状態でそのSQL文を実行するだけで、制御ファイルを復旧できますが、RMANリポジトリの情報が 消失します。その為、今までRMANで取得していたバックアップの情報が消えてしまう為、必要があればRMANバックアップの情報を追加する必要があります。


以上が制御ファイルのリカバリ手順となります。