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

T-SQLを使用してSQLServerでSQLジョブを構成する

    SQL Serverエージェントは、データベースタスクの自動化に使用されるコンポーネントです。たとえば、本番サーバーでインデックスのメンテナンスを実行する必要があるのは、営業時間外のみです。そのため、インデックスのメンテナンスを実行するSQL Serverジョブを作成し、「オフ」時間にスケジュールします。

    SQL Serverをインストールすると、SQLServerエージェントサービスが無効になります。まず、有効にして手動で起動します。次に、SQL Server Management StudioとMSDBデータベースのシステムストアドプロシージャを使用して、SQLServerジョブを構成します。

    この記事では、MSDBデータベースのシステムストアドプロシージャを使用してSQLServerジョブを作成する方法について説明します。

    MSDBデータベースのシステムストアドプロシージャ

    SQLServerは次のものを使用します。

    1. sp_add_job :手順は、新しいジョブを作成するためのものです。成功すると、@job_idを返します。次の議論が当てはまります:
    • @job_name:これは一意のジョブ名です。
    • @enabled:ジョブは有効または無効です。ジョブが作成されたら、パラメータの値を1に設定して、ジョブを有効にすることができます。
    • @notify_level_eventlog:このパラメーターは、WindowsイベントビューアーでSQLジョブのステータスを書き込むために使用されます。
    説明
    0 ジョブの結果はイベントログに書き込まれません。
    1 ジョブが正常に実行されると、結果がイベントビューアに書き込まれます
    2(デフォルト値) ジョブが失敗した場合、結果とエラーメッセージがイベントビューアに書き込まれます
    3 ジョブの結果はイベントビューアに書き込まれます。
    • @notify_level_email:このパラメーターは、SQLジョブの結果に関する電子メールを送信するのに役立ちます。パラメータの有効な値は、@notify_level_eventlog引数の値と同じです。
    • @notify_level_page:このパラメーターは、SQLジョブの結果のポケットベル通知を送信するのに役立ちます。パラメータの有効な値は、@notify_level_eventlog引数の値と同じです。
    • @delete_level:このパラメーターは、完了後にジョブを削除するのに役立ちます。この場合、パラメータの値は1である必要があります。デフォルト値は0であることに注意してください。その後、完了後にジョブが削除されることはありません。
    • @category_level:このパラメーターは、ジョブ・カテゴリーの値を示します。デフォルト値はNULLです。
    • @owner_login_name:値はドメイン名またはジョブ所有者のSQLログイン名です。

    2. Sp_add_jobserver: このストアドプロシージャは、SQLジョブ実行のターゲットサーバーを指定するのに役立ちます。このプロシージャは、次の引数を受け入れます。

    • @job_id:これはSQLジョブのUNIQUEIDENTIFIERです。この引数のデフォルト値はNULLです。
    • @job_name:SQLジョブの名前です。
    • @server_name:SQLジョブを実行するサーバーの名前です。デフォルトの引数値は、ローカルサーバー(LOCAL)またはターゲットサーバーのホスト名にすることができます。

    3。 sp_add_jobstep: このストアドプロシージャは、SQLジョブにジョブステップを追加するために機能します。この手順では、次の引数を使用します。

    • @job_name:ステップを追加するジョブの名前。これは、デフォルト値がNULLのSYSNAMEです。
    • @step_name:ステップの名前。これは、デフォルト値がNULLのSYSNAMEです。
    • @step_id:ジョブステップのシーケンシャルID。ギャップのない増分数です。これはINT値であり、デフォルト値はNULLです。
    • @cmdexec_success_code:この値はCmdExecサブシステムによって返されます。コマンドの実行が成功したかどうかを示します。コードはint値で、デフォルト値は0です。
    • @on_sucess_action:この値は、ジョブステップが正常に完了した後に実行する必要があるアクションを示します。値は次のいずれかになります。
    説明
    1 仕事を辞めて成功を返す
    2 ジョブを終了して戻ることができませんでした
    3 次のジョブステップに進みます
    4 on_success_step_idのステップIDに移動します
    • @on_fail_action:ジョブステップが失敗した場合に実行するアクションを指定します。これはINT値であり、デフォルト値はNULLです。
    • @retry_attempt:ジョブステップが失敗した後の再試行の回数を指定します。これはINT値であり、デフォルト値はNULLです。
    • @retry_interval:2回のSQLジョブステップの失敗試行間の時間間隔(分)を設定します。これはINT値であり、デフォルト値はNULLです。
    • @os_run_priority:
    • @Subsystem:SQLServerエージェントがコマンドを実行するために使用するサブシステムの名前を指定します。有効な値は次のとおりです。
    サブシステム値 説明
    CmdExec オペレーティングシステムコマンドまたは実行可能ファイル(* .exe、*。bat)
    分析クエリ SQL Server分析サービスクエリ(MDX、DMXなど)。
    分析クエリ SQL Server Analysis Serviceコマンド(XMLAなど)。
    SSIS SQLServer統合サービスパッケージ。
    PowerShell PowerShellコマンドまたはスクリプト。
    T-SQL T-SQLクエリまたはストアドプロシージャ
    配布 SQLServerレプリケーションディストリビューターエージェント。
    スナップショット SQLServerレプリケーションスナップショットエージェント。
    LogReader SQLServerレプリケーションログリーダーエージェント。
    キューリーダー SQLServerレプリケーションキューリーダー。
    • @command:SQLServerエージェントサービスがサブシステムを介して実行するコマンドを指定します。データ型はvarchar(max)で、デフォルト値はNULLです。
    • @Database_name:コマンドを実行するデータベースの名前を指定します。このパラメーターは、SQLServerエージェントを使用してT-SQLスクリプトを実行している場合に役立ちます。

    4. Sp_add_jobschedule: ストアドプロシージャは、SQLジョブスケジュールを作成するのに役立ちます。この手順では、次の引数を使用します。

    • @job_name:SQLジョブの名前を指定します。スケジュールは、@job_name引数で指定されたSQLジョブに対して作成されます。
    • @name:スケジュールの名前。データ型はvarcharで、デフォルト値はNULLです。
    • @enabled:スケジュールを有効にするには1に設定し、スケジュールを無効にするには0を設定します。
    • @freq_type:SQLジョブの実行時刻を示します。パラメータのデータ型はINTで、デフォルト値は0です。有効な値は次のいずれかです。
    説明
    1 ジョブは1回だけ実行されます。
    4 毎日。
    8 毎週
    16 毎月
    64 SQLServerエージェントサービスの開始時にジョブを実行します
    128 サーバーがアイドル状態のときにSQLジョブを実行します。
    • @freq_interval:SQLジョブの実行日を示します。データ型はINTで、デフォルト値は0です。値は@freq_typeパラメーターで指定された値によって異なります。有効な値は次のいずれかです。
    ジョブスケジュールへの影響
    1(1回) @Freq_interval 使用されません。
    4(毎日) すべての@freq_interval
    8 @Freq_intervalの値は、次のいずれかになります。
    1=日曜日
    2=月曜日
    4=火曜日
    8=水曜日
    16=木曜日
    32=金曜日
    64=土曜日
    16 @Freq_intervalでジョブを実行します 月の日
    64 @Freq_interval 使用されません
    128 @Freq_interval 使用されません
    • @freq_subday_type:freq_subday_intervalの単位を指定します。データ型はINTで、デフォルト値はNULLです。
    • @active_start_date:ジョブの実行を開始する日付を設定します。データ型はINTであり、デフォルト値はありません。日付形式はYYYYMMDDです。値は19900101以上である必要があります。
    • @active_end_date:ジョブの実行を停止する日付を指定します。データ型はINTで、デフォルト値はありません。日付形式はYYYYMMDDであり、値は19900101以上である必要があります。
    • @active_start_time:ジョブの実行を開始する時刻を指定します。データ型はINTで、デフォルト値はありません。時間形式はHHMMSSです。
    • @active_end_time:ジョブの実行を停止する時刻を指定します。データ型はINTで、デフォルト値はありません。時間形式はHHMMSSです。

    SQLジョブを作成するためのT-SQLコード

    プロセスを説明するために、 AdventureWorks2017を備えたワークステーションでSQLServer2019を使用します。 データベース、バックアップから復元。 Daily Full Backupという名前のSQLジョブを作成します AdventureWorks2017のバックアップを生成します データベースを作成し、 C:\ Backupsにコピーします 場所。

    まず、AgentXPを有効にする必要があります。これは高度なオプションです。したがって、最初に高度な構成オプションとAgentXPコンポーネントを有効にします。

    これを行うには、次のクエリを実行します。

    EXEC Sp_configure 
      'Show advanced options', 
      1 
    
    go 
    
    RECONFIGURE WITH override 
    
    EXEC Sp_configure 
      'Agent XPs', 
      1 
    
    go 
    
    RECONFIGURE WITH override 

    エージェントが有効になったら、エージェントサービスを開始します。

    SQL Server Management Studioを開き、SQLServerインスタンスに接続します。次に、SQL Serverエージェントを右クリックし、[開始]をクリックします。 。

    エージェントの開始後、SQLServerエージェントジョブを作成できます。

    前述のように、 AdventureWorks2017のバックアップを生成するSQLジョブを作成します データベース。このために、SQLServerエージェントを使用して次のコマンドを実行します。

    N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'

    Daily Full Backupという名前の新しいSQLジョブを作成するには 次のスクリプトを実行します:

    USE [msdb] 
    go 
    DECLARE @jobId BINARY(16) 
    
    EXEC msdb.dbo.Sp_add_job 
      @job_name=N'Daily Full Backup', 
      @enabled=1, 
      @notify_level_eventlog=0, 
      @notify_level_email=2, 
      @notify_level_page=2, 
      @delete_level=0, 
      @category_name=N'[Uncategorized (Local)]', 
      @owner_login_name=N'NISARG-PC\Nisarg', 
      @job_id = @jobId output 
    
    SELECT @jobId 
    go  

    ローカルワークステーションでジョブを実行します。したがって、それをJobServerに追加します。

    次のクエリを実行します:

    EXEC msdb.dbo.Sp_add_jobserver 
      @job_name=N'Daily Full Backup', 
      @server_name = N'NISARG-PC' 
    go 

    ジョブステップは、バックアップデータベースを実行します 指図。ジョブステップを構成するには、次のコードを使用します。

    USE [msdb] 
    go 
    
    EXEC msdb.dbo.Sp_add_jobstep 
      @job_name=N'Daily Full Backup', 
      @step_name=N'Generate Backup', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=1, 
      @on_fail_action=2, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, 
      @subsystem=N'TSQL', 
      @command= 
    N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression' 
    , 
    @database_name=N'master', 
    @flags=0 
    go 

    SQLジョブは毎日午前1時に実行されます。スケジュールを構成するには、次のコードを使用します。

    USE [msdb] 
    go 
    
    DECLARE @schedule_id INT 
    
    EXEC msdb.dbo.Sp_add_jobschedule 
      @job_name=N'Daily Full Backup', 
      @name=N'Run Backup At', 
      @enabled=1, 
      @freq_type=4, 
      @freq_interval=1, 
      @freq_subday_type=1, 
      @freq_subday_interval=0, 
      @freq_relative_interval=0, 
      @freq_recurrence_factor=1, 
      @active_start_date=20200918, 
      @active_end_date=99991231, 
      @active_start_time=10000, 
      @active_end_time=235959, 
      @schedule_id = @schedule_id output 
    
    SELECT @schedule_id 
    
    go 

    ジョブの全体的なコードは次のとおりです。

    USE [msdb] 
    go 
    
    DECLARE @jobId BINARY(16) 
    
    EXEC msdb.dbo.Sp_add_job 
      @job_name=N'Daily Full Backup', 
      @enabled=1, 
      @notify_level_eventlog=0, 
      @notify_level_email=2, 
      @notify_level_page=2, 
      @delete_level=0, 
      @category_name=N'[Uncategorized (Local)]', 
      @owner_login_name=N'NISARG-PC\Nisarg', 
      @job_id = @jobId output 
    
    SELECT @jobId 
    go 
    
    
    EXEC msdb.dbo.Sp_add_jobserver 
      @job_name=N'Daily Full Backup', 
      @server_name = N'NISARG-PC' 
    
    go 
    
    USE [msdb] 
    go 
    EXEC msdb.dbo.Sp_add_jobstep 
      @job_name=N'Daily Full Backup', 
      @step_name=N'Generate Backup', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=1, 
      @on_fail_action=2, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, 
      @subsystem=N'TSQL', 
      @command= 
    N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression' 
    , 
    @database_name=N'master', 
    @flags=0 
    go 
    
    USE [msdb] 
    go 
    
    DECLARE @schedule_id INT 
    
    EXEC msdb.dbo.Sp_add_jobschedule 
      @job_name=N'Daily Full Backup', 
      @name=N'Run Backup At', 
      @enabled=1, 
      @freq_type=4, 
      @freq_interval=1, 
      @freq_subday_type=1, 
      @freq_subday_interval=0, 
      @freq_relative_interval=0, 
      @freq_recurrence_factor=1, 
      @active_start_date=20200918, 
      @active_end_date=99991231, 
      @active_start_time=10000, 
      @active_end_time=235959, 
      @schedule_id = @schedule_id output 
    
    SELECT @schedule_id 
    go 

    以下のコードを実行して、最初にデモ用のジョブを手動で実行します。

    use msdb
    go
    exec sp_start_job 'Daily Full Backup'

    次のクエリを実行すると、ジョブのステータスを表示できます。

    SELECT  NAME 
                 AS [Job Name], 
                 CONVERT(VARCHAR, Dateadd(s, ( run_time / 10000 ) * 60 * 60 
                                             
                                             + ( ( run_time - ( run_time / 10000 ) * 
                                                              10000 ) / 
                                                 100 ) * 60 
                                             
                                             + ( run_time - ( run_time / 100 ) * 100 
                                               ), CONVERT(DATETIME, Rtrim(run_date), 113)), 100) 
                 AS 
                 [Job Executed Date and Time], 
                 CASE 
                   WHEN enabled = 1 THEN 'Enabled' 
                   ELSE 'Disabled' 
                 END 
                 [Job Status], 
                 CASE 
                   WHEN JobHistory.run_status = 0 THEN 'Failed' 
                   WHEN JobHistory.run_status = 1 THEN 'Succeeded' 
                   WHEN JobHistory.run_status = 2 THEN 'Retry' 
                   WHEN JobHistory.run_status = 3 THEN 'Cancelled' 
                   ELSE 'Unknown' 
                 END 
                 [Job Outcome] 
    FROM   sysjobhistory JobHistory 
           JOIN sysjobs Jobs 
             ON JobHistory.job_id = Jobs.job_id 
    WHERE  NAME = 'Daily Full Backup' 

    出力:

    バックアップファイルを表示するには、 C:\ Backupsを開きます 場所:

    ご覧のとおり、バックアップファイルが作成されています。


    1. MySQLiクエリのエラーを表示するにはどうすればよいですか?

    2. SQL:列の値が前の行から変更された行を選択する

    3. phpMyadminでの最大実行時間

    4. 個別のレコードに対するPIVOTクエリ