SQL Server Agent è un componente utilizzato per l'automazione delle attività del database. Ad esempio, dobbiamo eseguire la manutenzione dell'Indice sui server di produzione solo durante l'orario non lavorativo. Quindi, creiamo un processo di SQL Server per l'esecuzione della manutenzione dell'indice e lo pianifichiamo per le ore "off".
Quando installiamo SQL Server, il servizio SQL Server Agent è disabilitato. Innanzitutto, lo abilitiamo e lo avviamo manualmente. Quindi, configuriamo il processo di SQL Server, utilizzando SQL Server Management Studio e le stored procedure di sistema del database MSDB.
Questo articolo spiega come creare un processo di SQL Server utilizzando le stored procedure di sistema del database MSDB.
Le procedure memorizzate di sistema del database MSDB
SQL Server utilizza i seguenti:
- sp_add_job :la procedura è per creare un nuovo lavoro. Se ha esito positivo, restituisce @job_id. Sono applicabili i seguenti argomenti:
- @nome_lavoro:è un nome lavoro univoco.
- @enabled:il lavoro è abilitato o disabilitato. Una volta creato un lavoro, puoi impostare il valore del parametro su 1 per abilitare il lavoro.
- @notify_level_eventlog:questo parametro viene utilizzato per scrivere lo stato del processo SQL nel visualizzatore eventi di Windows.
Valore | Descrizione |
0 | Il risultato del lavoro non verrà scritto nel registro eventi. |
1 | Se il lavoro viene eseguito correttamente, il risultato verrà scritto nel visualizzatore di eventi |
2 (valore predefinito) | Se il lavoro non riesce, il risultato e il messaggio di errore verranno scritti nel visualizzatore di eventi |
3 | Il risultato del lavoro viene scritto nel visualizzatore di eventi. |
- @notify_level_email:questo parametro serve per inviare l'e-mail sull'esito del processo SQL. I valori validi del parametro sono gli stessi dei valori dell'argomento @notify_level_eventlog.
- @notify_level_page:questo parametro serve per inviare al pager la notifica dell'esito del processo SQL. I valori validi dei parametri sono gli stessi dei valori dell'argomento @notify_level_eventlog.
- @delete_level:questo parametro serve per eliminare il lavoro dopo il completamento. In questo caso, il valore del parametro dovrebbe essere 1. Si noti che il valore predefinito è 0; quindi, non cancellerà il lavoro dopo il completamento.
- @categoria_livello:questo parametro indica i valori della categoria di lavoro. Il valore predefinito è NULL.
- @nome_accesso_proprietario:il valore è il nome di dominio o il nome di accesso SQL del proprietario del lavoro.
2. Sp_add_jobserver: Questa procedura memorizzata serve a specificare il server di destinazione per l'esecuzione del processo SQL. La procedura accetta i seguenti argomenti:
- @job_id:è un IDENTIFICATORE UNICO del lavoro SQL. Il valore predefinito di questo argomento è NULL.
- @nome_lavoro:è il nome del lavoro SQL.
- @nome_server:è il nome del server su cui si desidera eseguire il lavoro SQL. Il valore dell'argomento predefinito può essere il server locale (LOCAL) o il nome host del server di destinazione.
- @nome_lavoro:il nome del lavoro in cui stai aggiungendo il passaggio. È un SYSNAME con NULL come valore predefinito.
- @nome_passo:il nome del passo. È un SYSNAME con NULL come valore predefinito.
- @step_id:l'ID sequenziale della fase del lavoro. È un numero incrementale senza spazi vuoti. È un valore INT e il valore predefinito è NULL.
- @cmdexec_success_code:questo valore viene restituito dal sottosistema CmdExec. Indica se l'esecuzione del comando è andata a buon fine. Il codice è un valore int con 0 come valore predefinito.
- @on_sucess_action:questo valore indica l'azione che deve essere eseguita dopo che la fase del lavoro è stata completata correttamente. I valori possono essere uno qualsiasi dei seguenti:
Valore | Descrizione |
1 | Lascia il lavoro e torna con successo |
2 | Esci dal lavoro e ritorno non riuscito |
3 | Vai al passaggio del lavoro successivo |
4 | Vai all'ID del passaggio di on_success_step_id |
- @on_fail_action:specifica quale azione eseguire se le fasi del lavoro falliscono. È un valore INT e il valore predefinito è NULL.
- @retry_attempt:specifica il numero di tentativi dopo la fase di lavoro non riuscita. È un valore INT e il valore predefinito è NULL.
- @retry_interval:imposta l'intervallo di tempo (minuti) tra due tentativi di errore del passaggio del processo SQL. È un valore INT e il valore predefinito è NULL.
- @os_run_priority:
- @Subsystem:specificare il nome del sottosistema utilizzato da SQL Server Agent per eseguire il comando. I valori validi sono i seguenti:
Valore del sottosistema | Descrizione |
CmdExec | Comando del sistema operativo o file eseguibile(*.exe,*.bat) |
QUERY DI ANALISI | Query del servizio di analisi di SQL Server, ad esempio MDX, DMX. |
QUERY DI ANALISI | Comando del servizio di analisi di SQL Server, ad esempio XMLA. |
SSIS | Pacchetto del servizio di integrazione di SQL Server. |
PowerShell | Comando o script di PowerShell. |
T-SQL | Query T-SQL o stored procedure |
Distribuzione | Agente di distribuzione della replica di SQL Server. |
Istantanea | Agente snapshot di replica di SQL Server. |
Lettore registro | Agente di lettura log di replica SQL Server. |
Queuerereader | Lettore della coda di replica di SQL Server. |
- @command:specifica il comando che il servizio SQL Server Agent deve eseguire tramite il sottosistema. Il tipo di dati è varchar(max) e il valore predefinito è NULL.
- @Nome_database:specificare il nome del database in cui si desidera eseguire il comando. Questo parametro è utile quando si esegue uno script T-SQL utilizzando SQL Server Agent.
4. Sp_add_jobschedule: la procedura memorizzata serve per creare la pianificazione del lavoro SQL. Questa procedura utilizza i seguenti argomenti:
- @nome_lavoro:specifica il nome del lavoro SQL. La pianificazione verrà effettuata per il lavoro SQL specificato nell'argomento @job_name.
- @name:il nome della pianificazione. Il tipo di dati è varchar e il valore predefinito è NULL.
- @enabled:imposta 1 per abilitare la pianificazione o 0 per disabilitare la pianificazione.
- @freq_type:indica l'ora di esecuzione del lavoro SQL. Il tipo di dati del parametro è INT e il valore predefinito è 0. I valori validi sono uno dei seguenti:
Valore | Descrizione |
1 | Il lavoro verrà eseguito solo una volta. |
4 | Giornaliero. |
8 | Settimanale |
16 | Mensile |
64 | Esegui il processo all'avvio del servizio SQL Server Agent |
128 | Esegui il lavoro SQL quando il server è inattivo. |
- @freq_interval:indica il giorno dell'esecuzione del lavoro SQL. Il tipo di dati è INT e il valore predefinito è 0. Il valore dipende dal valore specificato nel parametro @freq_type. I valori validi sono uno dei seguenti:
Valore | Effetto sulla pianificazione dei lavori |
1 (Una volta) | Il @Freq_interval non verrà utilizzato. |
4 (giornaliero) | Ogni @freq_interval giorni |
8 | Il valore di @Freq_interval può essere uno dei seguenti: 1 =domenica 2 =lunedì 4 =Martedì 8 =mercoledì 16 =giovedì 32 =venerdì 64 =sabato |
16 | Esegui il lavoro su @Freq_interval giorno del mese |
64 | Il @Freq_interval non verrà utilizzato |
128 | Il @Freq_interval non verrà utilizzato |
- @freq_subday_type:specifica l'unità di freq_subday_interval. Il tipo di dati è INT e il valore predefinito è NULL.
- @active_start_date:imposta la data in cui vuoi iniziare l'esecuzione del lavoro. Il tipo di dati è INT e non ha un valore predefinito. Il formato della data è AAAAMMGG. Il valore deve essere maggiore o uguale a 19900101.
- @active_end_date:specifica la data in cui interrompere l'esecuzione del lavoro. Il tipo di dati è INT, senza valore predefinito. Il formato della data è AAAAMMGG e il valore deve essere maggiore o uguale a 19900101.
- @active_start_time:specificare l'ora in cui si desidera avviare l'esecuzione del lavoro. Il tipo di dati è INT, senza un valore predefinito. Il formato dell'ora è HHMMSS.
- @active_end_time:specifica l'ora in cui vuoi interrompere l'esecuzione del lavoro. Il tipo di dati è INT, senza un valore predefinito. Il formato dell'ora è HHMMSS.
Codice T-SQL per creare un processo SQL
Per illustrare i processi, utilizziamo SQL Server 2019 sulla workstation con AdventureWorks2017 database, ripristinato da un backup. Creiamo un processo SQL denominato Backup completo giornaliero – genera un backup di AdventureWorks2017 database e lo copia su C:\Backups posizione.
Innanzitutto, dobbiamo abilitare gli Agent XP. È un'opzione avanzata. Pertanto, abilitiamo prima l'opzione di configurazione avanzata e il componente Agent XPs.
Per farlo, esegui la seguente query:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Una volta abilitato l'agente, avviamo il servizio dell'agente.
Aprire SQL Server Management Studio e connettersi all'istanza di SQL Server. Quindi, fare clic con il pulsante destro del mouse su SQL Server Agent e fare clic su Avvia .
Dopo l'avvio dell'agente, possiamo creare i lavori dell'agente di SQL Server.
Come accennato, creeremo un processo SQL per generare un backup di AdventureWorks2017 Banca dati. Per questo, eseguiamo il comando seguente utilizzando SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Per creare un nuovo processo SQL denominato Backup completo giornaliero eseguire il seguente 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
Eseguirà il lavoro sulla mia workstation locale. Pertanto, lo aggiungiamo al Job Server.
Esegui la seguente query:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
La fase del lavoro esegue il database di backup comando. Per configurare la fase del lavoro, utilizzare il codice seguente:
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
Il processo SQL verrà eseguito ogni giorno all'01:00. Per configurare la pianificazione, utilizzare il seguente codice:
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
L'intero codice del lavoro è il seguente:
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
Eseguiamo prima il lavoro manualmente per la dimostrazione, eseguendo il codice seguente:
use msdb
go
exec sp_start_job 'Daily Full Backup'
È possibile visualizzare lo stato del lavoro eseguendo la seguente query:
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'
Uscita:
Per visualizzare il file di backup, apri C:\Backup posizione:
Come puoi vedere, il file di backup è stato creato.