SQL Server Agent is een onderdeel dat wordt gebruikt voor de automatisering van databasetaken. We moeten bijvoorbeeld Index-onderhoud op productieservers alleen buiten kantooruren uitvoeren. We creëren dus een SQL Server-taak voor het uitvoeren van indexonderhoud en plannen dit voor "off" uren.
Wanneer we SQL Server installeren, is de SQL Server Agent-service uitgeschakeld. Eerst schakelen we het in en starten we het handmatig. Vervolgens configureren we de SQL Server-taak met behulp van SQL Server Management Studio en de door het systeem opgeslagen procedures van de MSDB-database.
In dit artikel wordt uitgelegd hoe u een SQL Server-taak maakt met behulp van de door het systeem opgeslagen procedures van de MSDB-database.
De door het systeem opgeslagen procedures van de MSDB-database
SQL Server gebruikt de volgende:
- sp_add_job :de procedure is voor het aanmaken van een nieuwe job. Als het succesvol is, retourneert het @job_id. De volgende argumenten zijn van toepassing:
- @job_name:het is een unieke functienaam.
- @enabled:Taak is in- of uitgeschakeld. Zodra een taak is gemaakt, kunt u de waarde van de parameter instellen op 1 om de taak in te schakelen.
- @notify_level_eventlog:deze parameter wordt gebruikt voor het schrijven van de status van de SQL-taak in de gebeurtenisviewer van Windows.
Waarde | Beschrijving |
0 | Het resultaat van de taak wordt niet naar het gebeurtenislogboek geschreven. |
1 | Als de taak succesvol wordt uitgevoerd, wordt het resultaat naar de gebeurtenisviewer geschreven |
2 (standaardwaarde) | Als de taak mislukt, worden het resultaat en de foutmelding naar de gebeurtenisviewer geschreven |
3 | Het resultaat van de taak wordt naar de gebeurtenisviewer geschreven. |
- @notify_level_email:deze parameter dient om de e-mail over het resultaat van de SQL-taak te verzenden. De geldige waarden van de parameter zijn hetzelfde als de @notify_level_eventlog argumentwaarden.
- @notify_level_page:deze parameter dient om de semafoonmelding van het resultaat van de SQL-taak te verzenden. De geldige waarden van de parameters zijn hetzelfde als de @notify_level_eventlog argumentwaarden.
- @delete_level:deze parameter dient om de taak na voltooiing te verwijderen. In dit geval moet de waarde van de parameter 1 zijn. Merk op dat de standaardwaarde 0 is; dan zal het de taak niet verwijderen na voltooiing.
- @category_level:deze parameter geeft de functiecategoriewaarden aan. De standaardwaarde is NULL.
- @owner_login_name:de waarde is de domeinnaam of de SQL-aanmeldingsnaam van de taakeigenaar.
2. Sp_add_jobserver: Deze opgeslagen procedure dient om de doelserver op te geven voor de uitvoering van de SQL-taak. De procedure accepteert de volgende argumenten:
- @job_id:Het is een UNIEKE IDENTIFICATIE VAN de SQL Job. De standaardwaarde van dit argument is NULL.
- @job_name:dit is de naam van de SQL-taak.
- @server_name:dit is de naam van de server waarop u de SQL-taak wilt uitvoeren. De standaardargumentwaarde kan de lokale server (LOCAL) of de hostnaam van de doelserver zijn.
- @job_name:de naam van de job waaraan je de stap toevoegt. Het is een SYSNAME met NULL als standaardwaarde.
- @step_name:de naam van de stap. Het is een SYSNAME met NULL als standaardwaarde.
- @step_id:De sequentiële ID van de taakstap. Het is een oplopend getal zonder tussenruimte. Het is een INT-waarde en de standaardwaarde is NULL.
- @cmdexec_success_code:deze waarde wordt geretourneerd door het CmdExec-subsysteem. Het geeft aan of de uitvoering van de opdracht succesvol was. De code is int-waarde met 0 als standaardwaarde.
- @on_sucess_action:deze waarde geeft de actie aan die moet worden uitgevoerd nadat de taakstap met succes is voltooid. De waarden kunnen een van de volgende zijn:
Waarde | Beschrijving |
1 | Stop de baan en keer succes terug |
2 | De taak beëindigen en terugsturen mislukt |
3 | Ga naar de volgende taakstap |
4 | Ga naar de stap-ID van on_success_step_id |
- @on_fail_action:specificeer welke actie moet worden uitgevoerd als de taakstappen mislukken. Het is een INT-waarde en de standaardwaarde is NULL.
- @retry_attempt:specificeer het aantal pogingen om het opnieuw te proberen nadat de taakstap is mislukt. Het is een INT-waarde en de standaardwaarde is NULL.
- @retry_interval:stel het tijdsinterval (minuten) in tussen twee mislukte SQL-taakstappen. Het is een INT-waarde en de standaardwaarde is NULL.
- @os_run_priority:
- @Subsystem:specificeer de naam van het subsysteem dat door SQL Server Agent wordt gebruikt om de opdracht uit te voeren. De geldige waarden zijn de volgende:
Subsysteemwaarde | Beschrijving |
CmdExec | Opdracht van het besturingssysteem of het uitvoerbare bestand (*.exe,*.bat) |
ANALYSEQUERY | SQL Server-analyseservicequery's, bijvoorbeeld MDX, DMX. |
ANALYSEQUERY | SQL Server-analyseserviceopdracht, bijvoorbeeld XMLA. |
SSIS | SQL Server-integratieservicepakket. |
PowerShell | PowerShell-opdracht of -script. |
T-SQL | T-SQL-query of opgeslagen procedure |
Distributie | SQL Server replicatie distributeur agent. |
Momentopname | SQL Server-replicatie snapshot-agent. |
LogReader | SQL Server replicatie Log reader agent. |
Wachtrijlezer | SQL Server replicatie wachtrijlezer. |
- @command:specificeer de opdracht die de SQL Server Agent Service moet uitvoeren via het subsysteem. Het gegevenstype is varchar(max) en de standaardwaarde is NULL.
- @Database_name:geef de naam op van de database waarin u de opdracht wilt uitvoeren. Deze parameter is handig wanneer u een T-SQL-script uitvoert met SQL Server Agent.
4. Sp_add_jobschedule: de opgeslagen procedure dient om het SQL-taakschema te maken. Deze procedure gebruikt de volgende argumenten:
- @job_name:specificeer de naam van de SQL Job. Het schema wordt gemaakt voor de SQL-taak die is opgegeven in het argument @job_name.
- @name:de naam van het schema. Het gegevenstype is varchar en de standaardwaarde is NULL.
- @enabled:stel 1 in om het schema in te schakelen of 0 om het schema uit te schakelen.
- @freq_type:geeft de tijd aan van de uitvoering van de SQL-taak. Het gegevenstype van de parameter is INT en de standaardwaarde is 0. De geldige waarden zijn een van de volgende:
Waarde | Beschrijving |
1 | De taak wordt slechts Een keer uitgevoerd. |
4 | Dagelijks. |
8 | Wekelijks |
16 | Maandelijks |
64 | Voer de taak uit wanneer de SQL Server Agent-service start |
128 | Voer de SQL-taak uit wanneer de server inactief is. |
- @freq_interval:geeft de dag van de uitvoering van de SQL-taak aan. Het gegevenstype is INT en de standaardwaarde is 0. De waarde hangt af van de waarde die is opgegeven in de parameter @freq_type. De geldige waarden zijn een van de volgende:
Waarde | Effect op het taakschema |
1 (eenmalig) | De @Freq_interval zal niet worden gebruikt. |
4 (dagelijks) | Elke @freq_interval dagen |
8 | De waarde van het @Freq_interval kan een van de volgende zijn: 1 =zondag 2 =maandag 4 =dinsdag 8 =woensdag 16 =donderdag 32 =vrijdag 64 =zaterdag |
16 | Voer de taak uit op de @Freq_interval dag van de maand |
64 | De @Freq_interval wordt niet gebruikt |
128 | De @Freq_interval wordt niet gebruikt |
- @freq_subday_type:specificeer de eenheid van het freq_subday_interval. Het gegevenstype is INT en de standaardwaarde is NULL.
- @active_start_date:stel de datum in waarop u de taakuitvoering wilt starten. Het gegevenstype is INT en heeft geen standaardwaarde. Het datumformaat is JJJJMMDD. De waarde moet groter of gelijk zijn aan 19000101.
- @active_end_date:specificeer de datum waarop de taakuitvoering moet worden gestopt. Het gegevenstype is INT, zonder standaardwaarde. Het datumformaat is JJJJMMDD en de waarde moet groter of gelijk zijn aan 19000101.
- @active_start_time:specificeer de tijd waarop u de taakuitvoering wilt starten. Het gegevenstype is INT, zonder een standaardwaarde. Het tijdformaat is HUMMSS.
- @active_end_time:specificeer de tijd waarop u de taakuitvoering wilt stoppen. Het gegevenstype is INT, zonder een standaardwaarde. Het tijdformaat is HUMMSS.
T-SQL-code om een SQL-taak aan te maken
Om de processen te illustreren gebruiken we de SQL Server 2019 op het werkstation met de AdventureWorks2017 database, hersteld vanaf een back-up. We maken een SQL-taak met de naam Dagelijkse volledige back-up – het genereert een back-up van de AdventureWorks2017 database en kopieert deze op C:\Backups locatie.
Eerst moeten we de Agent XP's inschakelen. Het is een geavanceerde optie. Daarom schakelen we eerst de geavanceerde configuratie-optie en de Agent XPs-component in.
Voer hiervoor de volgende query uit:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Zodra de Agent is ingeschakeld, starten we de Agent-service.
Open SQL Server Management Studio en maak verbinding met de SQL Server-instantie. Klik vervolgens met de rechtermuisknop op SQL Server Agent en klik op Start .
Na de start van de Agent kunnen we de SQL Server-agenttaken maken.
Zoals vermeld, zullen we een SQL-taak maken om een back-up te maken van AdventureWorks2017 databank. Hiervoor voeren we de volgende opdracht uit met SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Om een nieuwe SQL-taak met de naam Dagelijkse volledige back-up te maken, voer het volgende script uit:
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
Het zal de taak op mijn lokale werkstation uitvoeren. Daarom voegen we het toe aan de Job Server.
Voer de volgende vraag uit:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
De taakstap voert de back-updatabase uit opdracht. Gebruik de volgende code om de taakstap te configureren:
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
De SQL Job wordt dagelijks om 01:00 uur uitgevoerd. Gebruik de volgende code om het schema te configureren:
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
De volledige code van de taak is als volgt:
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
We voeren de taak eerst handmatig uit voor de demonstratie, door de onderstaande code uit te voeren:
use msdb
go
exec sp_start_job 'Daily Full Backup'
U kunt de status van de taak bekijken door de volgende query uit te voeren:
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'
Uitgang:
Om het back-upbestand te bekijken, opent u de C:\Backups locatie:
Zoals je kunt zien, is het back-upbestand gemaakt.