Ich habe einen Job in SQL Server Agent eingerichtet, um eine Aktualisierungsabfrage auszuführen. Ich möchte, dass dieser Job jede Nacht zwischen Mitternacht und 5 Uhr morgens ausgeführt wird, und ich möchte, dass er in diesem Zeitraum alle 5 Minuten wiederholt wird. Aber ich möchte nur, dass der Job tatsächlich ausgeführt wird, wenn die CPU im Leerlauf ist, dh die CPU-Auslastung liegt unter 20%. Ich weiß, dass ich den Zeitplan einrichten kann, und ich kann die CPU-Leerlaufanforderung auch separat einrichten. Gibt es eine Möglichkeit für mich, es so einzurichten, dass beide "Zeitpläne" wahr sein müssen, damit der Job ausgeführt werden kann?
Vielen Dank
quelle
Konfigurieren Sie den SQL-Agenten über das Fenster Erweiterte Eigenschaften für den Zustand der inaktiven CPU . Sie würden den Wert "Durchschnittliche CPU-Auslastung fällt unter" auf 20% setzen und dann festlegen, wie lange er auf diesem Niveau bleiben muss, bevor der Job ausgeführt wird.
Konfigurieren Sie anschließend den Jobschritt, um die Zeit zu überprüfen, in der sichergestellt ist, dass er sich in Ihrem Fenster befindet, wenn Sie innerhalb des Fensters den Befehl update ausgeben.
Jetzt wird die Anforderung für alle 5 Minuten möglicherweise nicht genau mit diesem Setup erfüllt. Ich konnte in diesem Zeitplantyp nichts finden, das angibt, wie oft der Job ausgeführt werden würde. [Wenn Sie beispielsweise "und bleibt unter diesem Wert" für den Leerlauf-CPU-Zustand auf 30 Sekunden setzen, wird der Job dann so häufig ausgeführt?] Dies würde einige Tests erfordern, da ich diese Konfiguration noch nie zuvor verwendet habe. Wenn ich eine Chance bekomme, kann ich versuchen zu sehen, was es tut und werde diese Antwort aktualisieren.
quelle
Ein Weg wäre, drei Jobs zu haben. Job eins wird nach einem Zeitplan festgelegt, der Job zwei am Anfang des Fensters aktiviert. Job zwei wird ausgeführt, wenn die CPU inaktiv ist und der dritte Job Job zwei am Ende des Fensters deaktiviert. Ich denke nicht, dass dies der einzige Weg ist, aber es ist definitiv der einfachste in meinem Kopf.
quelle
Denis war sehr nah. Aber die eigentliche Lösung wurde ein wenig getauscht. Da Powershell die CPU nicht über einen bestimmten Zeitraum überprüfen kann, sondern nur über die aktuelle Nutzung, musste die SQL Server-Prüfung verwendet werden.
Mein erster Schritt bestand darin, ein PowerShell-Skript auszuführen, das prüft, ob die aktuelle Systemzeit zwischen den beiden Zeitbeschränkungen liegt. Wenn dies der Fall ist, führt das Powershell-Skript nichts aus. Der SQL Server-Job interpretiert dies als Erfolg.
Anschließend fährt der Job mit dem letzten Schritt fort und führt die Aktualisierungsabfrage durch.
Wenn die aktuelle Zeit jedoch außerhalb des Bereichs liegt,
Start-Time -s 600
führe ich a aus, um das Powershell-Skript für 10 Minuten anzuhalten (simuliert die "einmalige Anforderung von 5 bis 10 Minuten"), um zu verhindern, dass der SQL Server-Agent ständig versucht, diesen Job auszuführen .Nach 10 Minuten gibt das Powershell-Skript einen benutzerdefinierten Fehler aus. Da ich
$ErrorActionPreference = "Stop"
am Anfang des Skripts habe, wird das Powershell-Skript nach dem Fehler nicht mehr ausgeführt. Dieser Schritt ist sehr wichtig.Da Powershell gestoppt wurde und nicht zurückgegeben wurde, interpretiert der SQL Server-Agent dies als Fehler und fährt nicht mit dem Schritt fort, der die Aktualisierungsabfrage ausführt.
PS Ihr habt mich in die richtige Richtung geführt. Wenn ich genug Ruf hätte, würde ich euch positiv bewerten.
Bearbeiten: Powershell-Skript hinzugefügt
quelle