To jedno z najczęściej zadawanych pytań dotyczących harmonogramu. Tutaj przedstawiamy niektóre z typowych problemów i ich rozwiązania.
1) job_queue_processes może być za mało (jest to najczęstszy problem) Wartość job_queue_processes ogranicza łączną liczbę zadań dbms_schedule i dbms_job, które mogą być uruchomione w danym czasie. Aby sprawdzić, czy tak jest, sprawdź aktualną wartość job_queue_processes withSQL> wybierz wartość z v$parametr gdzie name='job_queue_processes';Następnie sprawdź liczbę uruchomionych zadańSQL> select count() z dba_scheduler_running_jobs;SQL> select count( ) z dba_jobs_running;
Jeśli to jest problem, możesz zwiększyć parametr za pomocą SQL> zmień zestaw systemowy job_queue_processes=1000;
2) max_job_slave_processes może być zbyt niski Jeśli ten parametr nie ma wartości NULL, to ogranicza liczbę zadań dbms_scheduler, które mogą być uruchomione w tym samym czasie. Aby sprawdzić, czy na tym polega problem, sprawdź bieżącąwartość usingSQL> wybierz wartość z dba_scheduler_global_attributewhere attribute_name='MAX_JOB_SLAVE_PROCESSES';Następnie sprawdź liczbę uruchomionych zadańSQL> wybierz count(*) z dba_scheduler_running_jobs;
Jeśli to jest problem, możesz zwiększyć liczbę lub po prostu ją zerować, używając SQL> exec dbms_scheduler.set_scheduler_attribute('max_job_slave_processes',null)
3) sesje mogą być za małeTen parametr ogranicza liczbę sesji w dowolnym momencie. Każde zadanie harmonogramu wymaga 2 sesji. Aby sprawdzić, czy to jest problem, sprawdź bieżącą wartość za pomocą SQL> select value from v$parameter gdzie name='sessions';Następnie sprawdź aktualną liczbę sesji za pomocą SQL> select count(*) from v$session;
Jeśli liczby są zbyt zbliżone, możesz zwiększyć maksimum za pomocą SQL> zmień zestaw systemowy job_queue_processes=200;
4) Czy ostatnio zastosowałeś poprawkę aktualizującą strefę czasową lub zaktualizowałeś bazę danych do wersji z nowszymi informacjami o strefie czasowej? Jeśli podczas aktualizacji informacji o strefie czasowej pominięto jakiekolwiek kroki, zadania mogą nie zostać uruchomione. Aby sprawdzić, czy tak jest, spróbuj zrobićSQL> wybierz * z sys.scheduler$_job;andSQL> wybierz * z sys.scheduler$_window;i upewnij się, że kończą się bez błędów.
Jeśli wyświetli ostrzeżenie o strefie czasowej, ponownie zastosuj aktualizację lub poprawkę strefy czasowej, upewniając się, że wykonałeś wszystkie kroki.
5) Czy baza danych działa w trybie zastrzeżonym ?Jeżeli baza danych działa w trybie zastrzeżonym, żadne zadania nie zostaną uruchomione (chyba że używasz 11g i używasz atrybutu ALLOW_RUNS_IN_RESTRICTED_MODE). Aby to sprawdzić użyjSQL> wybierz loginy z v$instance;
Jeśli logowanie jest ograniczone, możesz wyłączyć ten tryb za pomocą SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;
6) Czy zaplanowano uruchomienie zadania na instancji, która nie działa?
Możesz to sprawdzić, sprawdzając, czy dla zadania jest ustawiony instance_id (sprawdź widok dba_scheduler_jobs), a jeśli tak, sprawdź, czy ta instancja działa.
7) Czy zaplanowano uruchomienie zadania w usłudze, która nie została uruchomiona na żadnej instancji?
Możesz to sprawdzić, sprawdzając, na którą klasę job_class zadanie wskazuje, a następnie sprawdzając, czy ta klasa wskazuje na usługę. Jeśli tak, upewnij się, że usługa została uruchomiona na co najmniej jednym uruchomionym wystąpieniu. Możesz uruchomić usługę na instancji za pomocą dbms_service.start_service.
8) Czy Menedżer zasobów obowiązuje z restrykcyjnym planem zasobów?
Jeśli obowiązuje restrykcyjny plan zasobów, zadania programu planującego mogą nie mieć przydzielonych wystarczających zasobów, więc mogą nie działać. Możesz sprawdzić, jaki plan zasobów obowiązuje, wykonując
SQL> wybierz nazwę z V$RSRC_PLAN;
Jeśli żaden plan nie obowiązuje lub obowiązuje plan INTERNAL_PLAN, oznacza to, że menedżer zasobów nie działa. Jeśli menedżer zasobów działa, możesz go wyłączyć, wykonując
SQL>zmień zestaw systemowy resource_manager_plan ='';
9) Czy harmonogram został wyłączony? Nie jest to akcja wspierana, ale możliwe, że i tak ktoś to zrobił. Aby sprawdzić ten doSQL> wybierz wartość z dba_scheduler_global_attribute gdzie attribute_name='SCHEDULER_DISABLED'
Jeśli to zapytanie zwróci TRUE, możesz to naprawić za pomocą SQL> exec dbms_scheduler.set_scheduler_attribute('scheduler_disabled','false');
Powody, dla których zadania mogą się opóźniać
1) Pierwszą rzeczą do sprawdzenia jest strefa czasowa, w której zadanie jest zaplanowane w SQL> select owner, job_name, next_run_date from dba_scheduler_jobs;
Jeśli zadania znajdują się w niewłaściwej strefie czasowej, mogą nie działać w oczekiwanym czasie. Jeśli next_run_date używa bezwzględnego przesunięcia strefy czasowej (np. +08:00) zamiast nazwanej strefy czasowej (np. US/PACIFIC), zadania mogą nie działać zgodnie z oczekiwaniami, jeśli obowiązuje czas letni — mogą działać co godzinę lub późno.
2) Może się zdarzyć, że w czasie, gdy zaplanowano uruchomienie zadania, jeden z kilku powyższych limitów mógł zostać tymczasowo osiągnięty, powodując opóźnienie zadania. Sprawdź, czy powyższe limity są wystarczająco wysokie i jeśli to możliwe, sprawdź je w czasie, gdy praca jest opóźniona.
3) Jednym z możliwych powodów, dla których jeden z powyższych limitów może zostać osiągnięty, jest to, że mogło wejść w życie okno konserwacji. Okna obsługi to okna OracleScheduler należące do grupy okien o nazwie MAINTENANCE_WINDOW_GROUP. Podczas zaplanowanego okna konserwacji kilka zadań konserwacyjnych jest uruchamianych przy użyciu zadań. Może to spowodować przekroczenie jednego z wymienionych powyżej limitów i opóźnienie zadań użytkownika. Więcej informacji na ten temat znajdziesz w przewodniku administratora (rozdział 24).
Aby uzyskać listę okien obsługi, użyj SQL> wybierz * z dba_scheduler_wingroup_members;
Aby zobaczyć, kiedy system Windows działa użyj SQL> wybierz * z dba_scheduler_windows;
Aby to naprawić, możesz zwiększyć limity lub przełożyć okna konserwacji, aby działały w bardziej dogodnych porach.
Diagnozowanie innych problemów
Jeśli nic z tego nie działa, oto kilka dalszych kroków, które możesz podjąć, aby spróbować dowiedzieć się, co się dzieje.
1) Sprawdź, czy w dzienniku alertów nie ma błędów. Jeśli baza danych ma problemy z alokacją pamięci, zabrakło miejsca na dysku lub wystąpiły inne katastrofalne błędy, należy je najpierw rozwiązać. Lokalizację dziennika alertów można znaleźć za pomocą SQL> select value z v$parameter gdzie name ='background_dump_dest';Dziennik alertów będzie w tym katalogu z nazwą zaczynającą się od "alert".
2) Sprawdź, czy koordynator zadania śledzi plik, a jeśli tak, sprawdź, czy nie zawiera błędów. Jeśli takowy istnieje, zostanie umieszczony w katalogu 'background_dump_dest', który możesz znaleźć jak powyżej i będzie wyglądał podobnie do SID-cjq0_nnnn.trc . Jeśli są tu jakieś błędy, mogą sugerować, dlaczego zadania nie są uruchomione.
3) Jeśli jedno z powyższych wskazuje, że obszar tabel SYSAUX (w którym program planujący przechowuje swoje tabele rejestrowania) jest pełny, możesz użyć procedury dbms_scheduler.purge_log, aby wyczyścić stare wpisy dziennika.
4) Sprawdź, czy aktualnie jest otwarte okno. Jeśli tak, możesz spróbować je zamknąć, aby sprawdzić, czy to pomoże.
SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where
attribute_name='CURRENT_OPEN_WINDOW';
SQL> exec DBMS_SCHEDULER.close_window ('WEEKNIGHT_WINDOW');
5)spróbuj uruchomić proste zadanie jednorazowego użytku i sprawdź, czy działa
SQL>begin
dbms_scheduler.create_job (
job_name => 'test_job',
job_type => 'plsql_block',
job_action => 'null;',
enabled => true);
end;
/
SQL> -- wait a while
SQL> select * from user_scheduler_job_run_details where job_name='TEST_JOB';
6) Jeśli proste zadanie jednorazowego użytku nie działa, możesz spróbować zrestartować harmonogram w następujący sposób.
SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'TRUE');
SQL> alter system set job_queue_processes=0;
SQL> exec dbms_ijob.set_enabled(FALSE);
SQL>
SQL> alter system flush shared_pool;
SQL> alter system flush shared_pool;
SQL>
SQL> exec dbms_ijob.set_enabled(TRUE);
SQL> alter system set job_queue_processes=99;
SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'FALSE');