いろいろ忘れていて対処に手間取ってしまったので、自分用にメモメモ。
とりあえず詳しいエラー内容を確認すると、
ORA-00257: アーカイブ・エラーです。解除されるまで内部接続のみにしてください。
原因:
ARCHプロセスがREDOログをアーカイブしようとして、エラーを受け取りました。問題がすぐに解決されない場合、データベースはトランザクションの実行を停止します。アーカイブ先のデバイスで、REDOログ・ファイルを格納する領域が不足している可能性があります。
処置:
アーカイバ・トレース・ファイルを確認して、問題の詳細な説明を調べてください。また、初期化パラメータARCHIVE_LOG_DESTに指定されたデバイスが、アーカイブに対して適切に設定されていることを検証してください。
ORA-00000~ORA-00830 より引用
とのことだったので、とりあえず下記のSQLで現在のログモードを確認。
SQL> SELECT LOG_MODE FROM V$DATABASE ;
結果は ARCHIVELOG でしたので、とりあえずはアーカイブログモードで動いているようです。ちなみに上記SQLの結果は、ARCHIVELOG | MANUAL | NOARCHIVELOG のいずれかになります。
次に、フラッシュリカバリ領域の空き状況(使用率)を確認します。
SQL> SELECT * FROM V$RECOVERY_FILE_DEST;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------- ----------- ---------- ----------------- ---------------
L:/oracle/log 4294967296 4119674880 0 63
上記SQLの結果から、領域の最大サイズを示す SPACE_LIMIT と、使用済みの領域サイズを示す SPACE_USED を比べます。と、ここで空き容量がほとんど無くなっていることが判明・・・orz
ここからは RMAN で接続して作業です。ちなみに RMAN で接続するためのコマンドは以下の通り(いや、自分が忘れてたので)。また、USER/PASS の部分は、お使いの環境に合わせて置き換えてください。
rman target USER/PASS nocatalog
とりあえず、Oracle が認識しているファイルで、既に無くなっているファイルが無いか確認してみます。
RMAN> CROSSCHECK ARCHIVELOG ALL;
もしそんなファイルがあった場合は、上記コマンドの後で
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
としてやると、無くなっていたファイル分の領域が未使用分として認識されます。ここまでやって問題がなければ、古いアーカイブログを削除するか、フラッシュリカバリ領域を拡張するしかありません。
古いアーカイブログを削除する場合は、OSのコマンド(もしくは操作)で削除するのではなく、やっぱり RMAN から行います。そうしないと、Oracle がファイルが無くなったことを認識できないので、消えたファイルのサイズが空き容量として認識されません。
もし、OSから直にアーカイブログファイルを削除してしまった場合は、上の 「CROSSCHECK ~」 と、「DELETE EXPIRED ~」 のコマンドで、Oracle に空き容量を再認識させてください。
というわけで、7日前より古いログを削除する場合のサンプルは以下の通り。
RMAN> DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7' ;
また、フラッシュリカバリ領域を拡張する場合は、SQLで
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=4G SCOPE=BOTH ;
とすると、合計で 4G のサイズを割り当ててくれます。
今回は、最終的にフラッシュリカバリ領域を拡張する事で対応しました。それにしても、ドライブに空き容量があって本当によかった。
参照リンク
・ORA-00000~ORA-00830
・ORA-00257 - オラクル・Oracle エラー FAQ
・Oracle / フラッシュリカバリ領域-ARCHIVELOGモード | WEBレシピ
・フラッシュバックリカバリの基礎知識 (1/3) - @IT
・アーカイブログの削除 (OSTL)