Pracowałem nad kodem w T-SQL, aby dodać nowe harmonogramy do zadania agenta SQL przy użyciu sp_add_jobschedule proc w bazie danych msdb. Po dodaniu nowego harmonogramu (zwykle jednorazowego uruchomienia o określonej dacie / godzinie) i natychmiastowym przejrzeniu wartości w sysjobschedules i sysschedules, widzę, że nowy harmonogram został dodany i jest powiązany z id_zadania dla mojego agenta SQL praca. Jednak wartości dla next_run_date i next_run_time mają w nich 0. Kiedy wrócę i popatrzę na nich ponownie za 2 lub 3 minuty, nadal pokazują 0 w nich. Jednak gdy wrócę jeszcze 5 lub 10 minut później, teraz poprawnie pokazuje wartości daty i godziny odpowiadające następnemu zaplanowanemu uruchomieniu.
Więc moje pytania to:
- Jak często te wartości są aktualizowane?
- Jaki to proces aktualizuje te wartości?
- Gdybym miał dodać harmonogram, który miałby na przykład 1 minutę w przyszłości, czy to oznacza, że zadanie nie uruchomi się, ponieważ data / data następnej_czasu / czas nie zostały jeszcze zaktualizowane?
Przykład kodu, którego używam do dodania nowego harmonogramu:
exec msdb.dbo.sp_add_jobschedule @job_id = @jobID
, @name = @JobName
, @enabled = 1
, @freq_type = 1
, @freq_interval = 0
, @freq_subday_type = 0
, @freq_subday_interval = 0
, @freq_relative_interval = 0
, @freq_recurrence_factor = 0
, @active_start_date = @ScheduleRunDate
, @active_end_date = 99991231
, @active_start_time = @ScheduleRunTime
, @active_end_time = 235959
gdzie @jobID jest binarny (16), który przechowuje id_zadania dla danego zadania, @ScheduleRunDate i @ScheduleRunTime są odpowiednio INT z datą i godziną.
Odpowiedzi:
Krótka odpowiedź
Wygląda na to, że dane w
msdb.dbo.sysjobschedules
są aktualizowane przez wątek w tle w SQL Agent, identyfikowany jakoSQLAgent - Schedule Saver
co 20 minut (lub rzadziej, jeślixp_sqlagent_notify
nie został wywołany i w międzyczasie nie uruchomiono żadnych zadań).W celu uzyskania bardziej dokładnych informacji, spójrz na
next_scheduled_run_date
INmsdb.dbo.sysjobactivity
. Jest on aktualizowany w czasie rzeczywistym za każdym razem, gdy zadanie zostanie zmienione lub zadanie zostanie uruchomione. Jako dodatkowy bonus,sysjobactivity
przechowuje dane we właściwy sposób (jako kolumnę daty i godziny), co znacznie ułatwia pracę z tymi głupimi INT.Oto krótka odpowiedź:
Długa odpowiedź
Jeśli chcesz przez chwilę podążać za królikiem, kiedy zadzwonisz
sp_add_jobschedule
, ten łańcuch wydarzeń zostanie uruchomiony:Teraz nie możemy już gonić królika, ponieważ nie możemy tak naprawdę zajrzeć do tego, co
xp_sqlagent_notify
robi. Ale myślę, że możemy założyć, że ta rozszerzona procedura współdziała z usługą agenta i informuje ją, że nastąpiła zmiana w tym konkretnym zadaniu i harmonogramie. Po uruchomieniu śledzenia po stronie serwera możemy natychmiast zobaczyć, że następujący dynamiczny SQL jest wywoływany przez agenta SQL:Wygląda na
sysjobactivity
to, że jest aktualizowany natychmiast isysjobschedules
jest aktualizowany tylko zgodnie z harmonogramem. Jeśli zmienimy nowy harmonogram na raz dziennie, npNadal widzimy natychmiastową aktualizację do
sysjobactivity
powyższej, a następnie kolejną aktualizację po zakończeniu zadania. Różne aktualizacje pochodzą z tła i innych wątków w SQL Agent, np .:W końcu pojawia się wątek (wątek „Schedule Saver”) i aktualizuje się
sysjobschedules
; z mojego wstępnego dochodzenia wydaje się, że odbywa się to co 20 minut i dzieje się tak tylko wtedy, gdyxp_sqlagent_notify
został wywołany ze względu na zmianę wprowadzoną w zadaniu od ostatniego uruchomienia (nie wykonałem żadnych dalszych testów, aby zobaczyć, co się stanie, jeśli jedno zadanie zostało wykonane zmieniono i uruchomiono inny, jeśli wątek „Schedule Saver” zaktualizuje oba - podejrzewam, że musi, ale pozostawi to jako ćwiczenie czytelnikowi).Nie jestem pewien, czy 20-minutowy cykl jest przesunięty w stosunku do momentu uruchomienia agenta SQL, czy od północy, czy od czegoś specyficznego dla maszyny. W dwóch różnych instancjach na tym samym serwerze fizycznym wątek „Schedule Saver” został zaktualizowany
sysjobschedules
, w obu instancjach, prawie dokładnie w tym samym czasie - 18:31:37 i 18:51:37 na jednym oraz 18:31:39 & 18:51:39 z drugiej strony. Nie uruchomiłem agenta programu SQL Server w tym samym czasie na tych serwerach, ale istnieje zdalna możliwość, że czasy rozpoczęcia były przesunięte o 20 minut. Wątpię, ale nie mam teraz czasu na potwierdzenie, uruchamiając ponownie Agenta na jednym z nich i czekając na kolejne aktualizacje.Wiem, kto to zrobił, i kiedy to się stało, ponieważ umieściłem tam spust i złapałem go, na wypadek, gdy nie mogłem go znaleźć w śladzie lub przypadkowo go odfiltrowałem.
To powiedziawszy, nie jest trudno złapać za pomocą standardowego śledzenia, ten pojawia się nawet jako niedynamiczny DML:
Jeśli chcesz uruchomić bardziej przefiltrowane dane śledzenia w celu śledzenia tego zachowania w czasie (np. Utrzymywanie się przez SQL Agent uruchamia się ponownie zamiast na żądanie), możesz uruchomić taki, który ma appname =
'SQLAgent - Schedule Saver'
...Myślę więc, że jeśli chcesz natychmiast poznać następny czas wykonywania, spójrz na
sysjobactivity
niesysjobschedules
. Ta tabela jest aktualizowana bezpośrednio przez Agenta lub jego wątki w tle („Aktualizuj aktywność zadania”, „Menedżer zadań” i „Mechanizm wywoływania zadań”) w miarę występowania aktywności lub powiadamiania przez niąxp_sqlagent_notify
.Pamiętaj jednak, że bardzo łatwo jest zrównać obie tabele - ponieważ nie ma żadnych zabezpieczeń przed usunięciem danych z tych tabel. (Jeśli na przykład zdecydujesz się wyczyścić, możesz łatwo usunąć wszystkie wiersze dla tego zadania z tabeli działań.) W tym przypadku nie jestem do końca pewien, w jaki sposób SQL Server Agent pobiera lub zapisuje datę następnego uruchomienia. Być może warte dalszych badań w późniejszym terminie, kiedy będę miał trochę wolnego czasu ...
źródło
msdb.dbo.sp_help_job
zawsze wydaje się zwracać poprawne rzeczywistenext_run_date
/next_run_time
.Używa
sp_get_composite_job_info
, który wykonuje następujące wywołanie, aby faktycznie pobraćnext_run_date/time
.Ponieważ
sysjobschedule
wydaje się niewiarygodne, po prostu skorzystamsp_help_job
.źródło