ラベル エラー対応 の投稿を表示しています。 すべての投稿を表示
ラベル エラー対応 の投稿を表示しています。 すべての投稿を表示

ORA-00054

ORA-00054: リソース・ビジー、NOWAITが指定されていました。

というエラーが発生しました。

データを削除しようとした時にORA-00054が発生しました。
HELPを見て確認すると、対応方法に
必要に応じて再試行してください。

と書いてありました。

意味がわからない。
とりあえず再実行しても結果は同じです。
もう一度エラーメッセージを眺めてみると「NOWAIT」という単語が気になりました。
SQLServerの経験からこれはトランザクション関係の何かかなと?

ということでトランザクション関係を調べてみると
どうやらロックされているテーブルを削除しようとしたのが原因だとわかりました。

セッション情報を見てみると、削除しようとしているテーブルを
ロックしているセッションが確かにありました。
そのセッションを終了し無事にデータを削除することができました。

セッションの確認に使用したSQLです。

SELECT * FROM v$Session

今回は、セッションを終了させることができましたが、
必要に応じて「alter system kill sessoion」で強制終了もありかな?


ORA-03137

Oracleのアラートログに以下のエラーがありました。

ORA-03137 : TTCプロトコル内部エラー: [12333] [0] [2] [0] [] [] [] []

とりあえずエラーを調べてみました。

ORA-03137: TTCプロトコル内部エラー
原因: TTCプロトコル内部エラーです。
処置: Oracleサポート・サービスに連絡してください。

原因が全然わかりません。もう少し調べてみると。

ORA-3137[12333]は、これまで内部エラーとして出力されていたORA-600[12333]
のエラーを個別のエラーコードとしたものになります。

ということが分かりましたのでORA-00600を調べてみました。

ORA-00600: 内部エラー・コード
原因: これは、Oracleプログラムの例外に対する一括内部エラー番号です。
プロセスで例外条件が検出されたことを示します。
処置: このエラーをバグとして報告してください。最初の引数は内部エラー番号です。

・・・。エラーはわかったけど対応方法が全然分かりません。
Oracleの内部処理のエラートラップにかかった処理で原因はわかわないので
サポートに問い合わせしろということですね。

いろいろな事例を調べていると、バインド変数に不正な値を代入とか
データの一部分が壊れている場合とか本当に様々な原因があり、
何処を見てもサポートに問い合わせろと書いてありました。

このように原因不明のエラーをサポートに問い合わせる場合は再現ケースが必要です。

しかし、困ったことに再現出来ないしエラーは一回しか発生していません。
問い合わせても明確な答えが得られないのではと判断しました。

このエラーはエラーを受けたセッションは停止しますが、
影響はこれのみでデータが壊れることは基本的になく
一回しか発生してないのでそのままにし、もし再現出来たら問い合わせることにしました。

したがってこのエラーが発生した場合は、
再現出来る場合はサポートに問い合わせる。
再現出来ない場合は見てない不利をするか
別の方法を考えるというのがベストだと思います。


Oracleは行ロック

Oracleは基本的に行ロックのはずですが
何故かテーブルロックとなっていました。

あるプログラムにて同時に実行した場合、
更新するキーは違うのでロックしないと思っていましたが何故かロックしました。

ロック状態の確認は、以下のSQLにて確認出来ます。

SELECT V$SESSION.SID
,V$SESSION.SERIAL#
,SUBSTR(V$SESSION.MACHINE,1,20 )
,SUBSTR(V$SESSION.PROGRAM,1,20 )
,V$SESSION.USERNAME
,V$SESSION.COMMAND
,V$SESSION.LOGON_TIME
,V$TRANSACTION_ENQUEUE.LMODE
,V$TRANSACTION_ENQUEUE.REQUEST
,V$TRANSACTION_ENQUEUE.BLOCK
FROM V$TRANSACTION_ENQUEUE
,V$SESSION
WHERE V$SESSION.SID = V$TRANSACTION_ENQUEUE.SID

/*
項目 COMMAND :実行中のコマンド
�� INSERT、3 SELECT、6 UPDATE、7 DELETE

項目 LMODE :セッションがロックを保持している状態
�� なし、1 NULL、2 行共有、3 行ロック
�� 共有、5 共有/行ロック、6 表ロック
*/

ロックしたテーブルSQLを調査してみると、プロセスAにてテーブルAにINNSERTすると、
プロセスBではテーブルAにINSERTすることが出来ませんでした。
Oracleは基本的に行ロックであり、キーの違うINSERTならロックされないはずです。
これが同一キーの場合は、2回目のINSERTがロックされるのは正しい動作ですが
キーが違うはずなのにロックされてしまいます。

原因は、行ロックではなくテーブルロックしている為だったのですが、
テーブルロックになる理由がわかりませんでした。

そこで、テーブルロックとなる原因を調査すると2パターンありました。

1、親子関係のあるテーブルで親を更新しそれに関連する子テーブル。
��、ダイレクト・パス・インサートの設定をしてある場合。

今回の場合は、ダイレクト・パス・インサートの設定が原因でした。
後から参加したシステムなので何故ダイレクト・パス・インサートの設定がしてあるか
わからないし、データベースの設定なので一人で解決できないので他の人に投げて完了です。

ORA-06413

Oracle用のソフトを作成し、EXEファイルにて実行したところ
ORA-06413: 接続がオープンしていません。
というエラーが発生しました。


他の環境では問題なく動作します。
ある一つの環境だけこのエラーとなります。
原因がわからないまま調べてみると「接続を確立できません。」とHelpに書かれていました。
これだけでは原因が全然わかりません。
処置方法を読んでみると、

「診断プロシージャを使用して、問題を正確に確認してください。 」
と書かれていました。
診断プロシージャってなんだ?どこにあるのでしょうか?
MSDNといいOracleのHelpといい、いつも思いますが不親切ですね。

わからないのでもう少し調べていると、該当しそうな原因を発見しました。
ネットワーク・キャラクタ・セットというところに「( )=\ " ' #」という文字が予約済みです。
と書かれていました。確かに「(」を使用したフォルダの中でEXEファイルを実行していました。

ということでフォルダ名を変更して無事に実行することができました。


昔作成した別のソフトで同じような現象に悩まされました。
確かその時はソフト毎に動物の名前のフォルダにインストールしていました。
そして半角で「パンダ」といフォルダにインストールしたようでエラーがでて動きませんでした。
別のフォルダにインストールしたら無事に解決したのですが意外と多いのかな?
他に「能」という字も誤動作したと聞いたことあります。
Windowsの中での特殊な文字なのかな?原因はよくわかりません。


ORA-00980

ORA-00980: シノニム変換が無効です。
というエラーが発生しました。

あるシステムの環境設定を行い実行したところで発生しました。
調べてみると
シノニム作成時に、対象オブジェクトが存在しない場合にもSQL文はエラーにはなりません。
但し、作成したシノニムを参照すると、以下のようなエラーが発生します。
と書かれていました。

対応方法として
シノニムの対象オブジェクトを正しく作成すると、シノニム参照時のエラーは発生しません。
となっていました。

ということで怪しそうなシノニムを探してシノニムされているけど存在しないテーブルを
作成することで問題解決しました。