日本語PDF

10 制御ファイルの管理

制御ファイルを作成、バックアップおよび削除できます。

関連項目:

10.1 制御ファイルの概要

制御ファイルはデータベースの物理構造を記録した小さなバイナリ・ファイルであり、すべてのOracle Databaseに含まれています。

制御ファイルには、次の情報が格納されています。

  • データベース名

  • 対応するデータファイルとREDOログ・ファイルの名前と位置

  • データベース作成のタイムスタンプ

  • 現行のログ順序番号

  • チェックポイント情報

制御ファイルは、データベースがオープンしているときに必ずOracle Databaseサーバーが書き込めるように、使用可能にしておく必要があります。制御ファイルがないと、データベースがマウントできず、リカバリが困難になります。

Oracle Databaseの制御ファイルはデータベースとともに作成されます。デフォルトでは、データベースの作成時に、制御ファイルのコピーが少なくとも1つ作成されます。デフォルトで複数のコピーが作成されるオペレーティング・システムもあります。データベース作成時に、制御ファイルのコピーを2つ以上作成することをお薦めします。その後も、制御ファイルを失ったり、制御ファイル内の設定を変更する場合には、制御ファイルを作成できます。

10.2 制御ファイルのガイドライン

ガイドラインに従って、データベースの制御ファイルを管理できます。

10.2.1 制御ファイルのファイル名の指定

データベース初期化パラメータ・ファイルのCONTROL_FILES初期化パラメータを使用して、制御ファイル名を指定します。インスタンスは起動時にすべてのリストされたファイルを認識して開き、データベースの動作中はインスタンスがすべてのリストされた制御ファイルに書き込み、ファイルを維持します。

データベースの作成前にCONTROL_FILESに対してファイルを指定しない場合は、次のように処理されます。

  • Oracle Managed Filesを使用していない場合、データベースではデフォルトのファイル名で制御ファイルが作成されます。デフォルトのファイル名はオペレーティング・システムによって異なります。

  • Oracle Managed Filesを使用している場合は、この機能を使用可能にするために設定した初期化パラメータによって制御ファイルの名前と位置が決定されます。

  • Oracle Automatic Storage Management (Oracle ASM)を使用している場合は、不完全なOracle ASMファイル名をDB_CREATE_FILE_DESTおよびDB_RECOVERY_FILE_DEST初期化パラメータに設定できます。Oracle ASMによって、制御ファイルが適切な場所に自動的に作成されます。

10.2.2 異なるディスク上での制御ファイルの多重化

Oracle Databaseには少なくとも2つの制御ファイルを作成し、各ファイルを異なる物理ディスクに配置するようにします。

ディスク障害によって制御ファイルが破損した場合は、対応するインスタンスを必ず停止します。ディスク・ドライブを修復後、他のディスク上にある制御ファイルの正常なコピーを使用して破損した制御ファイルをリストアすると、インスタンスを再起動できます。この場合は、メディア・リカバリは不要です。

多重制御ファイルは、次のように動作します。

  • データベースは、データベース初期化パラメータ・ファイルの初期化パラメータCONTROL_FILESにリストされているすべてのファイル名に対して、情報を書き込みます。

  • データベースの稼働中に、CONTROL_FILESパラメータにリストされている最初のファイルのみデータベースによって読み込まれます。

  • データベースの稼働中に制御ファイルのいずれかが使用できなくなった場合、インスタンスは動作不能になり、終了します。

    ノート:

    データベースには最低2つ以上の制御ファイルを作成し、それらを異なる物理ディスク上に配置することをお薦めします。

制御ファイルを多重化する方法の1つは、REDOログが多重化されている場合、REDOログ・グループのメンバーが格納されているすべてのディスク・ドライブに制御ファイルのコピーを格納することです。このようにファイルを配置することによって、単一のディスク障害のために制御ファイルとREDOログ・グループがすべて失われる危険が少なくなります。

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

制御ファイルのバックアップは非常に重要です。初期設定時およびデータベースの物理構造を変更したときは、必ずバックアップを作成してください。

たとえば、次のような構造上の変更を行った場合は、バックアップを作成する必要があります。

  • データファイルの追加、削除または名前変更

  • 表領域の追加または削除、表領域の読取り/書込み状態の変更

  • REDOログ・ファイルまたはREDOログ・グループの追加と削除

