juillet
2010
Monitorer les jobs d’une instance SQL Server est relativement simple mais quand il s’agit de le faire quotidiennement de façon proactive sur plusieurs instances hébergées sur différentes machines, alors là cela demande un peu plus de réflexion. Voici un script Powershell qui pourra vous aider dans cette tâche.
I. Préparation
==============================================================================
1.) Le script prend en entré un fichier nommée « ListeInfoServeurs.txt ».
Ce fichier contient : le nom de l’instance, login et password de connexion à l’instance
Exemple
IP1\InstanceNommée,loginsa,motdepassesa — ligne pour une instance nommée
IP2,login,password — ligne pour une instance par défaut
2.) L’exécution du script génère des fichiers .html en sortie dans le répertoire $repertoiresortie. Dans mon cas ce paramètre a pour valeur : ‘E:\PSSQL\Monitoring_Job\’
Changez-le pour indiquer le répertoire où vous souhaitez avoir vos fichiers de sortie.
3.) Nommage des fichiers de sortie .html : NomInstanceDateduJour.html
NomInstance = Nom de l’instance sans le backslah (pour une instance nommée) et sans les points si l’adresse IP est utilisée
DateduJour = la date du jour au format YYYYMMDD
II. Script à exécuter
==============================================================================
#=============================================================================
# Description : Monitoring des jobs de plusieurs instances SQL Server
# Auteur : Etienne ZINZINDOHOUE
#=============================================================================
#Lire le contenu du fichier contenant les informations de connexion aux différents serveurs
$listserveurs = get-content "ListeInfoServeurs.txt"
#Répertoire de sortie du résultat
$repertoiresortie = 'E:\PSSQL\Monitoring_Job\'
#Se positionner sur chaque ligne du fichier "ListeInfoServeurs.txt"
foreach ($ligne in $listserveurs) {
# Découpage de la ligne
$decoupageligne = $ligne.split(",")
# Nom de l'insance
$nominstance = $decoupageligne[0]
#login correspondant
$login = $decoupageligne[1]
#pwd correspondant
$stringpwd = $decoupageligne[2]
# Traitement
if($nominstance -eq ''){
break}else{
$serveur=new-object('Microsoft.SqlServer.Management.Smo.server')$nominstance
$serveur.ConnectionContext.LoginSecure=$false;
$serveur.ConnectionContext.set_login($login);
$serveur.ConnectionContext.set_Password($stringpwd);
Write-Host -foregroundcolor "green" "#######################################################################"
Write-Host Serveur : $nominstance version : $serveur.version
Write-Host -foregroundcolor "green" "#######################################################################"`n
try{
#Pour afficher le résultat dans la console
#$serveur.JobServer.Jobs | Where-Object {$_.IsEnabled -eq $TRUE} | format-table -Wrap Name,Description,OriginatingServer,OwnerLoginName,DateCreated,DateLastModified,LastRunOutcome,LastRunDate,NextRunDate
## Pour envoyer le résultat dans un fichier html
#Preparation fichier de sortie
$nominstancemodifbackslah = $nominstance.replace('\','')
$nominstancemodifpoint = $nominstancemodifbackslah.replace('.','')
#Date d'exécution
$dateexecution = get-date -uformat "%Y%m%d"
$fichiersortie = $repertoiresortie + $nominstancemodifpoint + $dateexecution +'.html'
#sortie html
$serveur.JobServer.Jobs | Where-Object {$_.IsEnabled -eq $TRUE} | SELECT Name,Description,OriginatingServer,OwnerLoginName,DateCreated,DateLastModified,LastRunOutcome,LastRunDate,NextRunDate | ConvertTo-HTML | Out-File $fichiersortie
}
catch{Write-Host "Il y a un problème avec le serveur $serveur" }
}
}
#=============================================================================
# Description : Monitoring des jobs de plusieurs instances SQL Server
# Auteur : Etienne ZINZINDOHOUE
#=============================================================================
Monitorer les jobs d’une instance SQL Server (2005 ou 2008) à l’aide du T-SQL
Bonjour,
Le sujet et le script son très intéressant, je suis justement en train de faire un développement sur ce thème.
Ce qui me surprend toujours c’est cette attitude système dans un contexte base de données.
Et tous les post que j’ai pu lire partout on cette tendance à utiliser des fichiers.
En effet il serait nettement plus productif de stocker les infos dans des tables :
1 Base MonReseauAdmin,
1 Table ServerList, 1 Table JobList, 1 Table JobModification, 1 Table JobState, 1 Table JobSchedule par exemple.
A partir de là le script Powershell permettrait un historique, et un envoi de mail avec fichier joint en csv si on veut, et même un alerting pour Nagios ou autre, et une arborescence des schedules par serveur.
Je n’en suis qu’au début de mon projet mais je tacherai de poster quelque chose dès qu’il sera plus consistant.
Merci pour tout car j’ai toujours eu plaisir à vous lire et à m’instruire de vos posts.
Eric
Bonjour,
Pouvez vous svp m’aider à finaliser mon script?
En fait j’essaie de renvoyer le résultat dans un fichier csv mais je n’ai que le résultat suivant:
« Length »
« 64 »
« 132 »
Voici le script:
foreach ($svr in get-content « ListeInfoServeurs.txt »)
{
$con = « server=$svr;database=master;Integrated Security=sspi »
$cmd = « SELECT name, physical_name, CAST(SUM(size * 8) AS FLOAT) / 1024 AS [Taille en Mo] FROM sys.master_files GROUP BY name, physical_name »
$da = new-object System.Data.SqlClient.SqlDataAdapter ($cmd, $con)
$dt = new-object System.Data.DataTable
$da.fill($dt) | out-null
$svr
$dt | Format-Table -autosize
} write-output $con, $cmd, $da, $dt | Export-CSV -notype export.csv
D’avance merci.