Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Skonfiguruj zadania SQL w SQL Server za pomocą T-SQL

SQL Server Agent to komponent służący do automatyzacji zadań bazodanowych. Na przykład musimy przeprowadzać konserwację indeksu na serwerach produkcyjnych tylko poza godzinami pracy. Dlatego tworzymy zadanie SQL Server polegające na prowadzeniu konserwacji indeksów i planujemy je na godziny „wyłączone”.

Kiedy instalujemy SQL Server, usługa SQL Server Agent jest wyłączona. Najpierw włączamy go i uruchamiamy ręcznie. Następnie konfigurujemy zadanie SQL Server, używając SQL Server Management Studio i systemowych procedur przechowywanych w bazie danych MSDB.

W tym artykule wyjaśniono, jak utworzyć zadanie SQL Server przy użyciu systemowych procedur przechowywanych w bazie danych MSDB.

Systemowe procedury składowane bazy danych MSDB

SQL Server używa następujących:

  1. sp_add_job :procedura służy do tworzenia nowej pracy. Jeśli się powiedzie, zwraca @job_id. Mają zastosowanie następujące argumenty:
  • @job_name:To unikalna nazwa pracy.
  • @enabled:zadanie jest włączone lub wyłączone. Po utworzeniu zadania możesz ustawić wartość parametru na 1, aby włączyć zadanie.
  • @notify_level_eventlog:Ten parametr jest używany do zapisywania stanu zadania SQL w przeglądarce zdarzeń Windows.
Wartość Opis
0 Wynik zadania nie zostanie zapisany w dzienniku zdarzeń.
1 Jeśli zadanie zostanie wykonane pomyślnie, wynik zostanie zapisany w przeglądarce zdarzeń
2 (wartość domyślna) Jeśli zadanie się nie powiedzie, wynik i komunikat o błędzie zostaną zapisane w przeglądarce zdarzeń
3 Wynik zadania jest zapisywany w przeglądarce zdarzeń.
  • @notify_level_email:Ten parametr służy do wysyłania wiadomości e-mail o wyniku zadania SQL. Prawidłowe wartości parametru są takie same jak wartości argumentu @notify_level_eventlog.
  • @notify_level_page:Ten parametr służy do wysyłania powiadomienia pagera o wyniku zadania SQL. Prawidłowe wartości parametrów są takie same jak wartości argumentów @notify_level_eventlog.
  • @delete_level:Ten parametr służy do usuwania zadania po zakończeniu. W takim przypadku wartość parametru powinna wynosić 1. Zauważ, że wartość domyślna to 0; wtedy nie usunie zadania po zakończeniu.
  • @category_level:Ten parametr wskazuje wartości kategorii stanowisk. Domyślna wartość to NULL.
  • @owner_login_name:wartością jest nazwa domeny lub nazwa logowania SQL właściciela zadania.

2. Sp_add_jobserver: Ta procedura składowana służy do określenia serwera docelowego do wykonania zadania SQL. Procedura akceptuje następujące argumenty:

  • @job_id:Jest to UNIKATOWY IDENTYFIKATOR zadania SQL. Domyślna wartość tego argumentu to NULL.
  • @nazwa_pracy:Jest to nazwa zadania SQL.
  • @nazwa_serwera:Jest to nazwa serwera, na którym chcesz uruchomić zadanie SQL. Domyślną wartością argumentu może być serwer lokalny (LOKALNY) lub nazwa hosta serwera docelowego.

3. sp_add_jobstep: Ta procedura składowana służy do dodawania kroku zadania w zadaniu SQL. Procedura wykorzystuje następujące argumenty:

  • @job_name:Nazwa pracy, w której dodajesz krok. Jest to SYSNAME z NULL jako wartością domyślną.
  • @step_name:nazwa kroku. Jest to SYSNAME z NULL jako wartością domyślną.
  • @step_id:sekwencyjny identyfikator kroku zadania. Jest to liczba przyrostowa bez przerwy. Jest to wartość INT, a domyślna wartość to NULL.
  • @cmdexec_success_code:Ta wartość jest zwracana przez podsystem CmdExec. Wskazuje, czy wykonanie polecenia powiodło się. Kod to wartość int z 0 jako wartością domyślną.
  • @on_sucess_action:Ta wartość wskazuje akcję, która powinna zostać wykonana po pomyślnym zakończeniu etapu zadania. Wartości mogą być dowolne z następujących:
Wartość Opis
1 Zakończ pracę i odnieś sukces
2 Zakończ pracę i powrót nie powiódł się
3 Przejdź do następnego kroku pracy
4 Przejdź do identyfikatora kroku on_success_step_id
  • @on_fail_action:określ, jakie działanie należy wykonać, jeśli etapy zadania nie powiodą się. Jest to wartość INT, a domyślna wartość to NULL.
  • @retry_attempt:określ liczbę ponownych prób po niepowodzeniu kroku zadania. Jest to wartość INT, a domyślna wartość to NULL.
  • @retry_interval:ustaw odstęp czasu (w minutach) między dwiema próbami niepowodzenia kroku zadania SQL. Jest to wartość INT, a domyślna wartość to NULL.
  • @os_run_priority:
  • @Podsystem:określ nazwę podsystemu używanego przez agenta SQL Server do wykonania polecenia. Prawidłowe wartości są następujące:
Wartość podsystemu Opis
CmdExec Polecenie systemu operacyjnego lub plik wykonywalny (*.exe,*.bat)
ZAPYTANIE ANALIZY Kwerendy usługi analizy SQL Server, na przykład MDX, DMX.
ZAPYTANIE ANALIZY Polecenie usługi analizy SQL Server, na przykład XMLA.
SSIS Pakiet usług integracji SQL Server.
PowerShell Polecenie lub skrypt PowerShell.
T-SQL Kwerenda T-SQL lub procedura składowana
Dystrybucja Agent dystrybutora replikacji SQL Server.
Migawka Agent migawek replikacji SQL Server.
LogReader Agent czytnika dzienników replikacji serwera SQL.
Kolejnik Czytnik kolejki replikacji SQL Server.
  • @command:określ polecenie, które usługa agenta SQL Server powinna wykonać za pośrednictwem podsystemu. Typ danych to varchar(max), a domyślna wartość to NULL.
  • @Nazwa_bazy_danych:Określ nazwę bazy danych, w której chcesz uruchomić polecenie. Ten parametr jest przydatny, gdy uruchamiasz skrypt T-SQL przy użyciu agenta serwera SQL.

4. Sp_add_jobschedule: procedura składowana służy do tworzenia harmonogramu zadań SQL. Ta procedura wykorzystuje następujące argumenty:

  • @nazwa_zadania:określ nazwę zadania SQL. Harmonogram zostanie utworzony dla zadania SQL określonego w argumencie @nazwa_pracy.
  • @name:nazwa harmonogramu. Typ danych to varchar, a domyślna wartość to NULL.
  • @enabled:ustaw 1, aby włączyć harmonogram lub 0, aby wyłączyć harmonogram.
  • @freq_type:wskazuje czas wykonania zadania SQL. Typ danych parametru to INT, a wartość domyślna to 0. Prawidłowe wartości to dowolne z poniższych:
Wartość Opis
1 Zadanie zostanie wykonane tylko raz.
4 Codziennie.
8 Co tydzień
16 Miesięcznie
64 Wykonaj zadanie po uruchomieniu usługi agenta SQL Server
128 Wykonaj zadanie SQL, gdy serwer jest bezczynny.
  • @freq_interval:wskazuje dzień wykonania zadania SQL. Typ danych to INT, a wartość domyślna to 0. Wartość zależy od wartości określonej w parametrze @freq_type. Prawidłowe wartości to dowolne z następujących:
Wartość Wpływ na harmonogram pracy
1 (raz) @Freq_interval nie będą używane.
4 (codziennie) Każdy @freq_interval dni
8 Wartość @Freq_interval może być jedną z następujących:
1 =niedziela
2 =poniedziałek
4 =wtorek
8 =środa
16 =czwartek
32 =piątek
64 =sobota
16 Uruchom zadanie na @Freq_interval dzień miesiąca
64 @Freq_interval nie będzie używany
128 @Freq_interval nie będzie używany
  • @freq_subday_type:określ jednostkę freq_subday_interval. Typ danych to INT, a wartość domyślna to NULL.
  • @active_start_date:ustaw datę rozpoczęcia wykonywania zadania. Typ danych to INT i nie ma wartości domyślnej. Format daty to RRRRMMDD. Wartość musi być większa lub równa 19900101.
  • @active_end_date:określ datę zatrzymania wykonywania zadania. Typ danych to INT, bez wartości domyślnej. Format daty to RRRRMMDD, a wartość musi być większa lub równa 19900101.
  • @active_start_time:określ czas, w którym chcesz rozpocząć wykonywanie zadania. Typ danych to INT, bez wartości domyślnej. Format czasu to GGMMSS.
  • @active_end_time:określ czas, w którym chcesz zatrzymać wykonywanie zadania. Typ danych to INT, bez wartości domyślnej. Format czasu to GGMMSS.

Kod T-SQL do tworzenia zadania SQL

Aby zilustrować procesy, używamy SQL Server 2019 na stacji roboczej z AdventureWorks2017 baza danych, przywrócona z kopii zapasowej. Tworzymy zadanie SQL o nazwie Codzienna pełna kopia zapasowa – generuje kopię zapasową AdventureWorks2017 i kopiuje ją do C:\Backups lokalizacja.

Najpierw musimy włączyć Agenta XP. Jest to opcja zaawansowana. Dlatego najpierw włączamy opcję zaawansowanej konfiguracji i komponent Agent XPs.

Aby to zrobić, uruchom następujące zapytanie:

EXEC Sp_configure 
  'Show advanced options', 
  1 

go 

RECONFIGURE WITH override 

EXEC Sp_configure 
  'Agent XPs', 
  1 

go 

RECONFIGURE WITH override 

Po włączeniu Agenta uruchamiamy usługę Agenta.

Otwórz SQL Server Management Studio i połącz się z instancją SQL Server. Następnie kliknij prawym przyciskiem myszy SQL Server Agent i kliknij Start .

Po uruchomieniu agenta możemy utworzyć zadania agenta SQL Server.

Jak wspomniano, utworzymy zadanie SQL, aby wygenerować kopię zapasową AdventureWorks2017 Baza danych. W tym celu uruchamiamy następujące polecenie za pomocą agenta serwera SQL.

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

Aby utworzyć nowe zadanie SQL o nazwie Codzienna pełna kopia zapasowa, wykonaj następujący skrypt:

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  

Wykona pracę na mojej lokalnej stacji roboczej. Dlatego dodajemy go do serwera zadań.

Wykonaj następujące zapytanie:

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

Etap zadania wykonuje bazę danych zapasowych Komenda. Aby skonfigurować etap zadania, użyj następującego kodu:

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 

Zadanie SQL będzie uruchamiane codziennie o godzinie 1:00. Aby skonfigurować harmonogram, użyj następującego kodu:

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 

Cały kod zadania wygląda następująco:

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 

Najpierw uruchamiamy zadanie ręcznie na potrzeby demonstracji, wykonując poniższy kod:

use msdb
go
exec sp_start_job 'Daily Full Backup'

Możesz wyświetlić stan zadania, uruchamiając następujące zapytanie:

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' 

Wyjście:

Aby wyświetlić plik kopii zapasowej, otwórz C:\Backups lokalizacja:

Jak widać, plik kopii zapasowej został utworzony.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalowanie Microsoft SQL Server 2012 Enterprise Edition z dodatkiem Service Pack 1

  2. Jak wstawić wartości do kolumny IDENTITY w SQL Server

  3. Popraw wydajność zapytań SQL Server na dużych tabelach

  4. Konwersja daty i kultura:różnica między DATE a DATETIME

  5. Czy każda tabela użytkowników powinna mieć indeks klastrowy?