制御ファイルのバックアップ方法については、「制御ファイルのバックアップ」を参照してください。

10.2.4 制御ファイルのサイズ管理

制御ファイルのサイズを決定する主な要因は、対応するデータベースを作成したCREATE DATABASE文のMAXDATAFILESMAXLOGFILESMAXLOGMEMBERSMAXLOGHISTORYおよびMAXINSTANCESパラメータに設定された値です。

これらのパラメータの値を大きくすると、対応するデータベースの制御ファイルのサイズも大きくなります。

関連項目:

  • 制御ファイルの最大サイズの詳細は、使用しているオペレーティング・システム固有のOracleマニュアルを参照してください。

  • CREATE DATABASE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

10.3 制御ファイルの作成

制御ファイルを作成、コピー、名前変更および再配置できます。

10.3.1 初期制御ファイルの作成

Oracle Databaseの初期制御ファイルは、CREATE DATABASE文を発行したときに作成されます。

制御ファイルの名前は、データベースの作成時に使用される初期化パラメータ・ファイルのCONTROL_FILESパラメータで指定します。CONTROL_FILESで指定するファイル名はパスを含めて完全に指定する必要があり、オペレーティング・システムによって異なります。CONTROL_FILES初期化パラメータの例を次に示します。

CONTROL_FILES = (/u01/oracle/prod/control01.ctl,
                 /u02/oracle/prod/control02.ctl, 
                 /u03/oracle/prod/control03.ctl)

指定した名前のファイルがデータベースの作成時に存在している場合、CREATE DATABASE文でCONTROLFILE REUSE句を指定しないとエラーが発生します。また、古い制御ファイルのサイズが新しい制御ファイルのSIZEパラメータと異なる場合、REUSE句は使用できません。

制御ファイルのサイズはOracle Databaseの一部のリリースでは異なり、制御ファイルで指定されるファイルの数が変更されるタイミングもリリースによって異なります。MAXLOGFILESMAXLOGMEMBERSMAXLOGHISTORYMAXDATAFILESおよびMAXINSTANCESなどの構成パラメータは制御ファイルのサイズに影響します。

CONTROL_FILES初期化パラメータの値を後で変更して、制御ファイルを追加したり、既存の制御ファイルの名前や位置を変更できます。

関連項目:

制御ファイルの指定方法の詳細は、使用しているオペレーティング・システム固有のOracleマニュアルを参照してください。

10.3.2 制御ファイルの追加コピーの作成、名前変更および再配置

多重化のために制御ファイルのコピーを追加作成するには、既存の制御ファイルを新しい位置にコピーし、そのファイル名を制御ファイルのリストに追加します。

同様に、制御ファイルの名前を変更するには、既存の制御ファイルを新しい名前や位置にコピーし、制御ファイル・リストのファイル名を変更します。どちらの場合も、作業中に制御ファイルが変更されないように、制御ファイルをコピーする前にデータベースを停止してください。

現行の制御ファイルの多重化コピーを追加、または制御ファイル名を変更するには:

  1. データベースを停止します。
  2. オペレーティング・システムのコマンドを使用して、既存の制御ファイルを新しい位置にコピーします。
  3. データベース初期化パラメータ・ファイルのCONTROL_FILESパラメータを編集して、新しい制御ファイル名を追加するか、または既存の制御ファイル名を変更します。
  4. データベースを再起動します。

10.3.3 新しい制御ファイルの作成

データベースのすべての制御ファイルが恒久的な損傷を受け、制御ファイルのバックアップがない場合、またはデータベース名を変更する場合は、新規制御ファイルを作成できます。

10.3.3.1 新しい制御ファイルを作成する場合

特定の状況では新規制御ファイルを作成する必要があります。

次の状況の場合に、新しい制御ファイルを作成する必要があります。

  • データベースの制御ファイルがすべて破損し、制御ファイルのバックアップがない場合。

  • データベース名を変更する場合。

    たとえば、分散環境でデータベース名が別のデータベース名と競合する場合は、データベース名を変更します。

    ノート:

    データベース名とDBID(内部データベース識別子)は、DBNEWIDユーティリティを使用して変更できます。このユーティリティの使用の詳細は、『Oracle Databaseユーティリティ』を参照してください。

