今回は,SQL文が異常終了するトラブルを中心に,その原因や対処法を解説する。ストアド・プロシージャやトリガーなどに埋め込まれたSQL文は,その存在が見落とされがちだが,エラーになった際の影響が大きいので注意が必要だ。また,共有プール領域のエリア不足でSQL文がエラーとなるケースは少なくない。このトラブルを防ぐには,エリアの使用状況を把握し,適切にサイズを調整することが欠かせない。

 Oracleを利用する上で陥りやすいトラブルの原因,対処法を解説するセミナーの最終回である。今回は,「SQL文が異常終了した」,「ディスクにアクセスできなくなった」という2つのトラブルを取り上げる。

 SQL文が異常終了する原因は多岐にわたるが,ストアド・プロシージャ*など,“動くのが当然”という意識で運用されがちなストアド・プログラムは,エラーが発生した場合のダメージが大きいため,定期的なチェックが欠かせない。また,ディスクにアクセスできなくなるトラブルには,制御ファイル*を2重化しておくなどの予防策が有効だ。さらに,データの保全性を求められるシステムでは,データ・ブロック*の破損を定期的にチェックし,トラブルを早期に発見する必要もある。

トラブル9
SQL文が異常終了した

 システムによっては,PL/SQLで作成したストアド・プロシージャやファンクション*トリガー*などを多用している場合があるだろう。これらストアド・プログラムは,開発生産性が高く,かつ便利である半面,管理を徹底しないと思わぬトラブルの原因となることがある。特にトリガーなどは,“システムの裏側”で動くために問題が顕在化しにくく,エラーが発覚したころには,データの不整合が起こって復旧に大きなコストを伴ってしまうことも少なくない。

 最初に紹介するトラブルの事例は,このストアド・プログラムを含むオブジェクト管理に起因する問題である。あるバッチ処理のプログラムを実行したところ,“ORA-20003”のエラーが発生してしまった。昨日までは何の問題もなく,正常に完了していた処理である。ORA-20003 は,DBMS_DESCRIBEパッケージの“DESCRIBE_PROCEDURE”と呼ぶプロシージャが発行するエラーである。ストアド・プログラムを実行する際は,このプロシージャに引き数としてオブジェクト名(プロシージャ名)を与えるが,このオブジェクトが「INVALID(無効)」の状態であったり,存在しなかったりすると,ORA-20003のエラーが発生する。

図1●オブジェクトの状態を調査する

 実行対象のオブジェクトが存在しているのであれば,そのオブジェクトの状態を調べる必要がある。調査するには,all_objectsやuser_objectsといったデータ・ディクショナリを利用する(図1[拡大表示])。この例では,ディクショナリの参照結果にあるSTATUS列の“INVALID”を見て分かるように,対象プロシージャが無効状態になっていた。INVALIDのステータスにあるストアド・オブジェクトを再コンパイルし,「VALID(有効)」の状態にすることが,根本の解決策である。

デッドロックとして現れることもある

 次の例もストアド・プログラム関連のトラブルである。クライアントからストアド・プロシージャを実行したところ,以下のORA-04020が発生してエラーになってしまった。

ORA-04020:deadlock detected while trying to lock object SCOTT.FUNCTIONCOUNT
ORA-04020:オブジェクト name をロックしようとしてデッドロックを検出しました。

 ORA-04020メッセージに対するマニュアルの解説には,「ライブラリ・オブジェクトに対するロックを獲得しようとしたところデッドロックが検出されました。時間を置いてから操作を再実行してください」とある。この例も,結果的にはINVALID状態のストアド・プロシージャを実行しようとしてエラーが発生していた。ただし,通知されたエラー・コードは先ほどの例(ORA-20003)とは異なる。このケースでは,PL/SQLクライアントから INVALIDステータスのストアド・オブジェクトを呼び出した際,内部的にファンクションを再コンパイルする処理でデッドロックが発生し,ORA-04020のエラーとなって現れたのである。なお,このようなケースでデッドロック状態になってしまう問題は,Oracle8.1.7.2や9i Databaseでは解消されているようである。

 この事象も先の事例と同様に,INVALIDステータスのストアド・オブジェクトを再コンパイルすることで,VALIDの状態にできるだろう。このようなトラブルを回避するためには,日頃のOracleの稼働監視もさることながら,オブジェクトの状態をチェックすることも必要になる。

(内藤 尚=システムコンサルタント オープンシステム統括部 マネージャー)