none
SQL Server 2005 のエージェント のジョブ実行中に、tempdbの領域不足で処理中断してもジョブがエラーにならない!? RRS feed

  • 質問

  • お世話になります。

    SQL Server 2005のエージェントでスケジュールから実行するジョブが、tempdb の領域不足で処理が中断されてしまいました。

    ところがプロシージャではエラーの検知ができなかったみたいで、ジョブは正常終了の扱いになってしまいました。

    ジョブのステップは CmdExec で、
     D:\HogeHoge\バッチ\ジョブ.bat
    の一文が登録されていて、詳細設定の出力ファイルには
     D:\HogeHoge\バッチ\ログ\ジョブ.log
    が、指定されています。
    ※失敗した場合のアクション:失敗を報告してジョブを終了する

    ○ジョブ.bat
    setlocal enabledelayedexpansion
    set CURRENT_DIR=%~dp0
    set LOGDIR=%CURRENT_DIR%ログ
    set LOGFILE=%LOGDIR%\ジョブ実行.log
         :
    call %CURRENT_DIR%ジョブ実行.bat > %LOGFILE%
    set ERROR_LEVEL=%ERRORLEVEL%
         :
    exit /b %ERROR_LEVEL%

    ○ジョブ実行.bat
    setlocal enabledelayedexpansion
         :
    Sqlcmd -U %USERID% -P %PASSWORD% -S %SERVERNAME% -d %DATABASE% -Q "execute SP_ジョブ " -o %SQLLOGFILE% -b
    set ERROR_LEVEL=%ERRORLEVEL%
         :
    set ERRORLEVEL=%ERROR_LEVEL%

    tempdb の領域不足による処理中断は、イベントログとSqlcmd の-o で与えたログファイルからわかりました。

    また、Sqlcmd がエラー終了しなかったのは、ジョブ実行.log や ジョブ.log からわかりました。

    tempdb の領域不足に限っての仕組が必要なんでしょうか?

    それとも現在の構成に何か問題があるんでしょうか?

    よろしくお願いします。

    2013年6月24日 14:15

回答

  • >実験ではSqlcmd がエラーを返す

    へっぽこドラマーさんの説明から、バッチのプログラムが正しく処理されているかどうか検証する必要があるのではないかと思います。プログラム以外にもお客様の環境との違いが問題になっているかも知れませんが、SQL Server フォーラムでの解決は難しいと思います。(SQL Server とは関係なく、バッチの処理に詳しい方にみてもらうと早く解決できそうです。)

    ご参考までに。
    4.7 別バッチファイルの呼び出し
    http://takeno.iee.niit.ac.jp/~shige/misc/script/bat1/node11.html


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年6月28日 8:34

すべての返信

  • フォーラム オペレーターの星 睦美です。
    へっぽこドラマー さん、投稿ありがとうございます。

    MSDN ライブラリに「tempdb のディスク領域の不足に関するトラブルシューティング」の説明がありますのでご紹介します。

    トラブルシューティングを行ってみて、もし解決しない場合には調査した結果を追記して返信いただければ、コミュニティの回答者から役立つアドバイスがあるのではないかと思います。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美


    • 編集済み 星 睦美 2013年6月26日 5:53 改行を修正
    2013年6月26日 5:53
  • 星 睦美 様

    ありがとうございます。

    tempdb の監視等について、大変参考になりました。

    けれど質問にもあげましたが、今欲しいのは「なぜtempdbの領域不足で処理を中断された Sqlcmd でエラーを検知できなかったのか?」です。
    (対処の内容より前に、原因の究明をお客様から厳しく要求されているんです。このbatファイルもSPも作った人はもう居ないので、私がすごく責められています。)

    Sqlcmd の -bオプションは重大度10を超えたエラーでエラーを報告するとの事なので、重大度17のこのエラーは拾える筈だと思うのですが…。
    (今回バッチファイルを見て、念の為に-Vオプションも必要なのかな…とも思ってます。)

    それとも ERRORLEVEL の扱い方が悪いのでしょうか?

    よろしくお願いします。

    == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ == ○ ==

    追加情報です。

    ローカルPC に SQL Server を入れて、実験してみました。
    (データベースはお客様環境からのバックアップを使いました)

    (1)tempdb の自動拡張をオフにする。

    (2)既存テーブルと同じ構成のtemporaryテーブルを作り、既存テーブルのデータ全部を
       キー以外の項目でソートしながらtemporaryテーブルに読み込むのを、ひたすら繰り返すSPを作る。

    (3)ジョブやbatファイルはお客様環境のものからの抜粋で作る。

    このジョブを「ジョブの開始」で走らせたら、tempdbの領域不足が起きてSqlcmd は ERRORLEVEL に 1 を
    渡していたのですが、ジョブ自体は正常終了になってしまいます。
    (お客様環境ではSqlcmd は ERRORLEVEL=0 なのに。。。)

    試しに今朝走らせたら、なぜかジョブも異常終了になりました。
    (ジョブステップの内容を D:\HogeHoge\バッチ\ジョブ.bat としていた所を、試しに call を頭につけて
    call D:\HogeHoge\バッチ\ジョブ.bat としたんです。)
    call を付けないと ERRORLEVEL の評価をしてくれないんでしょうか?以前は call なんてつけなくても大丈夫だった
    ような記憶があるんですけど。。。

    でも、実験ではSqlcmd がエラーを返すので、お客様環境でエラーにならなかった理由にはなりません。。。

    ますますお客様への説明がつかなくなってきちゃいました。

    お願いします、誰か助けてください。


    2013年6月27日 7:53
  • >実験ではSqlcmd がエラーを返す

    へっぽこドラマーさんの説明から、バッチのプログラムが正しく処理されているかどうか検証する必要があるのではないかと思います。プログラム以外にもお客様の環境との違いが問題になっているかも知れませんが、SQL Server フォーラムでの解決は難しいと思います。(SQL Server とは関係なく、バッチの処理に詳しい方にみてもらうと早く解決できそうです。)

    ご参考までに。
    4.7 別バッチファイルの呼び出し
    http://takeno.iee.niit.ac.jp/~shige/misc/script/bat1/node11.html


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年6月28日 8:34
  • 星 睦美 様

    回答ありがとうございました。

    バッチ処理の方で質問をあげてみようと思います。

    2013年7月3日 6:56