sql >> Database teknologi >  >> RDS >> Sqlserver

Konfigurer SQL-job i SQL Server ved hjælp af T-SQL

SQL Server Agent er en komponent, der bruges til automatisering af databaseopgaver. For eksempel skal vi kun udføre indeksvedligeholdelse på produktionsservere uden for åbningstiderne. Så vi opretter et SQL Server-job med at køre indeksvedligeholdelse og planlægger det til "off" timer.

Når vi installerer SQL Server, er SQL Server Agent-tjenesten deaktiveret. Først aktiverer vi det og starter det manuelt. Derefter konfigurerer vi SQL Server-jobbet ved hjælp af SQL Server Management Studio og de systemlagrede procedurer i MSDB-databasen.

Denne artikel forklarer, hvordan du opretter et SQL Server-job ved hjælp af de systemlagrede procedurer i MSDB-databasen.

Systemets lagrede procedurer for MSDB-databasen

SQL Server bruger følgende:

  1. sp_add_job :proceduren er til oprettelse af et nyt job. Hvis det lykkes, returnerer det @job_id. Følgende argumenter er gældende:
  • @job_name:Det er et unikt jobnavn.
  • @enabled:Job er aktiveret eller deaktiveret. Når et job er oprettet, kan du indstille parameterens værdi som 1 for at aktivere jobbet.
  • @notify_level_eventlog:Denne parameter bruges til at skrive status for SQL Job i Windows hændelsesfremviser.
Værdi Beskrivelse
0 Resultatet af jobbet vil ikke blive skrevet til hændelsesloggen.
1 Hvis jobbet udføres med succes, vil resultatet blive skrevet til begivenhedsfremviseren
2 (standardværdi) Hvis jobbet mislykkes, vil resultatet og fejlmeddelelsen blive skrevet til begivenhedsfremviseren
3 Resultatet af jobbet skrives til begivenhedsfremviseren.
  • @notify_level_email:Denne parameter tjener til at sende e-mailen om SQL Job-resultatet. De gyldige værdier for parameteren er de samme som @notify_level_eventlog-argumentværdierne.
  • @notify_level_page:Denne parameter tjener til at sende personsøgermeddelelsen om SQL-jobresultatet. De gyldige værdier af parametrene er de samme som @notify_level_eventlog-argumentværdierne.
  • @delete_level:Denne parameter tjener til at slette jobbet efter fuldførelse. I dette tilfælde skal værdien af ​​parameteren være 1. Bemærk, at standardværdien er 0; så sletter den ikke jobbet efter fuldførelse.
  • @category_level:Denne parameter angiver jobkategoriværdierne. Standardværdien er NULL.
  • @owner_login_name:Værdien er domænenavnet eller jobejerens SQL-loginnavn.

2. Sp_add_jobserver: Denne lagrede procedure tjener til at specificere målserveren for SQL Job-udførelsen. Proceduren accepterer følgende argumenter:

  • @job_id:Det er en UNIQUEIDENTIFIER af SQL-jobbet. Standardværdien af ​​dette argument er NULL.
  • @job_name:Det er navnet på SQL-jobbet.
  • @server_name:Det er navnet på den server, hvor du vil køre SQL-jobbet. Standardargumentværdien kan være den lokale server (LOCAL) eller målserverens værtsnavn.

3. sp_add_jobstep: Denne lagrede procedure fungerer til at tilføje jobtrinnet i SQL Job. Proceduren bruger følgende argumenter:

  • @job_name:Navnet på det job, hvor du tilføjer trinnet. Det er et SYSNAME med NULL som standardværdi.
  • @step_name:Navnet på trinnet. Det er et SYSNAME med NULL som standardværdi.
  • @step_id:Det sekventielle ID for jobtrinnet. Det er et trinvist tal uden et mellemrum. Det er en INT-værdi, og standardværdien er NULL.
  • @cmdexec_success_code:Denne værdi returneres af CmdExec-undersystemet. Det angiver, om kommandoudførelsen var vellykket. Koden er int-værdi med 0 som standardværdi.
  • @on_sucess_action:Denne værdi angiver den handling, der skal udføres, efter at jobtrinnet er fuldført. Værdierne kan være en af ​​følgende:
Værdi Beskrivelse
1 Lyd jobbet og returner succes
2 Afslut jobbet og returnering mislykkedes
3 Gå til næste jobtrin
4 Gå til trin-id'et for on_success_step_id
  • @on_fail_action:Angiv, hvilken handling der skal udføres, hvis opgavetrinene mislykkes. Det er en INT-værdi, og standardværdien er NULL.
  • @retry_attempt:angiv antallet af genforsøg efter jobtrinsfejlen. Det er en INT-værdi, og standardværdien er NULL.
  • @retry_interval:Indstil tidsintervallet (minutter) mellem to SQL Job-trinfejlsforsøg. Det er en INT-værdi, og standardværdien er NULL.
  • @os_run_priority:
  • @Subsystem:Angiv navnet på det undersystem, der bruges af SQL Server Agent til at udføre kommandoen. De gyldige værdier er følgende:
Undersystemværdi Beskrivelse
CmdExec Operativsystemkommando eller den eksekverbare fil(*.exe,*.bat)
ANALYSEQUERY SQL-serveranalysetjenesteforespørgsler, f.eks. MDX, DMX.
ANALYSEQUERY SQL Server-analysetjenestekommando, for eksempel XMLA.
SSIS SQL Server integration servicepakke.
PowerShell PowerShell-kommando eller -script.
T-SQL T-SQL-forespørgsel eller lagret procedure
Distribution SQL Server-replikeringsdistributøragent.
Snapshot SQL Server-replikeringssnapshot-agent.
Loglæser SQL-serverreplikeringsloglæseragent.
Kølæser SQL Server-replikeringskølæser.
  • @kommando:angiv den kommando, som SQL Server Agent Service skal udføre gennem undersystemet. Datatypen er varchar(max), og standardværdien er NULL.
  • @Database_name:Angiv navnet på den database, hvor du vil køre kommandoen. Denne parameter er nyttig, når du kører et T-SQL-script ved hjælp af SQL Server Agent.

