WSUS-Datenbankgröße (SUSDB) verkleinern
Sicherheitshinweis
Die hier bereitgestellten Skripte sind stets auf eigene Gefahr anzuwenden!
Daher immer erst mit einem nicht-kritischen System oder in einer Testumgebung ausführlich testen!
Einleitung
Die WSUS-Datenbank gibt den in der Vergangenheit in Anspruch genommenen Festplattenspeicher nicht automatisch frei, auch wenn Teile oder der gesamte Inhalt der WSUS-Datenbank entsprechend bearbeitet worden sind. Durch z.B. dem Entfernen einzelner Windows Update Dateien, aller Windows Updates eines Produktes oder einer bestimmten Klassifizierung.
Standardpfade für die WSUS-Datenbank:
%SystemRoot%\WID\Data
ODER
%ProgramFiles%\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA
Die WSUS Datenbankdateien werden durch die folgenden Prozesse genutzt:
Webserver-Dienst (w3svc) Windows Update AutoUpdate Dienst (wuauserv) Windows Internal Database (MSSQL$MICROSOFT##WID)
Diese 3 Prozesse sind zu stoppen, sollte zuvor eine Kopie der Daten erstellt werden müssen. Für die nächsten Schritte sind diese Prozesse im gestarteten Modus wieder zwingende Voraussetzungen.
Voraussetzungen
In diesem Beitrag erläutere ich, wie diese Tätigkeiten mittels der Kommandozeile entsprechend durchgeführt werden können. Jedoch sind hierzu gewisse Voraussetzungen zu treffen, damit auf die SUSDB aus der Kommandozeile erfolgreich zugegriffen werden kann. Daher sind die folgenden Installationen zwingende Voraussetzungen…
Möglichkeit 1:
- Microsoft SQL Server Management Studio (SSMS) (Download)
– Ersetzt Möglichkeit 2! –
Möglichkeit 2:
- Microsoft Visual C++ 201x Redistributable (Download)
- Microsoft ODBC Driver 17 for SQL Server (Download)
- Microsoft Befehlenszeilenprogramm 15 für SQL Server (Download)
– Ersetzt Möglichkeit 1! –
Vorbereitungen
Aus der Kommandozeilenebene heraus, wird eine *.sql- Datei aufgerufen und ausgeführt. Deswegen muss zuvor noch eine entsprechende *.sql- Datei erstellt werden. Die Bennenung der SQL-Datei ist grundsätzlich egal!
SQL-Skript:
USE SUSDB;
GO
DBCC SHRINKDATABASE(N'SUSDB');
GO
Für den späteren Aufruf in der Kommandozeile, die *.sql- Datei entsprechend lokal auf dem System abspeichern. Für die Automatisierung bietet sich auf der Kommandozeile ebenfalls eine entsprechende *.cmd- Datei an.
CMD-Skript-Beispiel:
REM ============================================================================
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET CMDNAME=%~NX0 (%~Z0 Bytes)
TITLE %CMDNAME%
MODE CON:COLS=81 LINES=12
COLOR 1F
REM - Run SQL Script to prepare the database environment
REM [-S Server]
REM [-E vertrauenswürdige Verbindung]
REM [-i Eingabedatei]
REM [-o Ausgabedatei]
REM [-W nachfolgende Leerzeichen entfernen]
ECHO Preparing Databases...
Sqlcmd -S "np:\\.\pipe\MICROSOFT##WID\tsql\query" -E -i "C:\Scripts\WSUS\db_shrink.sql" -o "C:\Scripts\WSUS\_LOG\db_shrink.log" -W
ENDLOCAL
EXIT /B %ERRORLEVEL%
REM ============================================================================
(Ist die WSUS-DB umbenannt bzw. besitzt einen anderen DB-Namen, muss der entsprechende Aufruf abgeändert werden: \.\pipe\MICROSOFT##WID\tsql\query)
Für den späteren Aufruf in der Aufgabenplanung, die *.cmd- Datei entsprechend lokal auf dem System abspeichern. Zusätzlich muss das LOG-Verzeichnis zuvor erstellt sein. Die Speicherpfade an die eigenen Bedürfnisse anpassen!
-E -i "C:\Scripts\WSUS\db_shrink.sql" -o "C:\Scripts\WSUS\_LOG\db_shrink.log" -W
WSUS-Datenbankgröße verkleinern
Sind die Vorbereitungen abgearbeitet, ist die Durchführung der ausstehenden Aktionen schnell getan.
Variante 1:
- Die *.cmd- Datei manuell mit administrativer Berechtigungen starten und ausführen.
Variante 2:
In der Aufgabenplanung eine neue Aufgabe erstellen und hierbei auf die folgenden Optionen achten…
- Allgemein (Reiter) –> Sicherheitsoptionen –>
Unnabhängig von der Benutzeranmeldung ausführen - Allgemein (Reiter) –> Sicherheitsoptionen –>
Mit höchsten Privilegien ausführen - Allgemein (Reiter) –> Konfigurieren für:
Windows Server 20xx - Aktionen (Reiter) –> Neu –> Aktion: –>
Programm starten - Aktionen (Reiter) –> Neu –> Einstellungen –> Programm/Skript –>
C:\Scripts\WSUS\db_shrink.cmd
Prüfung der WSUS-Datenbankgröße
Die Kontrolle, ob sich die Datenbankgröße verkleinert hat, ist aus der erstellten LOG-Datei zu entnehmen.
Beispiel:
C:\Scripts\WSUS\_LOG\db_shrink.log
Hey André,
danke für die tolle Anleitung. Da ich gerade einen WSUS vor mir habe, der etwas rumzickt, hilft sie mir weiter ;-)
Eine Frage jedoch:
Bist du dir sicher, dass der Dienst „Windows Update AutoUpdate Dienst (wuauserv)“ relevant ist?
Soweit mir bekannt, ist das lediglich der Dienst für den Dienst „Windows Update“; also die Client-Komponente, welche Updates (von Microsoft oder vom WSUS) runterlädt. Der WSUS-relevante Dienst müsste doch „WSUS Service (WsusService)“ sein oder?
Eine sonnige Woche und viele Grüße Ronny
Hi Ronny,
alter Beitrag, aber dennoch in puncto WSUS aktueller denn je… 😅
Kurzum:
Der Dienst Windows Update (wuauserv) ist für den reinen WSUS-Betrieb nicht direkt erforderlich.
In der Praxis kann es jedoch vorkommen, dass er indirekt Verbindungen zur SUSDB hält (z. B. durch lokale Update-Scans oder Reporting). Daher kann es notwendig sein, ihn temporär zu stoppen, um Datenbankoperationen wie einen Shrink erfolgreich durchzuführen.
Ich vermute, dass genau das damals auch der Grund war, warum die ersten Shrink-Versuche bei mir nicht erfolgreich waren.
Inzwischen lasse ich alle meine WSUS-Skripte 1× täglich in einer gemeinsamen Aufgabe nacheinander ablaufen, um die WSUS Instanz halbwegs im Griff zu behalten 😄
Sind alle Aufräum- und Shrink-Aktionen in einer Aufgabe gebündelt, kann sich mein „Reset“-Skript am Ende sauber dem bedienen, bevor die nächste Synchronisation startet. Ohne diese Bereinigung im Vorfeld bringt das Reset-Skript erfahrungsgemäß nur begrenzt etwas 😉
Melde dich gern, wenn noch etwas unklar ist – ansonsten gutes Gelingen! 😎