2014年3月12日水曜日

本番障害で大爆笑が起きた珍事

ブログを移転しました。
https://awsbloglink.wordpress.com

7年前に建築関係のシステムに参画した時の話です。
私はDBAに従事しておりカットオーバーしてプレ本番をしている段階でした。
(厳密に言うと社内の人が評価をしている状態)
DBAは、論理設計、物理設計が終わって、バックアップや性能レポートの作成、SQLの質問などを対応する状況でしたが、比較的落ち着いていました。
ただ、開発チームは頻発するバグや追加要件の対応に終われいて疲弊しており、エンドユーザーもイライラして緊張感MAXでした。

そんな状況で・・・AP、DBサーバのCPUがベタ張り状態になり動作不能に。
数十人のエンドユーザーが環境を使用しているため、事態に気付いたエンドユーザーの部長が、
どなりこんできました。
リソース不足ではなく開発チームのPGなのは予想できましたが、
当然のことながら原因追及をしなくてはなりません。

APはWebLogic(当時はBEA)。DBはOracle10gR2。


どう考えてもSQLだろうと推測して、激重状況でしたが、
EMのパフォーマンス統計を閲覧したところ、1つのSQLがDBを占有していました。
イメージ図で行くと、こんな感じの単純なSQLでした。
==========================
select *
from a , b , c
where b.code = c.code
and c.kbn = '1'
==========================

SQL文を知っている方ならダメな点にすぐ気付くと思います。
aというテーブルがbテーブル/cテーブル連合軍と直積しているんですね。
(簡単に言うと掛け算)

条件の書き忘れという単純なSQLですので、実行計画なんて見るまでもない完全なバグ。
これは部長に言ったら怒鳴り散らすだろうなと思ったんですが、言い訳を考えるためにSQL統計を
覗いたら行が凄いことに・・・
SQL統計
行:3,500,000,000,000 (3兆5千億件)
大きいテーブルで1,000万件、DWHの最大テーブルで1億件程度だったので、
この件数は破格すぎて言葉を失いました。


ただ、これを物凄い真面目な顔して報告したら、部長の怒りが少しは収まらないかなと思い・・・
とりあえず言ってみることにしました。
(どうせ怒られるんだから)

私「部長、原因がわかりました!PGから3兆5千億件のデータ取得が走っているため、
  終わるまでもうしばらく時間がかかると思います。しばらくお待ちください!」
  (終わるわけないのは重々承知)

これを言ったらプロジェクトルームが大爆笑。
エンドユーザーの課長が笑っていたため、空気を読んでくれたのかSIer側も大爆笑。


肝心の部長も・・・「一体、何をしようとしてそんなことになったのかな(笑)」と、
激怒していた部長の表情がやわらぎました。(呆れていました)

これは最後の畳み掛けとしてPGを書いた人間に理由を聞くしかないと思い、
PGを書いた人に何をしようとして、このSQL文を書いたのか?と尋ねました。

PGの回答
「家の建築に使用する扉の一覧を表示しようとしました」

部長
「弊社は取り扱っている製品が多いから、扉については他社に負けない在庫を所有しているな(笑)」


これで完全に突破口が見えたので、
「該当SQLを停止して、APとDBをサーバごと再起動して、テスト再開を提案」
許可がおりたので、即刻実行して、テストを再開して乗り切りました。
PGには厳重注意しましたが・・・。


こういう事態にならないようにリソースマネージャーを定義していたのですが、
バッチ処理などが並行して走るため、リソースの制限は本番まで止めておいてください
という指示されていたため、言い訳もなんとかたちました。


本番障害で大爆笑という珍事でした。
SQL文は条件がきちんとつながっているか確認しましょう。
ビッグデータ時代だから、件数は大したことないが、それでも建築資材を選ぶシステムで、
3兆5千億件はありえないですよね。。。

IT屋には演技力も必要というのが私の持論です。

0 件のコメント:

コメントを投稿