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:
- 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.