OracleのSQLが長時間動いてしまい、プロセスキルもできなくて焦った
知らぬ間に長時間SQLが動いていた
先日、テスト環境のあるテーブルに見知らぬデータが入っていることに気が付きました。
更新日時を見てみると、つい30分前。
全く心当たりが無いのですが、入っているデータを見るとどうも自分が2週間前くらいに実行したSQLで作成されたデータっぽいことが分かりました。
このSQL、数百万件の大量データをあるテーブルから別のテーブルへ処理して投入するものだったのですが、性能の問題で1日で2万件しか投入できなかったため、途中で中断したはずが、プロセスが生き残ってゾンビのように動いていたようでした。
常にテーブルにINSERTしているためテーブルロックがかかっており、データを消すことも他のデータを入れることもできず困ったことになりました。
いろいろ試行錯誤する
・V$SESSIONからプロセスID等取得しようとしたが、DBA権限がないため実行できない
・コマンドラインからpsコマンドでpidゲットし、killしようとするが、killするところで権限がない言われ弾かれる。
と、いろいろ試みましたが全く終了させることができません。
DB管理チームに連絡すれば解決しますが、説明が非常にめんどくさい。。
なんとか自分で終了させることができないのか考えましたが、全くもって簡単に終了させる手段がありました。
以外と盲点になる方法
変なSQLが動き続けているとなると、「プロセスを強制的に終わらせればいいんだろ」という方向に行きがちですが、
もっと簡単な方法としては、実行中のSQLを強制的にエラーにすればいいのです。
OracleはSELECT時にはテーブルをロックしないので、参照テーブルのデータはいじることができます。
そのため、参照テーブルのデータを編集し、SELECTやINSERT時に一意制約などのエラーが起こるようにしておけば、見事エラーになって終了させることができます。
けっこう気づかないものです。
めでたしめでたし。
ディスカッション
コメント一覧
まだ、コメントがありません