Gute Möglichkeit, mehrere SQL Server Agent-Jobs nacheinander von einem Hauptjob aus aufzurufen?

11

Ich habe mehrere SQL Server Agent-Jobs, die nacheinander ausgeführt werden sollen. Um einen guten Überblick über die Jobs zu erhalten, die ausgeführt werden sollen, habe ich einen Hauptjob erstellt, der die anderen Jobs mit einem Aufruf an aufruft EXEC msdb.dbo.sp_start_job N'TEST1'. Der sp_start_jobVorgang wird sofort beendet (Job Schritt 1), aber dann möchte ich, dass mein Hauptjob wartet, bis der Job TEST1beendet ist, bevor ich den nächsten Job anrufe.

Also habe ich dieses kleine Skript geschrieben, das direkt nach dem Aufruf des Jobs ausgeführt wird (Jobschritt 2) und den Hauptjob zwingt, zu warten, bis der Unterjob beendet ist:

WHILE 1 = 1
  BEGIN
    WAITFOR DELAY '00:05:00.000';

    SELECT *
    INTO   #jobs
    FROM   OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
           'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
           @execution_status = 0, @job_aspect = N''JOB''');

    IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
      BEGIN
        BREAK
      END;

    DROP TABLE #jobs;

  END;

Das funktioniert gut genug. Aber ich hatte das Gefühl, dass intelligentere und / oder sicherere ( WHILE 1 = 1?) Lösungen möglich sein sollten.

Ich bin neugierig auf folgende Dinge und hoffe, dass Sie mir einige Einblicke geben können:

  • Was sind die Probleme bei diesem Ansatz?
  • Können Sie einen besseren Weg vorschlagen, dies zu tun?

(Ich habe diese Frage zuerst bei StackOverflow gestellt , weil ich mich auf die Verbesserung des Codes konzentriert habe. Immer noch gültig. Aber ich vermute, dass die Leute hier im Allgemeinen klügere Dinge zu sagen haben, warum ich nicht versuchen sollte, dies so zu tun, wie ich es tue. ' Ich mache es jetzt oder biete gute Alternativen.)

EDIT (25. Juli)
Anscheinend ist an meinem Skript nicht allzu viel falsch, da nur wenige Antworten auf Probleme hinweisen :-) Die Alternative zu dieser Art von Skripten scheint darin zu bestehen, ein Tool zu verwenden, das für diese Skripte entwickelt wurde Aufgaben (wie SQL Sentry Event Manager oder ...) - oder ein solches Tool selbst zu schreiben. Wir werden ein solches Tool in meiner derzeitigen Firma nicht kaufen, daher bleibe ich vorerst beim Skript.

Gemeinschaft
quelle
Haben Sie darüber nachgedacht, diese Jobs als Schritte im Hauptjob anstelle von unabhängigen Jobs zu haben? Das würde die Komplexität verringern, insbesondere wenn sie immer nur in einer solchen Reihenfolge zusammengerufen werden ...
Aaron Bertrand
Es ist ein Gleichgewicht. Es wäre eine "sauberere" Wartung, wenn wir alle Jobs als Schritte zum Hauptjob hinzufügen würden, aber wir würden viel Überblick und die Möglichkeit verlieren, bestimmte Jobs manuell auszuführen, wenn wir dies tun. Ich habe es mir sicherlich überlegt, aber die aktuelle "Lösung" hat zu viele Vorteile - solange sie funktioniert.

Antworten:

9

Haftungsausschluss: Ich arbeite für SQL Sentry.

Unser SQL Sentry Event Manager- Produkt verfügt über eine genau dafür entwickelte Funktion: Jobs verketten und in verschiedenen Workflow-Reihenfolgen anordnen.

Ich habe vor Jahren mit SQL Sentry begonnen, bevor ich jemals in das Unternehmen eingetreten bin, um genau dies zu tun. Was ich wollte, war eine Möglichkeit, einen Wiederherstellungsjob auf unserem Testserver sofort nach Abschluss der Sicherung in der Produktion zu starten.

Was ich ursprünglich implementiert hatte, war nur ein wesentlicher Puffer zwischen der Startzeit des Sicherungsjobs und der Startzeit der Wiederherstellung. Das war nicht gerade narrensicher; Da die Sicherungszeiten variierten, verschwendete der Puffer oft Zeitverschwendung, wenn eine Wiederherstellung nicht gestartet wurde, obwohl dies möglich gewesen wäre. Und gelegentlich war der Puffer nicht genug.

Was ich als nächstes implementiert habe, war ähnlich wie das, was Sie haben - ich habe einen Job auf dem Testserver geschrieben, der kurz nach der geplanten Sicherung gestartet wurde, und habe weiter abgefragt, um zu sehen, wann der Job beendet wurde. Dies wurde später geändert, um nur einen zweiten Schritt im Sicherungsjob zu haben, mit dem eine Tabelle auf dem Testserver aktualisiert wurde. Nicht wirklich anders, außer dass der Wiederherstellungsjob nur eine Tabelle lokal überwachen musste, anstatt den Jobverlauf remote zu überwachen. Wenn man zurückdenkt, könnte dies ein Auslöser für diese Tabelle gewesen sein, die aufgerufen wurde, sp_start_jobsodass der Job nicht alle n Minuten ausgeführt werden musste (oder überhaupt geplant werden musste).

Die endgültige Lösung bestand darin, Jobs miteinander zu verketten. Wenn die Sicherung auf Server A abgeschlossen ist, startet Event Manager den Wiederherstellungsjob auf Server B. Und wenn es einen dritten Job und einen vierten Job oder eine bedingte Logik gibt, die darauf basiert, was zu tun ist Wenn ein Job fehlschlägt oder erfolgreich ist usw., kann dies alles berücksichtigt werden. Der Workflow-Designer wird Sie einiges an SSIS erinnern:

Geben Sie hier die Bildbeschreibung ein

Die zugrunde liegende Mechanik dessen, was ich beschreibe, ist natürlich keine Raketenoperation. Sie könnten diese Art von Kettenverpackung selbst schreiben, wenn Sie sich hinsetzen und es tun würden. Wir bieten Ihnen nur eine Alternative, bei der Sie nicht müssen.

Aaron Bertrand
quelle
2

Das Hauptproblem bei Ihrem Ansatz ist, dass Sie sich ständig drehen müssen, bis etwas passiert (was eine schrecklich lange Zeit oder sogar nie sein kann), und das fühlt sich nicht ganz richtig an. Deshalb stellen Sie wohl die Frage.

Wie wäre es also mit einem datengesteuerten Ansatz für Ihr Problem? Erstellen Sie beispielsweise eine 'Audit'-Tabelle, in die jeder Job beim Starten und Beenden schreibt:

Jobname | Startzeit | Endzeit
--------- + ------------------- + ------------------
Test1 2012-07-26 07:30 2012-07-26 07:35

Erstellen Sie eine 'Verarbeitungstabelle', in der alle Jobs und die Reihenfolge aufgelistet sind, in der sie ausgeführt werden müssen:

Jobname | Reihenfolge ausführen
--------- + ---------
Test1 | 1
Test2 | 2
Test3 | 3

Erstellen Sie einen Einfügetrigger für die Überwachungstabelle, sodass der Trigger nach Abschluss eines Jobs und Einfügen des Überwachungsdatensatzes die Verarbeitungstabelle für den nächsten Job (nach Ausführungsreihenfolge) abfragt und dann startet.

Die Vorteile dieses Ansatzes sind:

  1. Es ist ziemlich einfach zu entwickeln und zu warten.
  2. Es bietet die Möglichkeit, neue Jobs hinzuzufügen oder die Reihenfolge vorhandener Jobs über die Verarbeitungstabelle zu ändern, ohne eine Codezeile ändern zu müssen.
  3. Die Audit-Tabelle gibt Aufschluss darüber, wann etwas passiert ist.
  4. Es werden keine CPU-Zyklen verschwendet. Der Auslöser wird nur ausgelöst, wenn etwas passiert ist.
  5. Es fühlt sich richtig an 😉

HTH

paco
quelle
1
Vielen Dank, liebe deine Antwort! Ich werde es auf jeden Fall versuchen!