第 2 章 「ジョブによる管理作業の自動化」~ SQL Server エージェントを有効に使ってますか ? ~
NEC
Eラーニング事業部
鈴木 智行
2002 年 10 月 7 日
目次
1. ジョブの概要
2. ジョブの実行権限
3. ジョブステップとアクションフローロジックの設定
4. ジョブスケジューリングの設定
5. 通知先オペレータの設定
6. ジョブの監視
7. マルチサーバージョブ
8. ジョブとの連携
1. ジョブの概要
ジョブは SQLServer エージェントの中枢コンポーネントです。1 つ以上のタスクとスケジュールを定義すれば SQL Server がそのスケジュールに基づいてタスクを実行してくれます。それに加え、実行のたびにそれが正常終了したかどうかを監視することができたり、またローカルサーバーだけでなく複数のリモートサーバーで実行したり、定期的ではなく何かしらのイベントが発生したタイミングでも実行可能です。このようにジョブは管理者の手を煩わせずに管理作業の自動化を実現できます。
2. ジョブの実行権限
ジョブのタスクとして
Transact-SQL
オペレーティングシステムコマンド
ActiveX スクリプト
を登録することができますが、もちろん登録したタスクは権限がなければ実行できません。では誰の権限でタスクが実行されるかというと、ジョブの所有者が重要なファクターとなります。ジョブの所有者は [SQL Server エージェント] - [ジョブ] を右クリックし、「新規ジョブ」- [全般] タブで指定します(画面 2-1)。
画面 2-1 ジョブの所有者の指定
まず、Transact-SQL の場合の実行ユーザーは、画面 2-1で指定した所有者もしくは特定のユーザーをジョブステップ作成時の [詳細設定] タブで指定することができます(画面 2-2)。
画面 2-2 Transact-SQL の実行ユーザーの指定
ただしリモートコンピュータにバックアップする場合などは、上記に加え SQLServerAgent のサービスアカウントがリソースのアクセス許可をもっていないとジョブは失敗するので注意してください。
次にオペレーティングシステムコマンドおよび ActiveX スクリプトの場合の実行ユーザーはジョブの所有者が sysadmin 固定サーバーロールのメンバかどうかで異なります。 sysadmin 固定サーバーロールのメンバの場合は SQLServerAgent のサービスアカウントが適切な権限をもっている必要があります。
sysadmin 固定サーバーロールのメンバでない場合、デフォルトではジョブを実行できません。これは [SQL Server エージェント] を右クリックし、「プロパティ」- [ジョブシステム] タブで確認できます(画面2-3)。
画面 2-3 sysadmin 固定サーバーロールのメンバだけが実行可能
ただし Windows 管理者アカウントであれば sysadmin 固定サーバーロールのメンバ以外のユーザーにオペレーティングシステムコマンドおよび ActiveX スクリプトの実行を許可することができます。このユーザーのことを 「SQL Serverエージェントプロキシアカウント」 といい、画面 2-3 のチェックをはずすことでプロキシアカウントの設定が可能です(画面 2-4)。
画面 2-4 SQL Server エージェントプロキシアカウントの設定
この設定は xp_sqlagent_proxy_account 拡張システムストアドプロシージャでも設定することができます。SQL Server7.0 をご存知の方は SQLAgentCmdExec ユーザーアカウントの代替と考えてください。
3. ジョブステップとアクションフローロジックの設定
ジョブには 1 つ以上のタスクを定義することができ、このタスクのことを 「ジョブステップ」 といいます。ジョブステップは [SQL Server エージェント] - [ジョブ] を右クリックし、「新規ジョブ」- [ステップ] タブで [新規] ボタンを押下した後、タスクの種類を選択して指定します(画面 3-1)。
画面 3-1 ジョブステップの登録
また [詳細設定] タブでは各ジョブステップの成功時/失敗時の動作を規定することができ、状況に応じた適切な動作をするようにアクションフローロジックを決定できます(画面 3-2)。
画面 3-2 各ジョブステップの成功時/失敗時の動作の指定
例えば図 3-3のようなアクションフローロジックを設定したい場合には画面 3-4のようにジョブステップを指定します。
画面 3-3 アクションフローロジック
画面 3-4 図 3-3 のアクションフローロジックをジョブステップに実装
4. ジョブスケジューリングの設定
ジョブはスケジューリングによって定期的に実行することができます。しかも 1 つのジョブに対し複数のスケジュールを登録できるため、複雑なスケジュールも表現可能です。スケジュールは [SQL Server エージェント] - [ジョブ] を右クリックし、「新規ジョブ」- [スケジュール] タブで [新規スケジュール] ボタンを押下した後、スケジュールの種類を選択して指定します(画面 4-1)。
画面 4-1 スケジュールの登録
定期的や指定日時といった時間指定もできますが、SQLServerAgent の起動時や CPU のアイドル時といった独特なタイミングでの指定もできます。CPU のアイドル時という基準は CPU の平均使用量が 600 秒間に 10 % 以下というものであり、この基準は [SQL Server エージェント] を右クリックし、「プロパティ」- [詳細設定] タブで変更できます(画面4-2)。
画面 4-2 CPU のアイドル状態基準の変更
またジョブの実行タイミングは上記のスケジューリングだけでなく、警告が発生したタイミングや手動でも実行可能です。手動で実行する場合には実行したいジョブを右クリックし、「ジョブの開始」 メニューを選択します。警告については次回の第 3 章でご紹介します。
5. 通知先オペレータの設定
ジョブはスケジューリングにより自動実行されますから、管理者は特にジョブの実行に対して手を加えることはありません。しかし何もしなくていいわけでなく、最低限「スケジュールどおりにタスクが実行されたか」、「実行されたタスクが正常に終了したか」などのステータスを認識し、思わぬトラブルが発生した際には解決する必要があります。このようなステータスをジョブからオペレータにジョブの成功時/失敗時/完了時の状態に応じて第1章でご紹介した 3 種類のオペレータに通知することができます。通知によってその場にいなくてもタスクの状況を確認することが可能です。通知先オペレータは [SQL Server エージェント] - [ジョブ] を右クリックし、「新規ジョブ」- [通知] タブでオペレータの種類とジョブの状態を選択して指定します(画面 5-1)。
画面 5-1 通知先オペレータの設定
ジョブが成功したか、失敗したかは画面3-2の各ジョブステップの成功時/失敗時の動作の指定で決まります。すなわち"成功をレポートしジョブを終了する"であればジョブは成功ですし、"失敗をレポートしてジョブを終了する"であれば、ジョブは失敗という状態になります。ジョブ完了は成功/失敗のどちらの状態も含みます。
6. ジョブの監視
ジョブがスケジュールどおり実行して成功で終了すれば特に問題はありませんが、失敗に終わった場合はやはり管理者としてその原因を追求し、以降のトラブルを防ぐ対策を練る必要があります。そのためにジョブの監視は必須です。
例えば画面5-1の設定で"ジョブの失敗時"にNet Sendオペレータに通知をするように設定しました。この時、実際にジョブが失敗した場合にはNet Sendオペレータに画面6-1のようなメッセージが通知されます。
画面 6-1 Net Send オペレータへのジョブ失敗の通知
この通知では最終実行ジョブステップの情報はわかりますが、なぜジョブステップが失敗に終わったかはわかりません。この場合ジョブヒストリを利用します。ジョブヒストリは監視したいジョブを右クリックし、「ジョブヒストリの表示」メニューを選択します(画面6-2)。
画面 6-2 ジョブヒストリの表示
画面6-2の右上にある[詳細ステップを表示]にチェックすれば、ジョブステップの詳細情報やジョブステップのエラー/メッセージを表示することができます。このメッセージだけで根本の原因を発見できるかはわかりませんが、障害の切り分けには有効です。またこのジョブヒストリはたまる一方なので、ディスク容量を圧迫する可能性もあります。画面6-2で[すべて消去]を押下すればログを全件消去することもできますし、[SQL Server エージェント] を右クリックし、「プロパティ」-[ジョブシステム]タブでジョブヒストリのサイズの上限を決めることができます(画面6-3)。
画面 6-3 ジョブヒストリのサイズの上限設定
上限を決めておけば、最大サイズに達した場合にジョブヒストリは自動的に上書きされ、ジョブヒストリが無尽蔵に増加することを防ぐことができます。
7. マルチサーバージョブ
同じジョブを複数のSQLServerで実行したい場合はどうすればいいでしょうか?各SQL Serverにジョブをそれぞれ登録するのは非常に面倒な作業です。このような場合マルチサーバージョブを使用します。マルチサーバージョブを作成するためには、マルチサーバーの環境設定が必要になります。
マルチサーバー環境ではマスタサーバーと呼ばれるコンピュータでジョブを作成し、対象(ターゲット)サーバーにジョブ配布を行ってジョブ管理を行います(図7-1)。このとき各サーバーはSQLServerAgentのサービスアカウントで接続するので、同じドメインユーザーアカウントを使用できる条件が整っていなくてはいけません。
画面 7-1 マルチサーバー環境
マルチサーバー環境の設定には、まずマスタサーバー設定ウィザードを実行してマスタサーバーと1つ以上の対象サーバーを実装します。対象サーバーはマスタサーバーを作成した後に対象サーバー設定ウィザードを実行して追加可能です。このとき対象サーバーは同時に複数のマスタサーバーの配下に存在することはできないので注意してください。
マスタサーバーではジョブを作成するときに[全般]タブで「ローカルサーバーを対象とする」のか「複数のサーバーを対象とする」のか選択することができます(画面7-2)。「複数のサーバーを対象とする」を選択した場合には[変更]ボタンを押下することで、自分の配下に存在する対象サーバーの内、どのサーバーでマルチサーバージョブを実行するかを決定できます(画面7-3)。
画面 7-2 マルチサーバージョブの指定
↓ 変更ボタン押下
画面 7-3 対象サーバーの指定
マルチサーバー環境でも通知先オペレータの指定が可能ですが、異なるオペレータに通知したのでは管理が煩雑になります。そこでマスタサーバー設定ウィザードの実行中に共通のオペレータが自動的に作成されます。これをMSXOperatorといいます(画面7-4)。
画面 7-4 MSXOperator の指定画面
マルチサーバージョブはMSXOperatorに通知先を指定します(画面7-5)。
画面 7-5 MSXOperator の指定画面
8. ジョブとの連携
今までご紹介したように、ジョブはユーザーが任意に一から作成することができますが、SQL Enterprise Managerの以下のタスクはSQL Server Agentと連携し、スケジュールを設定するだけで、ジョブを自動生成することができます。
データベースの圧縮(画面8-1)
バックアップ(画面8-2)
データベース保守計画ウィザード
DTS
レプリケーション
画面 8-1 データベースの圧縮( SQL Enterprise Manager でのスケジュール設定)
画面 8-2 バックアップ( SQL Enterprise Manager でのスケジュール設定)
この場合、管理者はアクションフローロジックや通知先オペレータなどの詳細設定はジョブを直接編集しない限り不可能ですが、ジョブの作成方法やTransact-SQL等を知らなくても管理作業の自動化を実現することができます。ぜひこちらのインタフェースも役立ててください。
次回は最後のコンポーネントである警告についてご紹介します。もちろんジョブやオペレータも再度出てきますので復習しておいてください。
鈴木 智行 : NEC Eラーニング事業部に所属。 入社以来、インストラクタとして教育業務に従事。汎用機、UNIX を経て、1994 年より マイクロソフト認定トレーナー (MCT) として、管理者向け教育を担当。SQL Server は 4.21a から携わっており、現在は主に SQL Server 2000 に関わるデータベース教育を中心に担当。Windows 2000 および SQL Server 2000 での MCSA, MCSE, MCDBA を取得しており、情報処理技術者試験のテクニカルエンジニア (データベース) も取得済。最近は MCA の 3 科目 (データベース、OS/ネットワーク、アプリケーション構築) 全てに合格し、C# を勉強中。