Oracleエラー対応(ORA-00312):ORA-00312 発生時の対処方法について

現役DBAが解説-Oracleエラー対応

本記事ではREDOログファイル関連の操作で発生するORA-00312について、エラー発生時の対処方法をご紹介します。

1.エラーメッセージ

ORA-00312は単独で発生するエラーではなく、別のメッセージに付随して発生します。
エラーメッセージには先行のメッセージに関与しているREDOログファイル名が出力されるため、同時に発生しているREDOログファイルやアーカイブログファイルに関する他のエラーメッセージと合わせて、原因や対処方法を考える必要があります。

ORA-00312: オンライン・ログstring スレッドstring: 'string'
ORA-00312: オンライン・ログ<番号> スレッド<番号>: '//.log' 

2.事象・原因・対策

ORA-00312と同時に発生するエラーは複数あるため、本記事ではその中からいくつかご紹介します。
本番運用している環境で発生した場合は、データベース稼働に大きな影響を与える可能性があるため、注意が必要です。

①アーカイブログファイルの出力先間違いや領域不足により発生

データベースの起動時や、ログスイッチによるアーカイブログファイル出力時などに発生するORA-16014、ORA-16038/ORA-19809に付随して、ORA-00312が発生します。

ORA-16014: ログ1、順序番号1がアーカイブされていません。使用可能な宛先がありません。
ORA-00312: オンライン・ログ1 スレッド1: '/test/redo01.log'
ORA-16038: ログ1、順序番号1をアーカイブできません。
ORA-19809: リカバリ・ファイルの制限を超えています
ORA-00312: オンライン・ログ1 スレッド1: '/test/redo01.log'

原因として、アーカイブログファイルの出力先の指定に誤りがある場合や、アーカイブログファイルの出力先となっている高速リカバリ領域が不足している場合などが挙げられます。
対処方法としては、領域不足の場合は領域の拡張(高速リカバリ領域を利用している場合はdb_recovery_file_dest_sizeの設定値の見直し)や既存ファイルのバックアップ退避を行います。
アーカイブログファイルの出力先に誤りがある場合は、正しい出力先へ初期化パラメータ(log_archive_dest_n)を変更する必要があります。

②該当コマンドの実行時に発生

不完全リカバリや、バックアップした制御ファイルを使用してリカバリを行った後などに利用するコマンド<alter database open resetlogs;>を実行した際に、ORA-00313やORA-00316 に付随してORA-00312が同時に発生します。
このエラーは、コマンド<alter database open resetlogs;>が正常終了し、想定された動作となっていれば問題ないメッセージとなります。

ORA-00313: ログ・グループ1(スレッド1)のメンバーをオープンできません。
ORA-00312: オンライン・ログ1 スレッド1: '/test/redo01.log'
ORA-00316: ログ1(スレッド1)のヘッダー型0はログ・ファイルではありません
ORA-00312: オンライン・ログ1 スレッド1: '/test/redo01.log'

③Data Guard構築環境で発生

Data Guardを構築している環境で、REDOデータをスタンバイ・データベースへ適用する際や、関連した操作を実施する際に、他のエラーメッセージに付随してORA-00312が発生する場合があります。
先行のメッセージにより対処方法は変わってきますが、ただのメッセージとして表示されている場合や、Data Guardの設定で必要な初期化パラメータ<log_file_name_convert>を変更しなくてはならない場合もあるため、現在のData Guardに関する設定を再確認しましょう。

3.最後に

ORA-00312は単独のエラーではなく他のエラーメッセージに付随して発生するエラーのため、まずは先行して発生している他のエラーメッセージについて内容を確認しましょう。
その確認を進めていく中で、どのREDOログファイルでエラーが出ているかをORA-00312のメッセージでチェックする流れをお勧めします。