sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのアラートと演算子の使用

    はじめに

    SQL Serverとデータのすべての進歩により、アラートやオペレーターなどのネイティブSQLツールが引き続き利用できることは素晴らしいことです。これらは、SQLServerの自動化に関連する主要なSQLServerエージェントの機能です。

    彼らの役割は明らかです:

    • アラートは、構成時に、指定されたイベントが発生したときにデータベース管理者に通知します。
    • 演算子は、SQL Server内で定義されたオブジェクトであり、これらのイベントが発生したときに通知を受信できる人またはグループをマップします。

    イベントの種類

    SQL Serverは、イベントをWindowsアプリケーションログに記録します。オペレーティングシステムレベルのWindowsイベントビューアを介してアクセスできます。 SQL Serverエージェントは、アプリケーションログを読み取り、次の2つのカテゴリに一致する場合にアラートを発生させることができます。1)アプリケーションログに記録されたイベント2)管理者によって定義されたアラート。

    イベントには主に3つのタイプがあります:

    • SQLServerイベント
    • SQLServerのパフォーマンス条件
    • WMIイベント

    SQLServerイベントの作成

    SQL Serverエージェントの下のオブジェクトエクスプローラーで[アラート]ノードを右クリックして、SQLServerエージェントアラートの作成を開始します。これにより、図2に示すウィンドウが開き、アラートの名前、そのタイプ(この場合はSQL Serverイベントアラート)、データベーススコープ、およびアラート条件を指定します。

    条件を指定する最も簡単な方法は、重大度レベルを使用することです。また、SQL Serverのエラーメッセージの完全なリストを取得するには、sys.messagesにクエリを実行する必要があります。このビューには309408行が含まれているため、フィルターを使用することをお勧めします。そのため、クエリでは、コマンドを使用して英語をフィルター処理しました。


    図。 1.アラートノード

    -- Listing 1: SQL Server Error Messages
    use msdb
    go
    SELECT * FROM sys.messages where language_id=1033
    order by severity;

    図2.SQLServerイベントアラートの作成

    特定のエラーメッセージを使用してアラートをトリガーすることもできることに注意してください。前述のように、すべてのエラーメッセージはSQLServerカタログビューのsys.messagesに一覧表示されます。図2の画面では、イベント条件を選択しただけです。応答ページでは、このイベントがキャプチャされた場合に何が発生するかを選択できました。ご覧のとおり、ジョブを実行して応答を自動化するか、単にオペレーターに通知するかを選択できます。後でジョブの実行について説明しますが、今のところ、オペレーターが代替オプションを続行する必要がある理由を観察しましょう。同じウィンドウで演算子を作成しますが、既存の演算子がある場合は、リストからそれらを選択するだけで済みます。

    図3.応答の選択

    図4.演算子の定義

    図5.アラートチャネルの選択

    図5では、通知を送信するための媒体として電子メールを選択しています。データベースメールを正しく設定する必要があります。そうしないと、生成されたアラートがキューに残ります。 [新しいアラート]ウィンドウの3ページ目で、エラーメッセージを電子メール通知に含めるかどうか、および追加のメッセージを送信するかどうかを選択できます(たとえば、ジュニアDBAへの追加アクションに関する指示)。また、アラートが発生する間隔も決定します。デフォルト(0)のままにすると、オペレーターのメールボックスが短期間でアラートでいっぱいになるため、重要です。


    図6。 オプションの構成

    -- Listing 2: Creating a SQL Server Alert Using sp_add_alert
    USE [msdb]
    GO
    EXEC msdb.dbo.sp_add_alert @name=N'Alert_Insufficient_Resources_017',
    @message_id=0,
    @severity=17,
    @enabled=1,
    @delay_between_responses=900,
    @include_event_description_in=1,
    @job_id=N'00000000-0000-0000-0000-000000000000'
    GO
    EXEC msdb.dbo.sp_add_notification @alert_name=N'Alert_Insufficient_Resources_017', @operator_name=N'DatabaseAdmin', @notification_method = 1
    GO

    リスト2は、このアラートを実装するための同等のコードを示しています。 [OK]をクリックしてプロセスを完了すると、オブジェクトエクスプローラーのSQLServerエージェントノードにアラートとオペレーターの両方を表示できるようになります。

    図7.作成されたアラート

    SQLServerパフォーマンス条件アラートの作成

    代替ルートに移動して、パフォーマンス状態アラートを作成することもできます。例として、[データベース]>[ログ使用率カウンター]を選択します。ログファイルの使用率が75%を超えたときにイベントを生成するようにSQLServerに指示します。この場合、応答として「ジョブを実行する」を選択します。リスト3は、このジョブによって実行される主なタスクを示し、リスト4は、ジョブの完全な定義を示しています。

    図8.パフォーマンス状態アラート

    -- Listing 3: SQL Server Error Messages
    BACKUP LOG [DB1] TO DISK = N'E:\MSSQL\Backup\DBTransactionLog.bak'
    WITH RETAINDAYS = 90, NOFORMAT, NOINIT, NAME = N'DB1-TransactionLog Backup',
    SKIP, NOREWIND, NOUNLOAD, STATS = 10
    GO
    
    USE [DB1]
    GO
    DBCC SHRINKFILE (N'DB1_log' , 0, TRUNCATEONLY)
    GO
    
    
    -- Listing 4: Complete Definition of SQL Agent Backup Job
    USE [msdb]
    GO
    
    /****** Object: Job [DB1_BackupTransactionLog] Script Date: 27/11/2019 7:20:22 PM ******/
    BEGIN TRANSACTION
    DECLARE @ReturnCode INT
    SELECT @ReturnCode = 0
    
    /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 27/11/2019 7:20:23 PM ******/
    IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
    BEGIN
    EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    
    END
    
    DECLARE @jobId BINARY(16)
    EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'DB1_BackupTransactionLog',
    @enabled=1,
    @notify_level_eventlog=0,
    @notify_level_email=3,
    @notify_level_netsend=0,
    @notify_level_page=0,
    @delete_level=0,
    @description=N'Backup the Transaction Log for DB1 when Transaction Log usage exceeds 75%',
    @category_name=N'[Uncategorized (Local)]',
    @owner_login_name=N'DESKTOP-CT8K40N\kenne',
    @notify_email_operator_name=N'DatabaseAdmin', @job_id = @jobId OUTPUT
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    
    /****** Object: Step [Backup_Transaction_Log] Script Date: 27/11/2019 7:20:23 PM ******/
    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Backup_Transaction_Log',
    @step_id=1,
    @cmdexec_success_code=0,
    @on_success_action=3,
    @on_success_step_id=0,
    @on_fail_action=2,
    @on_fail_step_id=0,
    @retry_attempts=2,
    @retry_interval=15,
    @os_run_priority=0, @subsystem=N'TSQL',
    @command=N'-- Listing 3: SQL Server Error Messages
    BACKUP LOG [DB1] TO DISK = N''E:\MSSQL\Backup\DBTransactionLog.bak''
    WITH RETAINDAYS = 90, NOFORMAT, NOINIT, NAME = N''DB1-TransactionLog Backup'',
    SKIP, NOREWIND, NOUNLOAD, STATS = 10
    GO',
    @database_name=N'master',
    @flags=0
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    
    /****** Object: Step [DB1_Shrink_Transaction_Log_File] Script Date: 27/11/2019 7:20:23 PM ******/
    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'DB1_Shrink_Transaction_Log_File',
    @step_id=2,
    @cmdexec_success_code=0,
    @on_success_action=1,
    @on_success_step_id=0,
    @on_fail_action=2,
    @on_fail_step_id=0,
    @retry_attempts=2,
    @retry_interval=15,
    @os_run_priority=0, @subsystem=N'TSQL',
    @command=N'USE [DB1]
    GO
    DBCC SHRINKFILE (N''DB1_log'' , 0, TRUNCATEONLY)
    GO',
    @database_name=N'master',
    @flags=0
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    COMMIT TRANSACTION
    GOTO EndSave
    QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
    EndSave:
    GO

    図9.実行者へのジョブの作成

    この場合の応答はジョブの実行であるため、ジョブ自体にも通知を含めます。ジョブの作成が完了したら、オブジェクトエクスプローラーでアラートのプロパティを確認できます。イベントが発生した回数は履歴ページで確認できます。

    図10.アラートのオプション

    図11.アラート履歴ページ

    結論

    この記事では、アラートとオペレーターの作成について説明しました。 SQL Serverのこの強力な機能を利用して、サードパーティのツールを購入することなく、基本的なイベントを監視するための環境をセットアップできます。ジョブを使用して小さな問題を修正できる可能性は、SQLServer環境のプロアクティブな管理を実現するのに役立ちます。


    1. データベースインスタンスの状態を監視する方法

    2. VirtualBoxを使用してMacにSQLServerをインストールする方法

    3. Oracleで例外が発生した後もカーソルループ処理を続行する方法

    4. SELECT *ステートメントの列の順序-保証されていますか?