Email: service@parnassusdata.com 7 x 24 online support!

    You are here

Oracle 制御ファイルのリカバリ・制御ファイル全損の場合

Oracle 制御ファイルのリカバリ・制御ファイル全損の場合

 

ORACLEデータベース によくあるエラ の解決策

プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com

 

 

 

[概要]
 本文書では、Windowsプラットフォーム上のOracleデータベースについて、
 すべての制御ファイルが壊れてしまった場合の復旧方法を紹介します。

 ・ 制御ファイルをミラーリングしていて、そのうち一部が壊れた場合   --> Krown:71181 へ
 ・ すべての制御ファイルが壊れてしまった場合            --> Krown:71490  へ
  
  ※ミラーリングされているかどうかは、初期化パラメータファイル の中で
      ----
      control_files='D:\o920\oradata\ora9204\control01.ctl','D:\o920\oradata\ora9204\control02.ctl'
      ----
    のように複数ファイルが指定されていればミラーリングされています。


[対象リリース]
 Oracle9i Database Release2 (9.2)
 Oracle9i Database Release1 (9.0.1)
 Oracle8i Enterprise Edition/Oracle8i Standard Edition 8.1
 Oracle8 Enterprise Edition/Oracle8 Standard Edition 8.0
 Oracle7 Server/Oracle7 Workgroup Server 7.3


[対象プラットフォーム]
 Windows


[復旧方針]
 制御ファイルが壊れてしまった場合、下記のようなエラーが出ることが考えられます。
 ----
 ORA-00202: controlfile: 'D:\o920\oradata\ora9204\control01.ctl'
 ORA-27041: unable to open file
 OSD-04002: ファイルをオープンできません
 O/S-Error: (OS 2) 指定されたファイルが見つかりません。
 ----

 下記に当てはまる場合は [復旧A] へ
 ・コールドバックアップ または alter database backup controlfile to 'ファイル名' 
  で制御ファイルをバックアップしている
 ・アーカイブログモードである
 
 下記に当てはまる場合は [復旧B] へ
 ・alter database backup controlfile to trace; で制御ファイルのバックアップ
  を取得している
 ・全くバックアップが存在しない
 ・ノーアーカイブログモードである


[復旧A]
 コールドバックアップ または alter database backup controlfile to 'ファイル名' 
 で制御ファイルをバックアップして、かつ、アーカイブログモードである場合の復旧
 方法です。

 手順例として以下の環境であると仮定します:
   %ORACLE_HOME%                   D:\o920 
   %ORACLE_SID%                    ora9204
  バックアップを格納する場所      D:\BACKUP
  バックアップをリストアする場所  D:\o920\oradata

 バックアップをリストアする場所が不明の場合は、データベースをマウントして
 v$datafile の NAME 列から確認してください。
    ----
  SQL> select name from v$datafile;
  NAME 
  ---------------------------------------------
  D:\O920\ORADATA\ORA9204\SYSTEM01.DBF
  D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF
  D:\O920\ORADATA\ORA9204\DRSYS01.DBF
  D:\O920\ORADATA\ORA9204\INDX01.DBF
  D:\O920\ORADATA\ORA9204\TOOLS01.DBF
  D:\O920\ORADATA\ORA9204\USERS01.DBF
  D:\O920\ORADATA\ORA9204\XDB01.DBF
    ----

A-1)インスタンスがまだ起動している場合は、シャットダウンします。
     (制御ファイルが壊れているとき shutdown normal は実行できません)
    ----
    SQL> shutdown abort
    ORACLEインスタンスがシャットダウンされました。
    ----

A-2)バックアップしてあった制御ファイルを D:\o920\oradata へリストアします。
    ----
  C:\>copy D:\BACKUP\CONTROL1.bak D:\o920\oradata\ora9204\CONTROL01.CTL
  D:\o920\oradata\ora9204\CONTROL01.CTL を上書きしますか? (Yes/No/All): y <--y を入力
        1 個のファイルをコピーしました。
    ----

A-3)初期化パラメータファイルの制御ファイルを指定している部分を確認します。
  今回の場合、ora9204\CONTROL01.CTL しかリストアしていないので該当の
  部分は以下のようになります。
  ----
  control_files='D:\o920\oradata\ora9204\ora9204\CONTROL01.CTL'
  ----

