Tags: WSUS, Datenbanken, Performance
Zu den regelmäßigen Wartungsarbeiten an den Windows Server Update Services (WSUS) gehört die Neuindexierung der Datenbank. Setzt man die interne Windows-Datenbank (WID) ein, dann muss diese Tätigkeit lokal erfolgen. Am einfachsten ist es daher, zu diesem Zweck eine geplante Aufgabe mit PowerShell zu erstellen.
Durch das häufige Hinzufügen und Löschen von Einträgen fragmentiert der Index der WSUS-Datenbank relativ rasch, was sich in einer schlechten Performance bemerkbar macht. Diese zeigt sich dann bei der Verwaltung der Updates im WSUS-Manager und meist noch stärker bei den PowerShell-Cmdlets für WSUS. Microsoft empfiehlt daher, die Datenbank einmal pro Monat neu zu indizieren.
Für Server Core geeignetes Vorgehen
Die folgende Anleitung geht von einer weit verbreiteten Konfiguration aus, bei der die WSUS unter Windows Server 2016 Core laufen und die WID als Datenbank nutzt. Aber das hier beschriebene Vorgehen funktioniert natürlich auch auf einem Server mit Desktop Experience.
Die Besonderheit an dieser Konstellation besteht darin, dass sich das grafische SQL Server Management Studio dort nicht verwenden lässt. Seine Installation auf Server Core ist ausgeschlossen und eine Remote-Verwaltung der Internal Database nicht möglich.
Tools installieren
Die erforderlichen Kommandozeilen-Tools werden mit der WSUS-Rolle nicht installiert, ebenso wenig der benötigte ODBC-Treiber für SQL Server. Sie müssen in zueinander passenden Versionen von Microsofts Website heruntergeladen werden:
Zuerst installiert man den ODBC-Treiber, weil sich das Setup der Kommandozeilen-Tools sonst verweigert. Beide kommen als MSI-Paket, sie lassen sich trotz eines grafischen Setup-Assistenten unter Server Core ausführen.
Damit wären nun die Voraussetzungen für das Management der Datenbank gegeben. Für die Indexierung benötigt man aber zusätzlich ein T-SQL-Script, das Microsoft als WsusDBMaintenance.sql auf GitHub zum Download anbietet. Offiziell ist es für WSUS 3.0 vorgesehen, funktioniert aber auch einwandfrei unter Server 2016.
Reindexierung starten
Wenn man die Command Line Utilities im Standardpfad installiert hat und das Script sich im aktuellen Verzeichnis befindet, dann kann man in der PowerShell nun folgendes Kommando absetzen, um die Indizes neu zu erstellen:
. "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd" -I -S np:\\.\pipe\MICROSOFT##WID\tsql\query -i WsusDBMaintenance.sql
Geplante Aufgabe erstellen
Nachdem es sich dabei um einen wiederkehrenden Ablauf handelt, liegt es nahe, diesen Vorgang zeitgesteuert regelmäßig auszuführen. Der Aufruf eines Kommandozeilen-Tools ist wie geschaffen für eine geplante Aufgabe. Unter Server Core geht es am schnellsten, wenn man dafür zur PowerShell greift.
Im ersten Schritt definiert man den Auslöser für die Aktion, das ist hier die Definition eines Zeitpunktes:
$trig = New-ScheduledTaskTrigger -weekly -At 23:00 -DaysOfWeek @("Friday")
In diesem Beispiel würde der Job jeden Freitag um 23:00 starten. Als nächsten legen wir das Kommando fest, das ausgeführt werden soll:
$action = New-ScheduledTaskAction -Execute "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd.exe" -Argument '-I -S np:\\.\pipe\MICROSOFT##WID\tsql\query -i C:\sql\WsusDBMaintenance.sql'
Dieser Aufruf geht davon aus, dass sich das T-SQL-Script unter c:\sql befindet. Wenn man nun zusätzliche Optionen konfigurieren möchte, dann kann man das mit New-ScheduledTaskSettingsSet tun, und zwar wie hier beschrieben.
Jetzt bleibt noch die eigentliche Erzeugung der geplanten Aufgabe:
Register-ScheduledTask -TaskName IndexSUSDB -TaskPath "\WSUS\" -Action $action -Trigger $trig -User "NT AUTHORITY\SYSTEM"
Dieser Befehl speichert den Auftrag unter dem Namen IndexSUSDB im Pfad \WSUS\, beide kann man natürlich nach Belieben anpassen.
Wenn man nun noch die Scheduled Task testen und daher gleich starten möchte, dann hilft dabei dieser Befehl:
Start-ScheduledTask -TaskPath "\WSUS\" -TaskName IndexSUSDB
Nachdem sich gerade beim Auftreten von Fehlern das Fenster des Kommandointerpreters sehr schnell wieder schließt, empfiehlt es sich, den Erfolg der Ausführung im Eventlog zu prüfen:
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational -MaxEvents 10 | fl
Dieser Aufruf zeigt die letzten 10 Log-Einträge, was reichen sollte, wenn man ihn unmittelbar nach Ausführung der Aufgabe eingibt.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- WSUS-Bereinigung bricht ab: Timeout für Datenbank und IIS erhöhen
- WSUS-Datenbank von WID auf SQL Server migrieren
- WSUS-Datenbank und Updates auf anderes Verzeichnis umziehen
- WSUS-Datenbank mit Windows Server Backup sichern
- Installation von WSUS auf Server 2016 planen: Systemvoraussetzungen, Storage-Optionen, Workgroups
Weitere Links
5 Kommentare
Hallo,
vielen Dank für den interessanten Hinweis. Funktioniert die Indizierung auch unter Win Server 2012 R2? Habe es versucht, bekomme aber bei der Ausführung der Reindexierung den Fehler "Sqlcmd: 'WsusDBMaintenance.sql': Ungültiger Dateiname."
Dabei bin ich davon ausgegangen, dass das in der TechNet-Gallery angebotene Visual Basic-Skript als WsusDBMaintenance.sql gespeichert werden muss? Oder übersehe ich den Download der WsusDBMaintenance.sql?
Viele Grüße
Martin
Kann es sein das du den Pfad nicht angegeben hast im Script sondern nur den Dateinamen?
Du legst die Datei z.b. unter C:\SQL\WsusDBMaintenance.sql und musst das halt dementsprechend im Script anpassen
Hatte auch den Fehler "Sqlcmd: 'WsusDBMaintenance.sql': Ungültiger Dateiname."
Lösung war: .\WsusDBMaintenance.sql.sql
Natürlich muss man sich im gleichen Verzeichnis wie das Script befinden.
Der Fehler ist beim Kopieren des T-SQL-Script entstanden. Ich habe an jedem Ende einer Zeile mind. eine Leerstelle gefunden und gelöscht. Zusätzlich habe ich überprüft, dass die 'großen Os' wirklich ein O sind und nicht eine 0 (Zahl Null).
Um Probleme mit dem Pfad auszuschließen ist es aus meiner Sicht einfacher die Datei 'WsusDBMaintenance.sql' zuerst nach C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\ zu kopieren ...
Irgendetwas läuft bei mir wohl schief. Ich kann mich mit sqlcmd scheinbar nicht auf die WID Datenbank verbinden. sqlcmd wirft da folgenden Fehler aus:
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn>sqlcmd -S np:\\.\pipe\MSSQL$MICROSOFT##WID\tsql\query
Sqlcmd: Fehler: Microsoft ODBC Driver 11 for SQL Server : Named Pipes-Anbieter: Es konnte keine Verbindung zu SQL Server hergestellt werden [2]. .
Sqlcmd: Fehler: Microsoft ODBC Driver 11 for SQL Server : Anmeldungstimeout abgelaufen.
Sqlcmd: Fehler: Microsoft ODBC Driver 11 for SQL Server : Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. Weitere Informationen erhalten Sie in der SQL Server-Onlinedokumentation..
Habe ich irgend etwas vergessen beim Einrichten? System ist ein Server 2016 in VMWare Umgebung