J'ai un travail configuré dans l'Agent SQL Server pour exécuter une requête de mise à jour. Je veux que ce travail s'exécute chaque nuit entre minuit et 5 heures du matin et je veux qu'il se répète toutes les 5 minutes pendant cette période. Mais je veux que le travail s'exécute réellement si le CPU est inactif, c'est-à-dire que l'utilisation du CPU est inférieure à 20%. Je sais que je peux configurer le calendrier, et je peux également configurer l'exigence d'inactivité du processeur séparément. Existe-t-il un moyen pour moi de le configurer de sorte que les deux «planifications» doivent être vraies pour que le travail s'exécute?
Merci
la source
Configurez l'Agent SQL via la fenêtre Propriétés avancées pour l'état du processeur inactif . Vous devez définir la valeur «L'utilisation moyenne du processeur tombe en dessous» à 20%, puis combien de temps il doit conserver à ce niveau avant l'exécution du travail.
Après cela, configurez l'étape du travail pour vérifier l'heure en vous assurant qu'elle se trouve dans votre fenêtre, si dans la fenêtre, exécutez la commande de mise à jour.
Maintenant, l'exigence pour toutes les 5 minutes peut ne pas être remplie exactement avec cette configuration. Je n'ai rien trouvé sur ce type de planification qui indique la fréquence d'exécution du travail. [Par exemple, si vous définissez le "et reste en dessous de ce niveau" à 30 secondes pour l'état CPU inactif, est-ce qu'il exécute le travail aussi fréquemment?] Cela nécessiterait un peu de test car je n'ai jamais utilisé cette configuration auparavant. Si j'en ai l'occasion, je peux essayer de voir ce qu'il fait et je mettrai à jour cette réponse.
la source
Une façon serait d'avoir trois emplois. Le premier travail est défini sur une planification qui permet le deuxième travail au début de la fenêtre. Le travail deux est configuré pour s'exécuter lorsque le processeur est inactif et le troisième travail désactive le travail deux à la fin de la fenêtre. Je ne pense pas que ce soit la seule façon de le faire, mais c'est certainement la plus facile dans mon esprit.
la source
Denis était très proche. Mais la solution réelle a été un peu échangée. Comme PowerShell ne peut pas vérifier le processeur sur une durée, seule l'utilisation actuelle, la vérification SQL Server devait être utilisée.
Alors ma première étape du travail a été d'exécuter un script PowerShell qui vérifie si l'heure système actuelle se situe entre les deux contraintes de temps. Si c'est le cas, le script PowerShell ne fait rien. Le travail SQL Server interprète cela comme un succès.
Le Job passe ensuite à la dernière étape et exécute la requête de mise à jour.
Si toutefois l'heure actuelle est en dehors de la plage, j'effectue une
Start-Time -s 600
pause du script PowerShell pendant 10 minutes (en simulant l'exigence "une fois tous les 5 à 10 minutes). Ceci permet d'empêcher l'agent SQL Server d'essayer constamment d'exécuter ce travail. .Après 10 minutes, le script PowerShell génère une erreur personnalisée. Depuis que j'ai
$ErrorActionPreference = "Stop"
au début du script, le script PowerShell cesse de s'exécuter après l'erreur. Cette étape est très importante.Étant donné que powershell s'est arrêté et n'est pas revenu, l'Agent SQL Server interprète cela comme un échec et ne passera pas à l'étape qui exécute la requête de mise à jour.
PS Vous m'avez conduit dans la bonne direction. Si j'avais assez de réputation, je voterais pour vous.
Edit: Ajout du script Powershell
la source