A-4)データベースをマウントします
    ----
    SQL> startup mount
    ----

    ※もし、上記 3 の手順で、正しい制御ファイルの位置を指定できていない
   場合、下記のように ORA-205 が出力されます。
  ----
  SQL> startup
  ORACLE instance started.
  Total System Global Area  135339844 bytes
  Fixed Size                   454468 bytes
  Variable Size             109051904 bytes
  Database Buffers           25165824 bytes
  Redo Buffers                 667648 bytes
  ORA-00205: error in identifying controlfile, check alert log for more info
  ----

A-5)recover database using backup controlfile until cancel; を実行して
  不完全リカバリします。

  recover database using backup controlfile until cancel; 実行後、
  順に Enter を押してアーカイブログファイルを適用して下さい。
    ----
  SQL> recover database using backup controlfile until cancel;
  ORA-00279: 変更943184(11/24/2003 19:19:50で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:D:\O920\ORADATA\ORA9204\ARCHIVE1_19.DBF
  ORA-00280: 変更943184(スレッド1)は順序番号19に存在します。
  ORA-00278: ログ・ファイル'D:\O920\ORADATA\ORA9204\ARCHIVE1_18.DBF'はこのリカバリでは必要なくなりました

  ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}          <--Enter を押してアーカイブログを適用する

  ORA-00279: 変更943186(11/24/2003 19:19:51で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:D:\O920\ORADATA\ORA9204\ARCHIVE1_20.DBF
  ORA-00280: 変更943186(スレッド1)は順序番号20に存在します。
  ORA-00278:ログ・ファイル'D:\O920\ORADATA\ORA9204\ARCHIVE1_19.DBF'はこのリカバリでは必要なくなりました
 
    ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}          <--Enter を押してアーカイブログを適用する

  ORA-00279: 変更943190(11/24/2003 19:19:57で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:D:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBF
  ORA-00280: 変更943190(スレッド1)は順序番号21に存在します。
  ORA-00278: ログ・ファイル'D:\O920\ORADATA\ORA9204\ARCHIVE1_20.DBF'はこのリカバリでは必要なくなりました
  
  ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}          <--Enter を押してアーカイブログを適用する

  ※
  ORA-00308:アーカイブ・ログD:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBFをオープンできません。
  ORA-27041: ファイルをオープンできません。
  OSD-04002: ファイルをオープンできません
  O/S-Error: (OS 2) 指定されたファイルが見つかりません。

  ORA-01547: 警告: RECOVERは成功しましたがOPEN
  RESETLOGSが次のエラーを受け取りました。
  ORA-01152: ファイル1は十分に古いバックアップからリストアされていません。
  ORA-01110: データ・ファイル1: 'D:\O920\ORADATA\ORA9204\SYSTEM01.DBF'
    ----

  ※ORA-308 が出力されて、まだ作成されていないアーカイブREDOログが要求されます。
  その場合、再度、recover database using backup controlfile until cancel; を実行して
  オンラインREDOログの絶対パスを明示的に指定します。
    詳細は、Krown:34587 を参照してください。

  対応するオンラインREDOログは alert.log から確認することが可能です。
    上記のメッセージより、順序番号 21 を要求しています。alert.logより、
    sequence 21 に関する記述を探します。
    ----
    Mon Nov 24 19:19:57 2003
      Current log# 3 seq# 21 mem# 0: D:\O920\ORADATA\ORA9204\REDO03.LOG
    ----
  記述されているファイルのパスが対応するオンラインREDOログの絶対パスになります。

    再度、recover database using backup controlfile until cancel; を実行して
  オンラインREDOログの絶対パスを明示的に指定します。
    ----
  SQL> recover database using backup controlfile until cancel;
  ORA-00279: 変更943190(11/24/2003 19:19:57で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:D:\O920\ORADATA\ORA9204\ARCHIVE1_21.DBF
  ORA-00280: 変更943190(スレッド1)は順序番号21に存在します。

  ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}          
  D:\O920\ORADATA\ORA9204\REDO03.LOG                     <--オンラインREDOログの絶対パスを指定
  ログが適用されました。
  メディア・リカバリが完了しました。
    ----