10.3.3.2 CREATE CONTROLFILE文

CREATE CONTROLFILE文を使用して、データベースの新しい制御ファイルを作成できます。

次の文は、prodデータベース(これまで別のデータベース名を使用していたデータベース)に対する新しい制御ファイルを作成します。

CREATE CONTROLFILE
   SET DATABASE prod
   LOGFILE GROUP 1 ('/u01/oracle/prod/redo01_01.log', 
                    '/u01/oracle/prod/redo01_02.log'),
           GROUP 2 ('/u01/oracle/prod/redo02_01.log', 
                    '/u01/oracle/prod/redo02_02.log'),
           GROUP 3 ('/u01/oracle/prod/redo03_01.log', 
                    '/u01/oracle/prod/redo03_02.log') 
   RESETLOGS
   DATAFILE '/u01/oracle/prod/system01.dbf' SIZE 3M,
            '/u01/oracle/prod/rbs01.dbs' SIZE 5M,
            '/u01/oracle/prod/users01.dbs' SIZE 5M,
            '/u01/oracle/prod/temp01.dbs' SIZE 5M
   MAXLOGFILES 50
   MAXLOGMEMBERS 3
   MAXLOGHISTORY 400
   MAXDATAFILES 200
   MAXINSTANCES 6
   ARCHIVELOG;

ノート:

  • CREATE CONTROLFILE文は、指定したデータファイルとREDOログ・ファイルを破損する可能性があります。ファイル名を省略すると、そのファイルのデータが失われたり、データベース全体にアクセスできなくなる場合があります。この文を発行するときには十分に注意し、必ず「新しい制御ファイルの作成」の手順に従ってください。

  • 新しい制御ファイルを作成する前にデータベースのFORCE LOGGINGを使用可能にしていて、この設定を引き続き有効にする場合は、CREATE CONTROLFILE文でFORCE LOGGING句を指定する必要があります。「FORCE LOGGINGモードの指定」を参照してください。

関連項目:

CREATE CONTROLFILE文の詳細な構文は、『Oracle Database SQL言語リファレンス』を参照してください

10.3.3.3 新しい制御ファイルの作成

データベースの新しい制御ファイルを作成できます。

新しい制御ファイルを作成するには、次のステップを実行します。

  1. データベースのデータファイルとREDOログ・ファイルすべてのリストを作成します。

    「制御ファイルのバックアップ」に記載されている制御ファイルのバックアップの推奨事項に従っている場合は、現在のデータベース構造を反映するデータファイルとREDOログ・ファイルのリストがすでに作成されています。しかし、そのようなリストがない場合は、次の文を実行することでリストが生成されます。

    SELECT MEMBER FROM V$LOGFILE;
    SELECT NAME FROM V$DATAFILE; 
    SELECT VALUE FROM V$PARAMETER WHERE NAME = 'control_files';
    

    このようなリストが手元になく、制御ファイルが破損してデータベースをオープンできない場合は、データベースを構成するデータファイルとREDOログ・ファイルをすべて特定してください。新しい制御ファイルを作成すると、ステップ5で指定したファイル以外はリカバリできなくなります。さらに、SYSTEM表領域を構成するファイルが1つでも欠落していると、データベースをリカバリできないことがあります。

  2. データベースを停止します。

    データベースがオープンしている場合は、できるかぎり通常モードでデータベースを停止します。IMMEDIATE句またはABORT句は、他に方法がない場合にのみ使用してください。

  3. データベースのすべてのデータファイルとREDOログ・ファイルをバックアップします。
  4. 新しいインスタンスを起動します。ただし、データベースのマウントとオープンは行いません。
    STARTUP NOMOUNT
    
  5. CREATE CONTROLFILE文を使用して、データベースの新しい制御ファイルを作成します。

    制御ファイルに加えて、REDOログ・グループも失ってしまった場合は、新しい制御ファイルの作成時にRESETLOGS句を指定します。この場合は、失ったREDOログをリカバリする必要があります(ステップ8)。データベースの名前を変更した場合は、必ずRESETLOGS句を指定してください。それ以外の場合は、NORESETLOGS句を選択してください。

  6. 新しい制御ファイルのバックアップをオフラインの記憶デバイスに格納します。バックアップ作成の手順については、「制御ファイルのバックアップ」を参照してください。
  7. データベースのCONTROL_FILES初期化パラメータを編集し、ステップ5で作成してデータベースの一部となったすべての制御ファイルを指定します(バックアップ制御ファイルは含めません)。データベースの名前を変更する場合、インスタンスのパラメータ・ファイルのDB_NAMEパラメータを編集して新しい名前を指定します。
  8. 必要に応じて、データベースをリカバリします。データベースをリカバリしない場合は、ステップ9にスキップしてください。

    リカバリの一部として制御ファイルを作成している場合は、データベースをリカバリしてください。NORESETLOGS句を使用して新しい制御ファイルを作成した場合は、クローズ状態の完全なデータベース・リカバリ操作によってデータベースをリカバリできます。

    RESETLOGS句を使用して新しい制御ファイルを作成した場合は、USING BACKUP CONTROL FILEを指定する必要があります。オンラインREDOログ、アーカイブREDOログ・ファイルまたはデータファイルが失われた場合は、これらのファイルのリカバリ手順に従ってください。

    関連項目:

    データベースのリカバリ、および失われた制御ファイルのリカバリ方法については、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。

  9. 次のいずれかの方法で、データベースをオープンします。
    • リカバリを実行しなかった場合、またはステップ8でクローズ状態の完全なデータベース・リカバリを実行した場合は、通常のステップでデータベースをオープンします。

      ALTER DATABASE OPEN; 
      
    • 制御ファイルの作成時にRESETLOGSを指定した場合は、ALTER DATABASE文でRESETLOGSを指定します。

      ALTER DATABASE OPEN RESETLOGS;
      

