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

3月1日から構築をはじめる Oracle 10g RAC なデータベース。気がつけば残り1週間。そう言えば2月は煮っすが少なかったんだ・・・と今日になってちょっと焦る。いろいろ検証している最中なのですが、なんてか、8i や 9i とちょっと違う。9i まではマジメに勉強してきたのである程度知っているのですが、10g は勉強時間ゼロな状態で触りはじめたのでパラメータとかイマイチ理解し切れてません。

おまけに初めての RAC でちょっと不安。まぁ構築自体は技術力のあるベンダーがやってくれるので安心なんですが。で、検証中にいろいろハマッたことを備忘録的にメモ。後ほど自分が再びハマッても困らないようにと。

- スポンサーリンク -

ORA-00257 エラーがでた!どうすればいいの?

約11GBというエクスポートファイルを元にデータ移行していたら、途中の巨大テーブルのインポート処理に入ってから、いつまで経っても作業が進行する気配無し。作業の進行度合いを確かめるために、SQL*Plus でログインをしようとすると、こんなエラーが発生。

ORA-00257: アーカイブ・エラーです。解除されるまで内部接続のみにしてください。

このエラーは過去に体験済みで、アーカイブ REDO ログがディスク容量満杯で書き込みができなくなり、トランザクション処理が一時停止したときに発生するエラーだ。こうなると、DBA ユーザ以外ではログインが不能。アーカイブ REDO ログが書き出し可能になるために、ディスクの不要なログを削除して領域確保をしなければなりません。

不要なアーカイブ REDO ログの削除を自前で書いた shell とかを cron で自動的に削除するようにしておかないと意外とハマる。良くあるパターンとしては、日時バックアップ時に最新状態に戻すために必要なアーカイブログ以外を削除する方法。もっとわかりやすく言うと、

alter tablespace TableSpace名 begin backup;

を開始する直前からのアーカイブ REDO ログがあればOKと、アーカイブ REDO ログ周りの運用には慣れているはず。が、しかし、今回はディスクの容量は激しく余ってるのにこのエラーが発生しました。

その謎はアラートログの内容から解決しました。

Errors in file /oracle/admin/TESTDB/bdump/TESTDB_arc1_3872.trc:
ORA-19815: 警告: db_recovery_file_dest_size(2145386496バイト)は100.00%バイトが使用され、残り0バイトが使用可能です。
Tue Feb 21 13:01:42 2006
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
system command was used to delete files, then use RMAN CROSSCHECK and
DELETE EXPIRED commands.
************************************************************************

9i からの新機能であるフラッシュバック機能。一種のリカバリー機能に相当するものです。

  • フラッシュバック→ 過去のデータが参照可能
  • 行履歴フラッシュバック→ データの変更履歴を確認可能
  • トランザクションフラッシュバック→ トランザクションのUNDOを行うSQLを取得可能
※より詳しく勉強したい方は、「メールマガジン - バックナンバー : Oracle10g フラッシュバック アゲインの巻7」をどうぞ。


で、何が悪いかというと、

  • フラッシュバック機能を使う際に使用するディレクトリとアーカイブ REDO ログの書き出し先がデフォルトでは同じ。
  • アーカイブ REDO ログの書き出し可能な容量が、db_recovery_file_dest_size の制限を受ける。

と言うことなのです。デフォルトで db_recovery_file_dest_size のサイズは2GB。したがってアーカイブ REDO ログとして吐き出し可能なサイズも最大2GBまで。

10g のデフォルトの仕様なのです。コレ、意外とハマル。で、こうならないためには以下のように設定するのが吉。

  1. フラッシュバック機能は本当に必要な時にのみ設定し、それ以外の時は OFF にする。
  2. db_recovery_file_dest_size を十分大きな値にしておくか、初期化パラメータファイルで log_archive_dest_1= アーカイブ REDO ログの保存先を明示的にフラッシュバック領域と別にする。

Oracle 10g なかなか手強いです。

- スポンサーリンク -