運用時に発生するエラー
ORA-00054: リソース・ビジー、NOWAITが指定されていました。
テーブルなどの操作においてロックが必要な処理を実行したが、ロックを取得できなかったことで ORA-00054: 〜エラーが発生する。
原因
Oracle 11g より前の場合 DDL は NOWAIT 指定するもしないにかかわらず 常に NOWAIT(※) である。
DML は基本的に WAIT で動作する。SELECT FOR UPDATE においてのみ NOWAIT を記述することができる。
(※) NOWAIT とはロックが競合した場合に即エラーで制御を戻し、WAIT とは競合した場合にはロックが解除されるのを待機する。
Oracle 11g からは DDL_LOCK_TIMEOUT 初期化パラメータ (WAIT) によって DDL において待機時間を設定できる。
セッションレベルで DDL のタイムアウトを 60 秒にする例
ALTER SESSION SET ddl_lock_timeout = 60;
対応
DDL を実行する場合には、そのスキーマが DML などによってフェッチや操作されていないときに実行するように注意する。
特に TRUNCATE TABLE と SELECT はロックの競合が発生しないので思わぬ結果になる場合も考えられる。
(もちろんそのようなことがないように作られているはずであるが、その機能を試す価値があるかどうかを考える)
参考 ⇒ TRUNCATE と DELETE の違い
DDL を実行する場合には原則、メンテナンス時間に実行する。TRUNCATE は運用上 SELECT されない状態を確保する。
稼動ピーク時にテーブルの定義を変更すると関連する実行計画がクリアされるので過負荷状態になる可能性がある。
関連事項
一覧ページへ戻る
OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。