4. Sp_add_jobschedule: den lagrede procedure tjener til at oprette SQL-jobplanen. Denne procedure bruger følgende argumenter:

  • @job_name:Angiv navnet på SQL-jobbet. Tidsplanen vil blive lavet for det SQL-job, der er angivet i argumentet @job_navn.
  • @navn:navnet på tidsplanen. Datatypen er varchar, og standardværdien er NULL.
  • @enabled:Indstil 1 for at aktivere tidsplanen eller 0 for at deaktivere tidsplanen.
  • @freq_type:angiver tidspunktet for SQL-jobbets udførelse. Datatypen for parameteren er INT, og standardværdien er 0. De gyldige værdier er en af ​​følgende:
Værdi Beskrivelse
1 Opgaven vil kun blive udført én gang.
4 Dagligt.
8 Ugentligt
16 Månedligt
64 Udfør jobbet, når SQL Server Agent Service starter
128 Udfør SQL-jobbet, når serveren er inaktiv.
  • @freq_interval:angiver dagen for udførelse af SQL-jobbet. Datatypen er INT, og standardværdien er 0. Værdien afhænger af værdien angivet i parameteren @freq_type. De gyldige værdier er en af ​​følgende:
Værdi Effekt på jobplanen
1 (én gang) @Freq_interval vil ikke blive brugt.
4 (Dagligt) Hver @freq_interval dage
8 Værdien af ​​@Freq_interval kan være en af ​​følgende:
1 =søndag
2 =mandag
4 =tirsdag
8 =onsdag
16 =torsdag
32 =fredag
64 =lørdag
16 Kør jobbet på @Freq_interval dag i måneden
64 @Freq_interval vil ikke blive brugt
128 @Freq_interval vil ikke blive brugt
  • @freq_subday_type:angiv enheden for freq_subday_interval. Datatypen er INT, og standardværdien er NULL.
  • @active_start_date:Indstil datoen for, hvornår du vil starte jobudførelsen. Datatypen er INT, og den har ikke en standardværdi. Datoformatet er ÅÅÅÅMMDD. Værdien skal være større eller lig med 19900101.
  • @active_end_date:angiv datoen for, hvornår jobudførelsen skal stoppes. Datatypen er INT uden standardværdi. Datoformatet er ÅÅÅÅMMDD, og ​​værdien skal være større end eller lig med 19900101.
  • @active_start_time:Angiv det tidspunkt, hvor du vil starte jobudførelsen. Datatypen er INT, uden en standardværdi. Tidsformatet er HHMMSS.
  • @active_end_time:Angiv det tidspunkt, hvor du vil stoppe opgaven. Datatypen er INT, uden en standardværdi. Tidsformatet er HHMMSS.

T-SQL-kode til at oprette et SQL-job

For at illustrere processerne bruger vi SQL Server 2019 på arbejdsstationen med AdventureWorks2017 database, gendannet fra en sikkerhedskopi. Vi opretter et SQL-job med navnet Daglig fuld sikkerhedskopiering – det genererer en sikkerhedskopi af AdventureWorks2017 database og kopierer den på C:\Backups placering.

Først skal vi aktivere Agent XP'erne. Det er en avanceret mulighed. Derfor aktiverer vi først den avancerede konfigurationsindstilling og Agent XPs-komponenten.

For at gøre det skal du køre følgende forespørgsel:

EXEC Sp_configure 
  'Show advanced options', 
  1 

go 

RECONFIGURE WITH override 

EXEC Sp_configure 
  'Agent XPs', 
  1 

go 

RECONFIGURE WITH override 

Når agenten er aktiveret, starter vi agenttjenesten.

Åbn SQL Server Management Studio og opret forbindelse til SQL Server-instansen. Højreklik derefter på SQL Server Agent og klik på Start .

Efter starten af ​​agenten kan vi oprette SQL Server-agentjob.

Som nævnt vil vi oprette et SQL-job for at generere en backup af AdventureWorks2017 database. Til dette kører vi følgende kommando ved hjælp af SQL Server Agent.

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

For at oprette et nyt SQL-job med navnet Daglig fuld sikkerhedskopiering, udfør følgende script:

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 vil udføre jobbet på min lokale arbejdsstation. Derfor tilføjer vi det til jobserveren.

Udfør følgende forespørgsel:

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

Jobtrinnet udfører sikkerhedskopidatabasen kommando. For at konfigurere jobtrinnet skal du bruge følgende kode:

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ører dagligt kl. 01:00. For at konfigurere tidsplanen skal du bruge følgende kode:

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 

Hele koden for jobbet er som følger:

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ører jobbet manuelt til demonstrationen først ved at udføre koden nedenfor:

use msdb
go
exec sp_start_job 'Daily Full Backup'

Du kan se status for jobbet ved at køre følgende forespørgsel:

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' 

Output:

For at se backup-filen skal du åbne C:\Backups placering:

Som du kan se, er backup-filen blevet oprettet.


  1. Sådan fungerer EXP() i MariaDB

  2. SQLite GLOB

  3. Django, mod_wsgi, psycopg2 Ukorrekt konfigureret:Fejl ved indlæsning af psycopg2-modul:Intet modul med navnet _psycopg

  4. Postgres er den fedeste database – Årsag #1:Udviklere elsker det!