sql >> Databasteknik >  >> RDS >> Sqlserver

Konfigurera SQL-jobb i SQL Server med T-SQL

SQL Server Agent är en komponent som används för automatisering av databasuppgifter. Till exempel behöver vi utföra indexunderhåll på produktionsservrar endast under icke kontorstid. Så vi skapar ett SQL Server-jobb för att köra indexunderhåll och schemalägger det för "off" timmar.

När vi installerar SQL Server är tjänsten SQL Server Agent inaktiverad. Först aktiverar vi det och startar det manuellt. Sedan konfigurerar vi SQL Server-jobbet med hjälp av SQL Server Management Studio och de systemlagrade procedurerna i MSDB-databasen.

Den här artikeln förklarar hur du skapar ett SQL Server Job med de systemlagrade procedurerna i MSDB-databasen.

Systemets lagrade procedurer för MSDB-databasen

SQL Server använder följande:

  1. sp_add_job :proceduren är för att skapa ett nytt jobb. Om det lyckas returneras @job_id. Följande argument är tillämpliga:
  • @job_name:Det är ett unikt jobbnamn.
  • @enabled:Jobbet är aktiverat eller inaktiverat. När ett jobb har skapats kan du ställa in parameterns värde som 1 för att aktivera jobbet.
  • @notify_level_eventlog:Den här parametern används för att skriva status för SQL-jobbet i Windows händelsevisare.
Värde Beskrivning
0 Resultatet av jobbet kommer inte att skrivas till händelseloggen.
1 Om jobbet körs framgångsrikt kommer resultatet att skrivas till händelsevisaren
2 (standardvärde) Om jobbet misslyckas kommer resultatet och felmeddelandet att skrivas till händelsevisaren
3 Resultatet av jobbet skrivs till händelsevisaren.
  • @notify_level_email:Denna parameter tjänar till att skicka e-postmeddelandet om SQL-jobbets resultat. De giltiga värdena för parametern är desamma som argumentvärdena för @notify_level_eventlog.
  • @notify_level_page:Denna parameter tjänar till att skicka personsökarmeddelandet om SQL-jobbets resultat. De giltiga värdena för parametrarna är desamma som argumentvärdena för @notify_level_eventlog.
  • @delete_level:Den här parametern används för att ta bort jobbet efter slutförandet. I det här fallet bör parameterns värde vara 1. Observera att standardvärdet är 0; då kommer det inte att radera jobbet efter att det är klart.
  • @category_level:Denna parameter anger jobbkategorivärdena. Standardvärdet är NULL.
  • @owner_login_name:Värdet är domännamnet eller jobbägarens SQL-inloggningsnamn.

2. Sp_add_jobserver: Denna lagrade procedur tjänar till att specificera målservern för SQL-jobbet. Proceduren accepterar följande argument:

  • @job_id:Det är en UNIQUEIDENTIFIER för SQL-jobbet. Standardvärdet för detta argument är NULL.
  • @job_name:Det är namnet på SQL-jobbet.
  • @servernamn:Det är namnet på servern där du vill köra SQL-jobbet. Standardargumentvärdet kan vara den lokala servern (LOCAL) eller målserverns värdnamn.

3. sp_add_jobstep: Denna lagrade procedur fungerar för att lägga till jobbsteget i SQL Job. Proceduren använder följande argument:

  • @job_name:Namnet på jobbet där du lägger till steget. Det är ett SYSNAME med NULL som standardvärde.
  • @step_name:Namnet på steget. Det är ett SYSNAME med NULL som standardvärde.
  • @step_id:Jobstegets sekventiella ID. Det är ett inkrementellt tal utan mellanrum. Det är ett INT-värde och standardvärdet är NULL.
  • @cmdexec_success_code:Detta värde returneras av CmdExec-undersystemet. Den indikerar om kommandokörningen lyckades. Koden är int-värde med 0 som standardvärde.
  • @on_sucess_action:Detta värde indikerar den åtgärd som ska utföras efter att jobbsteget har slutförts. Värdena kan vara något av följande:
Värde Beskrivning
1 Avsluta jobbet och få framgång
2 Avsluta jobbet och returneringen misslyckades
3 Gå till nästa jobbsteg
4 Gå till steg-id för on_success_step_id
  • @on_fail_action:ange vilken åtgärd som ska utföras om jobbstegen misslyckas. Det är ett INT-värde och standardvärdet är NULL.
  • @retry_attempt:ange antalet återförsök efter att jobbsteget misslyckats. Det är ett INT-värde och standardvärdet är NULL.
  • @retry_interval:ställ in tidsintervallet (minuter) mellan två felstegsförsök i SQL Job. Det är ett INT-värde och standardvärdet är NULL.
  • @os_run_priority:
  • @Subsystem:ange namnet på undersystemet som används av SQL Server Agent för att utföra kommandot. De giltiga värdena är följande:
Subsystemvärde Beskrivning
CmdExec Operativsystemkommandot eller den körbara filen(*.exe,*.bat)
ANALYSQUERY SQL-serveranalystjänstfrågor, till exempel MDX, DMX.
ANALYSQUERY SQL Server analystjänstkommando, till exempel XMLA.
SSIS SQL Server integrationstjänstpaket.
PowerShell PowerShell-kommando eller -skript.
T-SQL T-SQL-fråga eller lagrad procedur
Distribution SQL Server replikeringsdistributörsagent.
Ögonblicksbild SQL Server replikering ögonblicksbild agent.
LogReader SQL Server replikeringsloggläsare.
Köläsare SQL Server replikeringsköläsare.
  • @kommando:ange kommandot som SQL Server Agent Service ska köra genom undersystemet. Datatypen är varchar(max), och standardvärdet är NULL.
  • @Databasnamn:Ange namnet på databasen där du vill köra kommandot. Den här parametern är användbar när du kör ett T-SQL-skript med SQL Server Agent.

