sql >> Database >  >> RDS >> Sqlserver

Configureer SQL-taken in SQL Server met T-SQL

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:

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

3. sp_add_jobstep: Deze opgeslagen procedure werkt voor het toevoegen van de taakstap in SQL Job. De procedure gebruikt de volgende argumenten:

  • @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.


  1. PostgreSQL-taakverdeling in de cloud gemakkelijk gemaakt

  2. Dynamische SQL (tabelnaam doorgeven als parameter)

  3. Voormalig Capgemini Executive, Sunitha Ray, sluit zich aan bij ScaleGrid DBaaS om Enterprise Sales uit te breiden

  4. Android Room Database, haal specifieke waarde op van het laatst ingevoerde record