OracleのSQLが長時間動いてしまい、プロセスキルもできなくて焦った

2021年1月31日IT

知らぬ間に長時間SQLが動いていた

先日、テスト環境のあるテーブルに見知らぬデータが入っていることに気が付きました。

更新日時を見てみると、つい30分前。

全く心当たりが無いのですが、入っているデータを見るとどうも自分が2週間前くらいに実行したSQLで作成されたデータっぽいことが分かりました。

このSQL、数百万件の大量データをあるテーブルから別のテーブルへ処理して投入するものだったのですが、性能の問題で1日で2万件しか投入できなかったため、途中で中断したはずが、プロセスが生き残ってゾンビのように動いていたようでした。

常にテーブルにINSERTしているためテーブルロックがかかっており、データを消すことも他のデータを入れることもできず困ったことになりました。

 

いろいろ試行錯誤する

 

・V$SESSIONからプロセスID等取得しようとしたが、DBA権限がないため実行できない

・コマンドラインからpsコマンドでpidゲットし、killしようとするが、killするところで権限がない言われ弾かれる。

と、いろいろ試みましたが全く終了させることができません。

 

DB管理チームに連絡すれば解決しますが、説明が非常にめんどくさい。。

なんとか自分で終了させることができないのか考えましたが、全くもって簡単に終了させる手段がありました。

 

以外と盲点になる方法

変なSQLが動き続けているとなると、「プロセスを強制的に終わらせればいいんだろ」という方向に行きがちですが、

もっと簡単な方法としては、実行中のSQLを強制的にエラーにすればいいのです。

OracleはSELECT時にはテーブルをロックしないので、参照テーブルのデータはいじることができます。

そのため、参照テーブルのデータを編集し、SELECTやINSERT時に一意制約などのエラーが起こるようにしておけば、見事エラーになって終了させることができます。

 

けっこう気づかないものです。

めでたしめでたし。

 

スポンサーリンク

IT

Posted by Kei