A-6)resetlogs でデータベースをオープンします
    ----
  SQL> alter database open resetlogs;
  データベースが変更されました。
    ----

A-7)制御ファイルのバックアップを使用してリカバリを行った場合、ローカル管理
  一時表領域の一時ファイルの情報が制御ファイルからすべて削除されます。
  よって、ローカル管理一時表領域の一時ファイルを再度追加する必要があります。
  
    この状態で一時表領域を使用するソート処理を行うと、ORA-25153エラー
    が発生します。
    ----
    SQL> select count(*) from TEST;
    select count(*) from TEST
     *
    行1でエラーが発生しました。:
    ORA-25153: 一時表領域が空です。
    ----

    alter tablespace <一時表領域名> add tempfile '<ファイル名>' size <ファイルサイズ> reuse;
    を実行します。
    ----
  SQL> alter tablespace temp add tempfile 'D:\o920\oradata\ora9204\TEMP.DBF'
   2  size 300M reuse;
  表領域が変更されました。
    ----
   詳細は、Krown:66029 を参照してください。

A-8)即時にデータベースを通常に停止し、データベース全体のバックアップを
  作成します。そうしないと、ログをリセットした後で行った変更のリカバリが
  できなくなります。
  バックアップの詳細は、Krown:70947 を参照してください。

  以上で作業は終了です。
  制御ファイルのミラーリングしていなかった場合には、ミラーリングをしましょう。


[復旧B]
 alter database backup controlfile to trace; で制御ファイルのバックアップ
 を取得している、あるいは、全くバックアップが存在しない、あるいは、
 ノーアーカイブログモードで制御ファイルが全部壊れてしまった場合の復旧
 方法です。

 手順例として以下の環境であると仮定します:
   %ORACLE_HOME%                   D:\o920 
   %ORACLE_SID%                    ora9204
  バックアップを格納する場所      D:\BACKUP
  バックアップをリストアする場所  D:\o920\oradata

 バックアップをリストアする場所が不明の場合は、データベースをマウントして
 v$datafile の NAME 列から確認してください。
    ----
  SQL> select name from v$datafile;
  NAME 
  ---------------------------------------------
  D:\O920\ORADATA\ORA9204\SYSTEM01.DBF
  D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF
  D:\O920\ORADATA\ORA9204\DRSYS01.DBF
  D:\O920\ORADATA\ORA9204\INDX01.DBF
  D:\O920\ORADATA\ORA9204\TOOLS01.DBF
  D:\O920\ORADATA\ORA9204\USERS01.DBF
  D:\O920\ORADATA\ORA9204\XDB01.DBF
    ----

B-1)インスタンスがまだ起動されている場合は、シャットダウンします。
     (制御ファイルが壊れているとき shutdown normal は実行できません)
    ----
    SQL> shutdown abort
    ORACLEインスタンスがシャットダウンされました。
    ----

B-2)alter database backup controlfile to trace; で取得した制御ファイルの
  バックアップをスクリプトに保存します。

 例:create_cf.sql
 CREATE CONTROLFILE REUSE DATABASE "ORA9204" NORESETLOGS  ARCHIVELOG
     MAXLOGFILES 5
     MAXLOGMEMBERS 3
     MAXDATAFILES 100
     MAXINSTANCES 1
     MAXLOGHISTORY 226
 LOGFILE
   GROUP 1 (
     'D:\O920\ORADATA\ORA9204\REDO01_B.LOG',
     'D:\O920\ORADATA\ORA9204\REDO01_A.LOG'
   ) SIZE 100M,
   GROUP 2 (
     'D:\O920\ORADATA\ORA9204\REDO02_A.LOG',
     'D:\O920\ORADATA\ORA9204\REDO02_B.LOG'
   ) SIZE 100M,
   GROUP 3 (
     'D:\O920\ORADATA\ORA9204\REDO03_A.LOG',
     'D:\O920\ORADATA\ORA9204\REDO03_B.LOG'
   ) SIZE 100M
 DATAFILE
   'D:\O920\ORADATA\ORA9204\SYSTEM01.DBF',
   'D:\O920\ORADATA\ORA9204\UNDOTBS01.DBF',
   'D:\O920\ORADATA\ORA9204\CWMLITE01.DBF',
   'D:\O920\ORADATA\ORA9204\DRSYS01.DBF',
   'D:\O920\ORADATA\ORA9204\EXAMPLE01.DBF',
   'D:\O920\ORADATA\ORA9204\INDX01.DBF',
   'D:\O920\ORADATA\ORA9204\ODM01.DBF',
   'D:\O920\ORADATA\ORA9204\TOOLS01.DBF',
   'D:\O920\ORADATA\ORA9204\USERS01.DBF',
   'D:\O920\ORADATA\ORA9204\XDB01.DBF';
 ;

