次の方法で共有


第 3 章 「警告のしくみとトラブルシューティング」 ~ SQL Server エージェントを有効に使ってますか ? ~

NEC

Eラーニング事業部

鈴木 智行

2002 年 10 月 17 日

目次

1. 警告とは 1. 警告とは
2. 警告を利用するための準備作業 2. 警告を利用するための準備作業
3. SQL Server イベント警告 3. SQL Server イベント警告
4. ユーザー定義エラーメッセージの作成と発生 4. ユーザー定義エラーメッセージの作成と発生
5. 動的なユーザー定義エラーメッセージの利用 5. 動的なユーザー定義エラーメッセージの利用
6. SQL Server パフォーマンス条件警告 6. SQL Server パフォーマンス条件警告
7. ジョブと警告のトラブルシューティング 7. ジョブと警告のトラブルシューティング
7. ジョブと警告のトラブルシューティング 8. まとめ

1. 警告とは

SQL Server 2000 の警告は 2 種類 (イベント警告、パフォーマンス警告) あり、どちらも SQL Server 2000 で発生した事象に自動対応することができます。例えば SQL Server 2000 でエラーが発生した時の対処方法がわかっていれば、あらかじめエラーに対して対処方法を警告として登録しておくことで、管理者の手を煩わせずに運用を継続することができます。そういう意味では、他の DBMS は受動的な管理であるのに対し SQL Server 2000 は能動的な管理を実現することが可能だといえるでしょう (図 1-1)。

agent3-1-1.gif

1-1 受動的な管理と能動的な管理

このように SQL Server はジョブに加え、警告をうまく活用して管理作業の自動化を尚一層推進することができます。

2. 警告を利用するための準備作業

SQL Server イベント警告は Windows 2000 アプリケーションログに格納された SQL Server エラーログのエラー番号や重大度レベルに応答することができます。ここで重要なのは SQL Server 2000 で発生したエラーを Windows 2000 アプリケーションログに書き込まなければ警告のしくみは動作しないということです。すなわち SQLServerAgent は EventLog を監視して定義された警告の応答動作を行います (図 2-1)。

agent3-2-1.gif

2-1 イベント警告が発生するしくみ

しかし、SQL Server 2000 のエラーメッセージは全て Windows 2000 アプリケーションログに格納されるわけではありません。重大度レベル 19~25 までのものだけが自動的に書き込まれます。したがって警告で使用する重大度レベル 18 以下のエラーメッセージは Windows 2000 アプリケーションログに書き込むようにする必要があります。[コンピュータ] を右クリックし、「すべてのタスク」-「SQL Server メッセージの管理」- [検索] タブで、メッセージの内容もしくはエラー番号で対象となるエラーを検索し、「Windows イベントログに書き込む」 にチェックしてください (画面 2-2)。

agent3-2-2.gif

画面 2-2 エラーメッセージを Windows 2000 アプリケーションログに書き込む (1)

上記の設定は sp_altermessage システムストアドプロシージャでも実行可能です。

3. SQL Server イベント警告

SQL Server イベント警告は以下のように作成します。まず、[SQL Server エージェント] - [警告] を右クリックし、「新規警告」- [全般] タブで警告が発生するためのイベントをエラーメッセージ番号もしくは重大度レベルで指定します (画面3-1)。

agent3-3-1.gif

画面 3-1 警告の定義設定

もし、この時指定したエラーメッセージが Windows 2000 アプリケーションログに書き込むように設定されていなければ画面 3-2 のウィンドウが表示されます。ここで、[はい] を押下することでたとえ準備作業を忘れていたとしても自動的に書き込むように設定が可能です。

agent3-3-2.gif

画面 3-2 エラーメッセージを Windows 2000 アプリケーションログに書き込む (2)

次に [応答] タブでは、イベントが発生した場合の対処 (ジョブ実行、オペレータへの通知) を指定します (画面 3-3)。

agent3-3-3.gif

画面 3-3 警告の応答設定

応答の動作としてジョブ実行を指定した場合は、指定したジョブのスケジュールに警告が登録されます (画面 3-4)。

agent3-3-4.gif

画面 3-4 ジョブスケジューリングとしての警告

