Ich suche nach bewährten Methoden für den Umgang mit geplanten SQL Server-Agent-Jobs in SQL Server 2012-Verfügbarkeitsgruppen. Vielleicht habe ich etwas verpasst, aber beim gegenwärtigen Stand habe ich das Gefühl, dass SQL Server Agent nicht wirklich in diese großartige SQL2012-Funktion integriert ist.
Wie kann ich einen geplanten SQL Agent-Job auf einen Knotenwechsel aufmerksam machen? Ich habe zum Beispiel einen Job auf dem primären Knoten, der stündlich Daten lädt. Wie kann ich nun den Job auf dem sekundären Server aktivieren, der jetzt zum primären Server wird, wenn der primäre Server ausfällt?
Wenn ich den Job immer auf der Sekundärseite einplane, schlägt dies fehl, da die Sekundärseite schreibgeschützt ist.
Antworten:
Verfügen Sie in Ihrem SQL Server-Agent-Auftrag über eine Bedingungslogik, um zu testen, ob die aktuelle Instanz die bestimmte Rolle erfüllt, nach der Sie in Ihrer Verfügbarkeitsgruppe suchen:
Alles
PRIMARY
, was Sie tun müssen, ist, die aktuelle Rolle des lokalen Replikats abzurufen. Wenn diese in der Rolle enthalten ist, können Sie alles tun, was Ihr Job tun muss, wenn es sich um das primäre Replikat handelt. DerELSE
Block ist optional, dient jedoch zur Behandlung möglicher Logik, wenn Ihre lokale Replik nicht primär ist.Ändern Sie
'YourAvailabilityGroupName'
in der obigen Abfrage natürlich den Namen Ihrer tatsächlichen Verfügbarkeitsgruppe.Verwechseln Sie Verfügbarkeitsgruppen nicht mit Failoverclusterinstanzen. Ob die Instanz das primäre oder das sekundäre Replikat für eine bestimmte Verfügbarkeitsgruppe ist, wirkt sich nicht auf Objekte auf Serverebene aus, z. B. auf SQL Server-Agent-Jobs.
quelle
Anstatt dies auf Jobbasis zu tun (jeden Job auf den Status des Servers zu überprüfen, bevor Sie fortfahren), habe ich einen Job erstellt, der auf beiden Servern ausgeführt wird, um zu überprüfen, in welchem Status sich der Server befindet.
Dieser Ansatz bietet eine Reihe von Dingen
Das Skript überprüft die Datenbank im Feld darunter
Dieser Vorgang wird alle 15 Minuten auf jedem Server ausgeführt. (hat den zusätzlichen Bonus, einen Kommentar anzufügen, um die Leute darüber zu informieren, warum der Job deaktiviert wurde)
Es ist nicht narrensicher, aber für Übernachtungen und stündliche Jobs erledigt es die Arbeit.
Es ist sogar noch besser, als dieses Verfahren nach einem Zeitplan ausführen zu lassen, als Reaktion auf Warnung 1480 (AG-Rollenwechsel-Warnung).
quelle
Ich kenne zwei Konzepte, um dies zu erreichen.
Voraussetzung: Basierend auf der Antwort von Thomas Stringer habe ich zwei Funktionen in der Master-Datenbank unserer beiden Server erstellt:
Lassen Sie einen Job beenden, wenn er nicht auf dem primären Replikat ausgeführt wird
In diesem Fall benötigt jeder Job auf beiden Servern einen der beiden folgenden Codeausschnitte als Schritt 1:
Nach Gruppenname prüfen:
Nach Datenbanknamen prüfen:
Wenn Sie diese zweite Variante verwenden, sollten Sie jedoch auf die Systemdatenbanken achten - per Definition können sie keiner Verfügbarkeitsgruppe angehören, sodass sie für diese immer fehlschlagen.
Beide Funktionen sind für Administratorbenutzer sofort einsatzbereit. Für Benutzer ohne Administratorrechte müssen Sie zusätzliche Berechtigungen hinzufügen, von denen eine hier vorgeschlagen wird :
Wenn Sie die Fehleraktion in diesem ersten Schritt auf Jobberichtserfolg beenden setzen, wird das Jobprotokoll nicht mit hässlichen roten Kreuzzeichen gefüllt. Für den Hauptjob werden sie stattdessen in gelbe Warnzeichen umgewandelt.
Nach unserer Erfahrung ist dies nicht ideal. Wir haben diesen Ansatz zunächst gewählt, jedoch schnell den Überblick über die Suche nach Jobs verloren, bei denen tatsächlich ein Problem aufgetreten ist, da alle sekundären Replikatjobs das Jobprotokoll mit Warnmeldungen überfüllten.
Was wir dann wollten, ist:
Proxy-Jobs
Wenn Sie dieses Konzept übernehmen, müssen Sie tatsächlich zwei Jobs pro Aufgabe erstellen, die Sie ausführen möchten. Der erste ist der "Proxy-Job", der prüft, ob er auf dem primären Replikat ausgeführt wird. Wenn dies der Fall ist, wird der "Arbeiterjob" gestartet. Wenn dies nicht der Fall ist, wird er ordnungsgemäß beendet, ohne das Protokoll mit Warn- oder Fehlermeldungen zu überladen.
Ich persönlich mag die Idee, zwei Jobs pro Task auf jedem Server zu haben, nicht, aber ich denke, dass sie auf jeden Fall besser zu warten sind, und Sie müssen die Fehleraktion des Schritts nicht auf Erfolg beim Beenden der Jobberichterstellung setzen , was ein bisschen ist peinlich.
Für die Jobs haben wir ein Namensschema übernommen. Der Proxy-Job wird gerade aufgerufen
{put jobname here}
. Der Arbeiterjob wird aufgerufen{put jobname here} worker
. Dadurch ist es möglich, das Starten des Worker-Jobs vom Proxy aus zu automatisieren. Zu diesem Zweck habe ich den beiden Master-Datenbanken die folgende Prozedur hinzugefügt:Hierbei wird die
svf_AgReplicaState
oben gezeigte Funktion verwendet. Sie können diese einfach ändern, um den Datenbanknamen zu überprüfen, indem Sie die andere Funktion aufrufen.Innerhalb des einzigen Schritts des Proxy-Jobs nennen Sie es folgendermaßen:
Hierbei werden die hier und hier gezeigten Tokens verwendet , um die aktuelle Job-ID abzurufen. Die Prozedur ruft dann den aktuellen Jobnamen von msdb ab, hängt
worker
ihn an und startet den Worker-Job mitsp_start_job
.Obwohl dies immer noch nicht ideal ist, werden die Auftragsprotokolle übersichtlicher und wartbarer als bei der vorherigen Option. Sie können den Proxy-Job auch immer mit einem Sysadmin-Benutzer ausführen lassen, sodass das Hinzufügen zusätzlicher Berechtigungen nicht erforderlich ist.
quelle
Wenn es sich beim Datenladeprozess um eine einfache Abfrage oder einen einfachen Prozeduraufruf handelt, können Sie den Job auf beiden Knoten erstellen und anhand der Updateability-Eigenschaft der Datenbank bestimmen lassen, ob es sich um den primären Knoten handelt, bevor der Datenladeprozess ausgeführt wird:
quelle
Es ist immer besser, einen neuen Jobschritt zu erstellen, der prüft, ob es sich um ein primäres Replikat handelt. Wenn es sich um ein sekundäres Replikat handelt, ist alles in Ordnung, um mit der Jobausführung fortzufahren. Stoppen Sie dann den Job. Schlagen Sie den Auftrag nicht fehl, da sonst weiterhin unnötige Benachrichtigungen gesendet werden. Beenden Sie stattdessen den Job, damit er abgebrochen wird und keine Benachrichtigungen gesendet werden, wenn diese Jobs auf dem sekundären Replikat ausgeführt werden.
Das folgende Skript fügt einen ersten Schritt für einen bestimmten Job hinzu.
Hinweis zum Ausführen des Skripts:
Wenn mehrere Verfügbarkeitsgruppen vorhanden sind, legen Sie den AG-Namen in der Variablen @AGNameToCheck_IfMoreThanSingleAG fest, für die AG der Replikationsstatus überprüft werden soll.
Beachten Sie auch, dass dieses Skript auch auf Servern ohne Verfügbarkeitsgruppen gut funktionieren sollte. Wird nur für SQL Server-Versionen 2012 und höher ausgeführt.
quelle
Eine andere Möglichkeit besteht darin, in jeden Job, der zuerst ausgeführt werden soll, einen Schritt mit folgendem Code einzufügen:
Setzen Sie diesen Schritt, um mit dem nächsten erfolgreichen Schritt fortzufahren und die Jobmeldung zu beenden, wenn ein Fehler aufgetreten ist.
Ich finde es übersichtlicher, einen zusätzlichen Schritt hinzuzufügen, anstatt einem vorhandenen Schritt zusätzliche Logik hinzuzufügen.
quelle
Eine andere, neuere Option ist die Verwendung von master.sys.fn_hadr_is_primary_replica ('DbName'). Ich fand das super hilfreich, wenn ich SQL Agent für die Datenbankwartung verwendete (zusammen mit einem Cursor, den ich seit Jahren verwende) und wenn ich eine ETL oder eine andere datenbankspezifische Aufgabe ausführte. Der Vorteil ist, dass die Datenbank herausgegriffen wird, anstatt die gesamte Verfügbarkeitsgruppe zu betrachten. Es ist auch sehr viel unwahrscheinlicher, dass ein Befehl für eine Datenbank ausgeführt wird, die sich auf der Primärdatenbank befand. Nehmen wir jedoch an, dass während der Jobausführung ein automatisches Failover stattgefunden hat und sich nun auf einer sekundären Replik befindet. Die oben genannten Methoden, die sich mit dem primären Replikat befassen, sehen sich nur einmal um und werden nicht aktualisiert. Beachten Sie, dass dies nur ein anderer Weg ist, um sehr ähnliche Ergebnisse zu erzielen und bei Bedarf eine genauere Steuerung zu ermöglichen. Der Grund, warum diese Methode bei der Beantwortung dieser Frage nicht erörtert wurde, ist, dass Microsoft diese Funktion erst nach der Veröffentlichung von SQL 2014 freigegeben hat. Im Folgenden finden Sie einige Beispiele für die Verwendung dieser Funktion:
Wenn Sie dies für die Pflege der Benutzerdatenbank verwenden möchten, verwende ich Folgendes:
Ich hoffe das ist ein hilfreicher Tipp!
quelle
Ich benutze das:
quelle