[注意]
 1. もし、制御ファイルをミラーリングしておらず、バックアップも使用
    できない場合は、上記の例を参考にして、OSコマンドやエクスプローラー等
    で実際に存在しているファイルを確認して手動でスクリプトを作成してください。

 2. 上記の例は、アーカイブログノードでの例となります。ノーアーカイブログ
    モードの場合には、NORESETLOGS  ARCHIVELOG を NORESETLOGS NOARCHIVELOG
    に編集する必要があります。

 3. trace オプションつきで取得した制御ファイルのバックアップには、複数の
    CREATE CONTROLFILE 文が存在しています。
    ----
  CREATE CONTROLFILE REUSE DATABASE "ORA9204" NORESETLOGS  ARCHIVELOG
    ----                       ^^^^^^^^^^^
  NORESETLOGS はオンラインREDOログファイルが使用可能の場合に指定します。

    ----
    CREATE CONTROLFILE REUSE DATABASE "ORA9204" RESETLOGS  ARCHIVELOG
    ----                       ^^^^^^^^^
  RESETLOGS はオンラインREDOログファイルが使用不可の場合にします。
  RESETLOGSオプション付きで制御ファイルを作成した場合には、USING BACKUP CONTROLFILE
  オプションをつけて、データベースのリカバリを行う必要があります。
  手順は、Krown:39499 を参照してください。

B-3)データベースを nomount します。
  ----
  SQL> startup nomount
  ORACLEインスタンスが起動しました。
  Total System Global Area  135339844 bytes
  Fixed Size                   454468 bytes
  Variable Size             109051904 bytes
  Database Buffers           25165824 bytes
  Redo Buffers                 667648 bytes
  ----

B-4)作成した制御ファイルを作成するスクリプトを実行します。
  ----
  SQL> @create_cf.sql
  制御ファイルが作成されました。
  ----

B-5)前の shutdown が abort オプションによるものであったため recover 
    コマンドを実行します。
  ----
    SQL> recover database;
  ----

    もしリカバリの必要がなければ、下記のようになります。
  その場合には そのまま B-7 に進んでください。

  ----
    SQL>recover database;
    ORA-00283 エラーによってリカバリ・セッションは取り消されました。
    ORA-00264 リカバリは必要ありません。
  ----

B-6)データベースをオープンします
  ----
  SQL> alter database open;
  データベースが変更されました。
  ----

B-7)CREATE CONTROLFILE文には一時ファイルを指定することができません。
    よってCREATE CONTROLFILE文で制御ファイルを再作成した場合には、
  一時ファイルを再度追加する必要があります。
   詳細は、Krown:66029 を参照してください。
  
  trace オプションつきで取得した制御ファイルのバックアップには下記の
  ように、一時ファイルを再度追加するためのコマンドが記載されています。
  このコマンドを参考に一時ファイルの追加を行います。

  ----
  # Commands to add tempfiles to temporary tablespaces.
  # Online tempfiles have complete space information.
  # Other tempfiles may require adjustment.
  ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\O920\ORADATA\ORA9204\TEMP.DBF' SIZE 314572800 REUSE AUTOEXTEND OFF;
  ----
  制御ファイルのバックアップに記載されている上記のコマンドを参考にします。

  ----
  SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\O920\ORADATA\ORA9204\TEMP.DBF' SIZE 314572800 REUSE AUTOEXTEND OFF;
    表領域が変更されました。
  ----

  以上で作業は終了です。
  作業終了後、次回の障害に備えてバックアップを取得しましょう。
  また、制御ファイルのミラー化していなかった場合には、ミラー化をしましょう。