これでデータベースはオープンされ、使用可能になります。

10.4 制御ファイル作成後のトラブルシューティング

CREATE CONTROLFILE文を実行した後で、エラーが発生する場合があります。

10.4.1 欠落したファイルや余分なファイルのチェック

新しい制御ファイルを作成し、それを使用してデータベースをオープンした後、アラート・ログをチェックして、データ・ディクショナリと制御ファイルの間で不整合(データ・ディクショナリにはデータファイルがあるが、制御ファイルには含まれていないなど)が検出されていないかを確認してください。

データ・ディクショナリ内にはデータファイルが存在していて、新しい制御ファイルには含まれていない場合、データベースは制御ファイル内にMISSINGnnnn (nnnnは10進数のファイル番号)という名前のプレースホルダ・エントリを作成します。制御ファイル内のMISSINGnnnnには、オフラインであること、およびメディア・リカバリを必要とすることを示すフラグが設定されます。

MISSINGnnnnに対応する実際のデータファイルが読取り専用または通常のオフラインである場合、MISSINGnnnnの名前を実際のデータファイルの名前に変更することによってデータファイルにアクセス可能になります。MISSINGnnnnに対応するデータファイルが読取り専用または通常のオフラインではない場合、データファイルはメディア・リカバリを必要としますが、RESETLOGSの結果これができないため、名前の変更操作によってデータファイルをアクセス可能にできません。この場合、データファイルを含む表領域を削除する必要があります。

反対に、制御ファイルに指定されているデータファイルがデータ・ディクショナリに存在しない場合、データベースは新しい制御ファイルからそのファイルへの参照を削除します。どちらの場合も、検出された状態を通知するメッセージがアラート・ログに書き込まれます。

10.4.2 CREATE CONTROLFILEでのエラー処理

新しい制御ファイルの作成後にデータベースをマウントおよびオープンしようとしたときにOracle Databaseによってエラーが送信された場合、最も可能性の高い原因は、CREATE CONTROLFILE文からファイルを省略したか、リストされていない必要のあるファイルが含まれていることです。

通常、エラーはORA-01173ORA-01176ORA-01177ORA-01215またはORA-01216です。この場合は、「新しい制御ファイルの作成」で作成したバックアップのファイルをリストアし、正しいファイル名を使用してそのタスクの手順を再実行してください。

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

制御ファイルをバックアップするには、ALTER DATABASE BACKUP CONTROLFILE文を使用します。