上記の設定をすればエラー (この場合はエラー番号 2627 のエラー) が発生した場合に警告 (この場合はジョブの実行と Net Send オペレータへの通知) を自動で動作させることが可能になります (画面 3-5)。

agent3-3-5.gif

画面 3-5 警告発生時の自動応答

4. ユーザー定義エラーメッセージの作成と発生

警告は SQL Server 2000 がもともと持っているシステムエラーメッセージだけでなく、ユーザーが作成したエラーメッセージにも対応させることができます。これによりアプリケーション内にロジックを作りこめば、警告のしくみを利用することが可能になります。
 エラーメッセージは [コンピュータ] を右クリックし、「すべてのタスク」- 「SQL Serverメッセージの管理」- [メッセージ] タブで、[新規] ボタンを押下して作成します。作成する際の注意点は以下の 2 点です。

  • エラーメッセージ番号は 50001 以上を指定する
     ‥ 50000 以下のエラー番号は SQL Server 2000 が使用/予約しています。

  • 言語はまず英語版を指定して作成し、その後必要であれば同じエラー番号で他言語を作成する
     ‥ SQL Server 2000 ではログインを作成する際に、そのログインが利用する既定の言語を決定します (画面 4-1)。

agent3-4-1.gif

画面 4-1 ログインの言語指定

もしそのログインが SQL Server 2000 を使用している場合、ログインに設定されている既定の言語 (デフォルトは Japanese) でメッセージを返しますが、その言語のメッセージが登録されていない場合は英語版を返すようになっています。

したがって英語版を作成せずに、他言語版のメッセージを作成しようとするとエラーになります(画面 4-2)。

agent3-4-2.gif

画面 4-2 英語版メッセージを先に作成しないとエラーになる

最低限、英語版メッセージを登録すれば画面 4-3のように英語版で表示しますし、同じ番号で日本語版メッセージを登録すれば既定の言語が Japanese であるログインに対しては画面 4-4 のように日本語版メッセージで表示します。

agent3-4-3.gif

画面 4-3 既定言語のメッセージが登録されていなければ英語版メッセージを返す

↓日本語版メッセージ登録

agent3-4-4.gif

画面 4-4 既定言語のメッセージが登録されていればその言語メッセージを返す

上記の画面 4-3、4-4 でも記述してありますが、ユーザー定義エラーは SQL Server 2000 から自動発生することはありません。したがってアプリケーションから Raiserror ステートメントで強制的に発生させる必要があります。

5. 動的なユーザー定義エラーメッセージの利用

ユーザー定義エラーは、4 でご紹介したような固定メッセージだけでなく、変数を利用して状況に合わせたメッセージを作成して利用することが可能です。英語版のメッセージは%付きの以下のコードや文字型で変数を定義します(表 5-1、画面 5-2)

コード

説明

結果を左寄せする

符号付きのデータの場合+/-をつける

0で埋める

空白

符号付きの正データに空白をつける

文字型

説明

d または i

符号付き整数

u

符号なし整数

s

文字列

5-1 動的なユーザー定義エラーメッセージで利用できるコードおよび文字型(抜粋)

agent3-5-2.gif

画面 5-2 動的な英語版メッセージの例

しかし他の言語版メッセージの場合は元のメッセージのパラメータに相当するパラメータ番号を使用します。各パラメータ番号の後に感嘆符 (!) を挿入します(画面 5-3)。

agent3-5-3.gif

画面 5-3 動的な日本語版メッセージの例

この動的なメッセージを利用する場合には、Raiserror ステートメントで代入パラメータを利用し、メッセージの変数に値を代入します(画面 5-4)。

agent3-5-4.gif

画面 5-4 代入パラメータを利用した Raiserror ステートメント

上記の例ではグローバル変数を 1 つ使用していますが、もちろんローカル変数も使えますし、代入パラメータの総数として 20 つまで利用することも可能です。

6. SQL Server パフォーマンス条件警告

Windows 2000 に SQL Server 2000 をインストールすると、システムモニタに SQL Server の利用状況を監視するための SQL Serverオブジェクト/カウンタ が登録されます。警告ではこのカウンタを利用して、しきい値に達したときに自動応答するためのしくみを提供することが可能です。この警告を SQL Server パフォーマンス条件警告と呼びます。

