Hallo Chris!
Generell halte ich es für eine gute Idee alle Jobs
loggen zu lassen (damit du eine Chance hast nachzuvollziehen,
was genau schiefgegangen ist - das tun sie nämlich alle früher
oder später…). Wir selbst haben genau für den Zweck eine
mehrfach geschachtelte Vorgehensweise. Ganz „unten“ ist der
eigentliche gather, der wird ausgeführt von einem package, das
generell alle unsere Jobs verwaltet (d.h. im Prinzip ein
Wrapper für die DBMS_JOB), darüber gibt’s noch ein Script, das
bei DB-Updates und bei der Sicherung nachschaut, ob’s den Job
gibt und ihn im Fall des Falles anlegt und ausserdem die Logs
vom Job-Wrapper-Package auswertet (das brauchen wir aber
eigentlich nur, weil wir nicht auf alle unsere Kunden-DBs
online zugreifen können).
Ich hoffe damit wären alle Klarheiten restlos beseitigt .
ja, hast du hervorragend hinbekommen…
Ähm, sorry, ganz so war das nicht gemeint…
Kannst du das jetzt noch mal für Anfänger erklären ?
Ich versuch’s mal:
Annahme: Ich möchte einen Job anlegen, der einen
dbms\_stats.gather\_schema\_stats('SCOTT')
macht.
Durchführung bei mir:
exec my\_pkg.submit('dbms\_stats.gather\_schema\_stats(''SCOTT'')',
to\_date('31.10.2005 23:00','DD.MM.YYYY HH24:MI'),
my\_pkg.DAILY);
Das my_pkg tut jetzt Folgendes (eigentlich noch ein wenig mehr, aber das bleibt mein Geheimnis ):
-
Prüfen, ob es den gleichen Job schon gibt (und ob er funktioniert)
-
Erstellen einer Prozedur my_pkg_job[NNNN] wobei NNNN aus einer Sequence kommt.
-
Eintragen der Befehlszeile (also dbms_stats(…)) in eine interne Tabelle (3x darfst du raten wofür )
-
Einbau einer Logging-Funktionalität in diese Prozedur, sodaß diese den Start und die Beendigung + den Exit-Code in eine andere interne Tabelle schreibt
-
Eintragen dieser Prozedur in die Job Queue
Isses jetzt klarer?
noch eine Frage, wie entlockt man dem dbms_stats das es nicht
wirklich erfolgreich war ? man bekommt ja noch eine
„erfolgreich“ Meldung wenn man ein Schema analysiert das nicht
existiert… ?
Also bei mir ruft
exec dbms\_stats.gather\_schema\_stats('HUDRIWUSCH');
den Fehlerstack:
ORA-20000: Schema "HUDRIWUSCH" does not exist or insufficient privileges
ORA-06512: at "SYS.DBMS\_STATS", line 1618
ORA-06512: at "SYS.DBMS\_STATS", line 13623
ORA-06512: at "SYS.DBMS\_STATS", line 13593
ORA-06512: at line 1
hervor… Den solltest du auch kriegen, wenn du nicht ein
EXCEPTION WHEN OTHERS NULL;
hinschreibst. Beim Aufruf durch den Job musst du das natürlich abfangen, sonst setzt er mW einfach nur den Job auf ‚Broken‘ (wo sollte er denn die Fehlermeldung auch hinschreiben…).
Ich hab´s jetzt erstmal so gemacht das danach eine Loop die
last_analyzed Spalte mit dem sysdate vergleicht und wenn´s
nicht zusammen paßt dann den Tabellennamen ausspuckt.
Geht auch, ist aber nicht besonders hübsch und funktioniert vor allem nur bei DIESEM Job, du brauchst aber etwas, das dir für JEDEN Job sagt, ob er läuft oder nicht - das macht bei mir eben mein Wrapper-Package.
Gruß
Martin