4. Sp_add_jobschedule: den lagrade proceduren tjänar till att skapa SQL-jobbschemat. Denna procedur använder följande argument:

  • @jobbnamn:ange namnet på SQL-jobbet. Schemat kommer att göras för SQL-jobbet som anges i argumentet @job_name.
  • @name:namnet på schemat. Datatypen är varchar och standardvärdet är NULL.
  • @enabled:ställ in 1 för att aktivera schemat eller 0 för att inaktivera schemat.
  • @freq_type:indikerar tidpunkten för SQL-jobbet. Datatypen för parametern är INT, och standardvärdet är 0. De giltiga värdena är något av följande:
Värde Beskrivning
1 Jobbet kommer endast att utföras en gång.
4 Dagligen.
8 Veckovis
16 Månatlig
64 Utför jobbet när SQL Server Agent Service startar
128 Kör SQL-jobbet när servern är inaktiv.
  • @freq_interval:indikerar dagen då SQL-jobbet körs. Datatypen är INT och standardvärdet är 0. Värdet beror på värdet som anges i parametern @freq_type. De giltiga värdena är något av följande:
Värde Effekt på jobbschemat
1 (en gång) @Freq_interval kommer inte att användas.
4 (Dagligen) Varje @freq_interval dagar
8 Värdet på @Freq_interval kan vara något av följande:
1 =söndag
2 =måndag
4 =tisdag
8 =onsdag
16 =torsdag
32 =fredag
64 =lördag
16 Kör jobbet på @Freq_interval dag i månaden
64 @Freq_interval kommer inte att användas
128 @Freq_interval kommer inte att användas
  • @freq_subday_type:ange enheten för freq_subday_interval. Datatypen är INT och standardvärdet är NULL.
  • @active_start_date:ställ in datumet då du vill starta jobbet. Datatypen är INT och den har inget standardvärde. Datumformatet är ÅÅÅÅMMDD. Värdet måste vara större eller lika med 19900101.
  • @active_end_date:ange datum då jobbet ska stoppas. Datatypen är INT, utan standardvärde. Datumformatet är ÅÅÅÅMMDD och värdet måste vara större eller lika med 19900101.
  • @active_start_time:ange den tidpunkt då du vill starta jobbkörningen. Datatypen är INT, utan ett standardvärde. Tidsformatet är HHMMSS.
  • @active_end_time:ange den tidpunkt då du vill stoppa jobbexekveringen. Datatypen är INT, utan ett standardvärde. Tidsformatet är HHMMSS.

T-SQL-kod för att skapa ett SQL-jobb

För att illustrera processerna använder vi SQL Server 2019 på arbetsstationen med AdventureWorks2017 databas, återställd från en säkerhetskopia. Vi skapar ett SQL-jobb som heter Daily Full Backup – det genererar en säkerhetskopia av AdventureWorks2017 databas och kopierar den på C:\Backups plats.

Först måste vi aktivera Agent XPs. Det är ett avancerat alternativ. Därför aktiverar vi först det avancerade konfigurationsalternativet och Agent XPs-komponenten.

För att göra det, kör följande fråga:

EXEC Sp_configure 
  'Show advanced options', 
  1 

go 

RECONFIGURE WITH override 

EXEC Sp_configure 
  'Agent XPs', 
  1 

go 

RECONFIGURE WITH override 

När agenten är aktiverad startar vi agenttjänsten.

Öppna SQL Server Management Studio och anslut till SQL Server-instansen. Högerklicka sedan på SQL Server Agent och klicka på Start .

Efter starten av agenten kan vi skapa SQL Server-agentjobben.

Som nämnts kommer vi att skapa ett SQL-jobb för att skapa en säkerhetskopia av AdventureWorks2017 databas. För detta kör vi följande kommando med SQL Server Agent.

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

För att skapa ett nytt SQL-jobb med namnet Daglig fullständig säkerhetskopiering, kör följande skript:

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  

Det kommer att utföra jobbet på min lokala arbetsstation. Därför lägger vi till den i jobbservern.

Kör följande fråga:

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

Jobbsteget kör säkerhetskopiadatabasen kommando. För att konfigurera jobbsteget, använd följande kod:

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-jobbet körs dagligen kl. 01:00. För att konfigurera schemat, använd följande kod:

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 

Hela koden för jobbet är som följer:

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 

Vi kör jobbet manuellt för demonstrationen först, genom att köra koden nedan:

use msdb
go
exec sp_start_job 'Daily Full Backup'

Du kan se status för jobbet genom att köra följande fråga:

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' 

Utdata:

För att visa säkerhetskopian, Öppna C:\Backups plats:

Som du kan se har säkerhetskopian skapats.


  1. MySQL maximal minnesanvändning

  2. Postgres:definiera ett standardvärde för CAST-fel?

  3. Hur kan SQL Workload Analysis hjälpa dig?

  4. Använder Room DB i biblioteksprojekt