パフォーマンス条件警告を作成する場合には、[SQL Server エージェント] - [警告] を右クリックし、「新規警告」- [全般] タブの種類で SQL Server パフォーマンス条件警告を選択します。すると定義がパフォーマンス条件警告定義に切り替わるので、対象となるオブジェクト/カウンタ/しきい値を決定します。例えば販売データベースに対して、"1 秒あたりにデータベースに対して開始されたトランザクションの数が 50 より多い" というしきい値を設けたい場合は画面 6-1 のように指定します。

agent3-6-1.gif

画面 6-1 SQL Server パフォーマンス条件警告の定義例

応答は SQL Server イベント警告と同様にジョブ実行やオペレータへの通知が可能です。応答に関しては上記の 「3. SQL Server イベント警告」 で紹介しているので参考にしてください。また SQL Server 2000 ではバックグラウンドでシステムモニタを起動しておかなくても SQL Server パフォーマンス条件警告を利用することが可能です。

7. ジョブと警告のトラブルシューティング

ジョブと警告は、今までご紹介した様々な設定がうまくかみ合わないと思ったように動きません。ケースはいろいろとあると思いますが今までご紹介した内容を含め、基本的なポイントをまとめてみましたので参考にしてください。

ジョブが動かない場合 (ジョブヒストリにログが記録されていない)

  • SQL Server Agent が開始していない

    詳細は第 1 章の「2. SQL Server Agentの実行」 を復習してください。

  • ジョブが有効でない

    いくらスケジュールされていても、ジョブの [全般] タブや [ジョブスケジュールの編集] ウィンドウで 「有効(E)」 にチェックがついていなければ、ジョブは起動しません (画面 7-1)。

    agent3-7-1.gif

    画面 7-1 ジョブが有効であることを確認   [ 全般 ] タブ)

ジョブステップが失敗する場合(ジョブヒストリにログが記録されている)

警告が動かない

  • エラーが Windows 2000 アプリケーションログに格納されていない

       詳細は第 3 章の 「2. 警告を利用するための準備作業」 を復習してください。

  • 警告が有効でない

       警告の [全般] タブで 「有効(E)」 にチェックがついていなければ、ジョブは起動しません (画面 3-1)。

  • 応答の遅延が大きい

       応答の遅延を大きくすると、イベントが発生しても応答が指定された時間だけ遅延されます (画面 3-3)。

  • パフォーマンス条件警告のスパイク現象

       SQL Server Agent は 20 秒間隔でパフォーマンスカウンタを呼び出すためスパイク現象は検出しない可能性があります。

オペレータへの通知が失敗する場合

  • Net Send オペレータに通知しない

       Windows 2000 であれば Messenger サービスが開始されていないといけませんし、その他の OS であれば Messenger サービスと互換性があるアプリケーションが開始されている必要があります。

  • メールオペレータに通知しない

       詳細は第 1 章の 「6.メールオペレータの作成」 を復習してください。

8. まとめ

今回ご紹介したように SQL Server Agent はその機能を最大限に利用すると定期的な作業にかかる管理者の負担を最小限にすることが可能です。しかしあくまでも基盤を提供するだけなので、うまく作り込まないとせっかくの機能が台無しです。今までご存知だった方はもちろんご存知ない方も、ぜひ連載を参考にしていただいて "SQL Server Agent を有効に使いこなして" みてください。

sysbuild.jpg

鈴木 智行 : NEC Eラーニング事業部に所属。 入社以来、インストラクタとして教育業務に従事。汎用機、UNIX を経て、1994 年より マイクロソフト認定トレーナー (MCT) として、管理者向け教育を担当。SQL Server は 4.21a から携わっており、現在は主に SQL Server 2000 に関わるデータベース教育を中心に担当。Windows 2000 および SQL Server 2000 での MCSA, MCSE, MCDBA を取得しており、情報処理技術者試験のテクニカルエンジニア (データベース) も取得済。最近は MCA の 3 科目 (データベース、OS/ネットワーク、アプリケーション構築) 全てに合格し、C# を勉強中。