咨询微信: dbservice1234 7 x 24 在线支持!

    你在这里

    • You are here:
    • 首页 > 博客 > PDSERVICE的博客 > Oracle 制御ファイルのリカバリ方法--全ての制御ファイルの障害の場合 (for UNIX)

Oracle 制御ファイルのリカバリ方法--全ての制御ファイルの障害の場合 (for UNIX)

Oracle 制御ファイルのリカバリ方法--全ての制御ファイルの障害の場合 (for UNIX)

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

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

 
 
[概要]
 制御ファイルのリカバリ方法--全ての制御ファイルの障害の場合(for UNIX)

[内容]
 本KROWNでは、全ての制御ファイルが壊れてしまった場合のリカバリ方法に
 ついて説明します。多重化した制御ファイル内の一部が壊れた場合の
 リカバリ方法については、Document 1723972.1(KROWN#71169) を参照してください。
 制御ファイル以外のデータファイルやオンラインREDOログが壊れていないことが
 前提ですので、注意してください。

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

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

[エラー内容]

 制御ファイルが壊れた場合には、以下のようなエラーが発生する可能性があります。
 ----------
 ORA-00205: error in identifying controlfile, check alert log for more info

 ORA-00210: cannot open the specified controlfile
 ORA-00202: controlfile: '/home/oradata/ora920/control01.ctl'
 ORA-27041: unable to open file

 ORA-00202: controlfile: '/home/oradata/ora920/control01.ctl'
 ORA-27037: unable to obtain file status

 ORA-00202: controlfile: '/home/oradata/ora920/control01.ctl'
 ORA-27046: file size is not a multiple of logical block size
 ----------

#注意#
 上記はあくまでも例であり、破損状況によっては、その他のエラーが
 発生する可能性もあります。

[リカバリ方法]
 以下は、制御ファイルが全損した場合のリカバリ方法となります。

1. 制御ファイルのバックアップをどのように取得していたのか、そして
  アーカイブログモード又はノーアーカイブログモードであるかを
   確認してください。

   ・コールドバックアップを取得
   ・alter database backup controlfile to '/.../.../control.bak<ファイル名>' で取得
   ・アーカイブログモードでの運用
    ---> <手順A> を参照してください。

  ・alter database backup controlfile to trace で取得
  ・バックアップの取得なし
  ・ノーアーカイブログモードでの運用
    ---> <手順B> を参照してください。

  ・RMAN(Recovery Manager) を使用して取得 
  ---> Document 1703970.1(KROWN#15912) を参照してください。

---------------------------------------------------------------------------
<手順A>: 
 制御ファイルのコールドバックアップ 又は 
 alter database backup controlfile to '<ファイル名>'によるバックアップ 又は 
 アーカイブログモードでの運用の場合
---------------------------------------------------------------------------

1. インスタンスがまだ起動している場合、データベースを shutdown します。
  制御ファイルが破損している時には、shutdown abort での停止を
  行う必要があります。
   
   SQL> shutdown abort;
   ORACLE instance shut down.

2. バックアップしてあった制御ファイルをリストアします。
   <例>バックアップしてあった制御ファイル:control.bak 
       壊れてしまった制御ファイル:control01.ctl control02.ctl control03.ctl
  
       % cp /.../.../.../control.bak /home1/.../.../control01.ctl
       % cp /.../.../.../control.bak /home2/.../.../control02.ctl
       % cp /.../.../.../control.bak /home3/.../.../control03.ctl

3. 初期化パラメータファイル内の control_files 句がリストアした制御ファイルの
   正しい位置を示しているのかを確認します。

  <例> initora920.ora 内の control_files 句を確認します
   ---------------
    control_files = /home1/.../.../control01.ctl, 
                    /home1/.../.../control02.ctl, 
                    /home1/.../.../control03.ctl
   ---------------
                       
4. データベースを mount します。

   SQL> startup mount;

  ※制御ファイルのリストアを行った後の mount 時には、ORA-1991 が
   発生した場合には、Document 1703078.1(KROWN#13452) を参照し、パスワードファイルの
   再作成を実行してください。

5. using backup controlfile 句を使用してリカバリを実行します。

  SQL> recover database using backup controlfile until cancel;
  
  この時、順番に Enter を押して、ORA-308 が発生するまで
  アーカイブREDOログを適用してください。その後、アーカイブされていない
  オンラインREDOログを順番に手動で指定し、適用します。

<実行例>
 "Enter" を押してORA-308が出力されるまで、アーカイブREDOログの適用を行います。
  ----------
  ORA-00279: 変更99866(10/23/2003 17:43:09で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:/home/oradata/arch/1_19.dbf
  ORA-00280: 変更99866(スレッド1)は順序番号19に存在します。
  
  ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}  
    ----------
  
    ・・・

 その後、ある時点で以下のように ORA-308 のエラーが発生しますので、再度
 recover database using backup controlfile until cancel を実行し、
 オンラインREDOログのフルパスを指定し、"Enter" を実行します。

    -----------
  ORA-00308:
  アーカイブ・ログ/home/oradata/arch/1_25.dbfをオープンできません。
  ORA-27037: ファイル・ステータスを取得できません。
  SVR4 Error: 2: No such file or directory
  Additional information: 3
    -----------

 再度 recover database using backup controlfile until cancel を実行し、
 オンラインREDOログへのフルパスを指定し、"Enter" を押します。
 "メディア・リカバリが完了しました" と表示されるまで、オンラインREDOログを順番に
 指定し、適用していきます。

  SQL> recover database using backup controlfile until cancel;
  ORA-00279: 変更99912(10/23/2003 17:44:47で生成)にはスレッド1が必要です
  ORA-00289: 検討すべきログ・ファイル:/home/oradata/arch/1_25.dbf
  ORA-00280: 変更99912(スレッド1)は順序番号25に存在します。

  ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}
  /home/oradata/ora920/redo01.log  <--** オンラインREDOログへのパス
  ログが適用されました。
  メディア・リカバリが完了しました。<--** リカバリは完了したと表示されます。

 #注意#
  この時、NOARCHIVELOG モードで until cancel を指定してのリカバリは出来ません。
  ノーアーカイブログモードでの運用を行っている場合は、<手順B> の方法を
  参照してください。

6. データベースを resetlogs で OPEN します。

  SQL> alter database open resetlogs;
   データベースが変更されました。

7. resetlogs 指定でデータベースを OPEN したので、速やかにコールド・バックアップを
  取得します。resetlogs で OPEN する前のバックアップのデータファイルを使用して
   resetlogs をまたがるメディア・リカバリは実行できません。

8. ローカル管理一時表領域を使用している場合には、後述の
  [ローカル管理一時表領域が含まれる場合の注意]を参照し、一時ファイルを
  追加します。
   

以上で作業は完了です。
制御ファイルの多重化していなかった場合には、多重化をしましょう。

------------------------------------------------------------------------
<手順B>: 
 alter database backup controlfile to trace でのバックアップ 又は 
 制御ファイルのバックアップが全く存在しない 又は
 ノーアーカイブログモードでの運用の場合
------------------------------------------------------------------------

1. インスタンスがまだ起動している場合、データベースを shutdown します。
  制御ファイルが破損している時には、shutdown abort での停止を行う必要があります。
   
   SQL> shutdown abort;
   ORACLE instance shut down.

2. create controlfile 文を作成します。

 ・制御ファイルのバックアップをalter database backup controlfile to trace で
   取得していた場合 --> 2-1 を参照してください。

  ・制御ファイルのバックアップが全く存在していない場合 --> 2-2 を参照してください

 2-1. alter database backup controlfile to trace で取得していた場合:
    
     user_dump_dest 以下のトレースファイルを元にファイルを編集し、
   NORESETLOGS オプションを指定して create controlfile 文のみを
   create_cf.sql などとして保存し、制御ファイル作成スクリプトを生成します。

    <例> create_cf.sql として保存した場合
	CREATE CONTROLFILE REUSE DATABASE "ORA920" NORESETLOGS ARCHIVELOG
	    MAXLOGFILES 5             ^^^^^^^^^^^ ^^^^^^^^^^
	    MAXLOGMEMBERS 3                 ノーアーカイブログモード時は、NOARCHIVELOG に直します
	    MAXDATAFILES 100
	    MAXINSTANCES 1
	    MAXLOGHISTORY 226
	LOGFILE
	  GROUP 1 (
	    '/home/oradata/ora920/redo01_1.log',
	    '/home/oradata/ora920/redo01_2.log'
	  ) SIZE 100M,
	  GROUP 2 (
	    '/home/oradata/ora920/redo02_1.log',
	    '/home/oradata/ora920/redo02_2.log'
	  ) SIZE 100M,
	  GROUP 3 (
	    '/home/oradata/ora920/redo03_1.log',
	    '/home/oradata/ora920/redo03_2.log'
	  ) SIZE 100M
	DATAFILE
	  '/home/oradata/ora920/system01.dbf',
	  '/home/oradata/ora920/undotbs01.dbf',
	  '/home/oradata/ora920/indx01.dbf',
	  '/home/oradata/ora920/tools01.dbf',
	  '/home/oradata/ora920/users01.dbf'
	CHARACTER SET JA16EUC;

    ※これは、アーカイブログモード時、データベースのキャラクタセットが JA16EUC の場合の
     例です。

 2-2. 制御ファイルのバックアップが全く存在しない場合:

   2-1. の create controlfile 文を参考に、create control 文を手動で作成する必要があります。
     オンラインREDOログのサイズは、OSコマンドから確認し、指定する必要があります。
   存在しているデータファイルやオンラインREDOログの場所を OS 上で確認する必要が
   あります。

3. データベースを nomount します。
   
   SQL> startup nomount;
  ORACLEインスタンスが起動しました。

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

5. 前の shutdown が abort によるものだったので、リカバリを実行します。

  SQL> recover database;
  リカバリが完了しました。

6. データベースを OPEN します。

   SQL> alter database open;
   データベースが変更されました。

7. ローカル管理一時表領域を使用している場合には、後述の
  [ローカル管理一時表領域が含まれる場合の注意]を参照し、一時ファイルを
  追加します。

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


[ローカル管理一時表領域が含まれる場合の注意]
 制御ファイルをバックアップから戻してリカバリを行う場合、制御ファイルで管理されている
 一時ファイルの情報が古い可能性があるため、一時ファイルの情報が削除されます。
 このため、制御ファイルのリストア、又は再作成を行なった後には、
 一時ファイルを再度追加してください。(詳細は、Document 1721289.1(KROWN#62436) を参照してください。)

<実行例>
 SQL> alter tablespace <一時表領域名> add tempfile '<ファイル名>' 
     size <ファイルサイズ> reuse;