次の2つのオプションがあります。

  • 次の文を使用して、制御ファイルをバイナリ・ファイル(既存の制御ファイルの複製)にバックアップを作成します。

    ALTER DATABASE BACKUP CONTROLFILE TO '/oracle/backup/control.bkp';
    
  • 後で制御ファイルの再作成に使用できるSQL文を生成します。

    ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
    

    このコマンドによってSQLスクリプトがトレース・ファイルに書き込まれ、これを取得および編集して制御ファイルを再作成できます。トレース・ファイルの名前と場所は、アラート・ログで調べられます。

    関連項目:

10.6 現行のコピーを使用した制御ファイルのリカバリ

現行のバックアップまたは多重化コピーから制御ファイルをリカバリできます。

10.6.1 制御ファイルのコピーを使用した制御ファイル破損からのリカバリ

制御ファイルが破損した場合は、制御ファイルのコピーを使用してリカバリできます。

この方法では、CONTROL_FILESパラメータで指定されている制御ファイルの1つが破損し、制御ファイルのディレクトリにはまだアクセス可能で、制御ファイルの多重化コピーがある場合を想定しています。

  1. インスタンスを停止してから、オペレーティング・システム・コマンドを使用して、破損した制御ファイルに正常なコピーを上書きします。
    % cp /u03/oracle/prod/control03.ctl  /u02/oracle/prod/control02.ctl
    
  2. SQL*Plusを起動してデータベースをオープンします。
    SQL> STARTUP

10.6.2 制御ファイルのコピーを使用した永続的なメディア障害からのリカバリ

恒久的なメディア障害がある場合は、制御ファイルのコピーを使用してリカバリできます。

この方法では、永続的なメディア障害のために、CONTROL_FILESパラメータで指定されている制御ファイルの1つにアクセスできず、制御ファイルの多重化コピーがある場合を想定しています。

  1. インスタンスを停止してから、オペレーティング・システム・コマンドを使用して、制御ファイルの現行のコピーをアクセス可能な新しい位置にコピーします。
    % cp /u01/oracle/prod/control01.ctl  /u04/oracle/prod/control03.ctl
    
  2. 初期化パラメータ・ファイルのCONTROL_FILESパラメータを編集し、破損したファイルの位置を新しい位置に置き換えます。
    CONTROL_FILES = (/u01/oracle/prod/control01.ctl,
                     /u02/oracle/prod/control02.ctl, 
                     /u04/oracle/prod/control03.ctl)
    
  3. SQL*Plusを起動してデータベースをオープンします。
    SQL> STARTUP
    

多重制御ファイルがある場合は、CONTROL_FILES初期化パラメータを編集することで、データベースを迅速に起動できます。破損した制御ファイルをCONTROL_FILES設定から削除すると、即時にデータベースを再起動できます。次に、破損した制御ファイルを再作成し、CONTROL_FILES初期化パラメータにリカバリした制御ファイルを設定してから、データベースを停止し、再起動します。

10.7 制御ファイルの削除

制御ファイルは削除できますが、データベースには常に少なくとも2つの制御ファイルが存在する必要があります。

たとえば、制御ファイルの位置が不適切な場合は、データベースからその制御ファイルを削除できます。

  1. データベースを停止します。
  2. データベース初期化パラメータ・ファイルのCONTROL_FILESパラメータを編集して、古い制御ファイル名を削除します。
  3. データベースを再起動します。

    ノート:

    この操作では、不要な制御ファイルをディスクから物理的に削除することはできません。データベースから制御ファイルを削除した後、オペレーティング・システムのコマンドを使用して不要なファイルを削除してください。

10.8 制御ファイルのデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューのセットに対して制御ファイルに関する情報を問い合せることができます。

次のビューには、制御ファイルに関する情報が表示されます。

ビュー 説明

V$DATABASE

制御ファイル内のデータベース情報が表示されます。

V$CONTROLFILE

制御ファイル名が一覧表示されます。

V$CONTROLFILE_RECORD_SECTION

制御ファイルのレコード・セクションに関する情報が表示されます。

V$PARAMETER

CONTROL_FILES初期化パラメータで指定されている制御ファイルの名前が表示されます。

この例では、制御ファイル名が一覧表示されます。

SQL> SELECT NAME FROM V$CONTROLFILE;

NAME
-------------------------------------
/u01/oracle/prod/control01.ctl
/u02/oracle/prod/control02.ctl 
/u03/oracle/prod/control03.ctl