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: リカバリ・ファイルの制限を超えています
処置: このエラーは19804とともに発生します。詳細はメッセージ19804を参照してください。
ORA-19804: stringバイトのディスク領域を制限stringから再生できません
処置: 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????????????
インスタンス回復が必要となるため、アーカイブモードの変更ができないのでご注意を。
コメントやシェアをお願いします!