WSUS-Datenbank neu indizieren, geplante Aufgabe einrichten


    Tags: , ,

    Index für WSUS-Datenbank neu erstellenZu den regel­mäßigen Wartungs­arbeiten an den Windows Server Update Services (WSUS) gehört die Neu­indexierung der Daten­bank. Setzt man die interne Windows-Datenbank (WID) ein, dann muss diese Tätigkeit lokal erfolgen. Am einfach­sten ist es daher, zu diesem Zweck eine geplante Auf­gabe 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.

    Installation der SQL Server Command Line Utilities

    Damit wären nun die Voraus­setzungen für das Management der Datenbank gegeben. Für die Indexierung benötigt man aber zusätzlich ein T-SQL-Script, das Microsoft als WsusDB­Maintenance.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 Standard­pfad 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

    Reindizierung der WID-Datenbank manuell anstoßen

    Geplante Aufgabe erstellen

    Nachdem es sich dabei um einen wieder­kehrenden 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.

    Geplante Aufgabe für Reindexierung der WSUS-Datenbank mit PowerShell einrichten

    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

    Geplante Aufgabe für Reindexierung der WSUS-Datenbank starten und Erfolg im Eventlog prüfen

    Nachdem sich gerade beim Auftreten von Fehlern das Fenster des Kommando­interpreters 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

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Ähnliche Beiträge

    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