Oracle 10g で ORA-16038 エラーが発生したときの対処方法

ディスク容量の少ない開発サーバ。多目的な用途でいろいろな CGI アプリを動作させているので、すぐにディスク容量がいっぱいになってきます。本日の Samba の領域の作業ファイルやら Oracle のアーカイブログやらが一杯増えてきたので、Oracle のアーカイブログを一括削除しました。

はい。賢い方はこの時点で理解頂けると思いますが、Oracle を shutdown せずにアーカイブログを削除したので、redo ログをアーカイブログに書き出し中の状態のままで ORA-16038 エラーを吐いて Oracle が停止してしまいました。

- スポンサーリンク -

何とも、愚かな・・・(;´Д`)ウウッ… 。

Oracle Master を取得してから随分となるので、いきなり道の障害が発生すると焦ります。幸い開発サーバ。最悪、本番から export したダンプファイルを元にデータベースを再構築すればよいのですが、そんな時間は今ありません。

が、ORA-16038 エラーの回復は比較的簡単。以下に今回の現象と回復方法を記します。同じ目にあって悩む方の参考までに。

アーカイブモード運用中に、使用中のアーカイブログを消すとこんなエラーがでます。

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
に接続されました。

SQL> shutdown abort
ORACLEインスタンスがシャットダウンされました。

SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area  167772160 bytes
Fixed Size                  2019320 bytes
Variable Size             109051912 bytes
Database Buffers           54525952 bytes
Redo Buffers                2174976 bytes
データベースがマウントされました。

ORA-16038: ログ2、順序番号227をアーカイブできません。
ORA-19809: リカバリ・ファイルの制限を超えています
ORA-00312: オンライン・ログ2 スレッド1: '/db1/oradata/test/redo02.log'

こんな感じで、database の open に失敗します。redo をアーカイブログに移したいとおっしゃってます。

ORA-16038 や ORA-19809 の意味は?

ORA-16038: ログstring、順序番号stringをアーカイブできません。
原因: 指定された名前のファイルをアーカイブしようとしましたが、そのファイルはアーカイブできません。続いて表示されるエラー・メッセージを確認して、そのエラーの原因を判別してください。 処置: 処置は必要ありません。

ORA-19809: リカバリ・ファイルの制限を超えています

原因: DB_RECOVERY_FILE_DEST_SIZEによって指定されているリカバリ・ファイルの制限を超えています。
処置: このエラーは19804とともに発生します。詳細はメッセージ19804を参照してください。

ORA-19804: stringバイトのディスク領域を制限stringから再生できません

原因: DB_RECOVERY_FILE_DEST_SIZE制限から指定されたバイトのディスク領域を再生できません。
処置: 5つの解決方法が考えられます。

1) RMANを使用してリカバリ領域のバックアップ間隔を短くします。
2) RMAN保存方針の変更を検討します。
3) RMANアーカイブ・ログ削除ポリシーの変更を検討します。
4) ディスク領域を追加して、DB_RECOVERY_FILE_DEST_SIZEを増やします。
5) RMANを使用してファイルをリカバリ領域から削除します。

回復するには、NoArchiveLog モードにします

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

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

shutdown immediate でシャットダウン後、startup mount します

SQL> shutdown immediate;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area  167772160 bytes
Fixed Size                  2019320 bytes
Variable Size             113246216 bytes
Database Buffers           50331648 bytes
Redo Buffers                2174976 bytes
データベースがマウントされました。

再びアーカイブログ運用へ戻して open する

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

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

以上で、正常な状態に戻すことができます。念のためにこの時点でのコールドバックアップなりを取得しておくのが得策です。

ちなみに、shutdown immediate を shutdown abort にすると以下のようなエラになります。

SQL> alter database archivelog;

alter database archivelog
*
行1でエラーが発生しました。:
ORA-00265: ??????????????????ARCHIVELOG????????????

インスタンス回復が必要となるため、アーカイブモードの変更ができないのでご注意を。

- スポンサーリンク -