VMware vCenter Server – SQL Datenbank voll („An unrecoverable problem has occurred“)

Problem:

Der vCenter Server wird standardmäßig mit einem SQL-Express ausgeliefert, hierbei ist (unter 2008 R2) die Datenbank auf maximal 10GB limitiert.
Wenn diese Größe erreicht wird, gibt es verschiedene Symptome. z.B. ist keine Anmeldung am vCenter Server mehr möglich, (Veeam)-Sicherungen schlagen fehl, der Dienst „VMware VirtualCenter Server“ ist beendet oder in der Ereignisanzeige tauchen folgende einträge auf:

An unrecoverable problem has occurred, stopping the VMware VirtualCenter service. Error: Error[VdbODBCError] (-1) "ODBC error: (42000) - [Microsoft][SQL Server Native Client 10.0][SQL Server]Could not allocate space for object 'dbo.VPX_HOST_VM_CONFIG_OPTION'.'PK_VPX_HOST_VM_CONFIG_OPTION' in database 'VIM_VCDB' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup." is returned when executing SQL statement "INSERT INTO VPX_HOST_VM_CONFIG_OPTION WITH (ROWLOCK) (HOST_ID, CONFIG_OPTION_VER, DATA, ARRAY_INDEX, CONFIG_OPTION_DESC, CREATE_SUPPORTED_FLG, DEFAULT_CONFIG_OPTION_FLG, RUN_SUPPORTED_FLG, UPGRADE_SUPPORTED_FLG) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"

(Event-Quelle: MSSQL$SQLINSTANZ; Event-ID: 1827)
Could not allocate space for object 'dbo.VPX_HOST_VM_CONFIG_OPTION'.'PK_VPX_HOST_VM_CONFIG_OPTION' in database 'VIM_VCDB' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

(Event-Quelle: VMware VirtualCenter Server; Event-ID: 1000)

Lösung:

  1. Zunächst die Datenbankaufbewahrungsrichtlinie anpassen
    1. Falls eine anmeldung am vCenter Server noch möglich ist mit dem vSphere Client verbinden, unter Verwaltung -> vCenter Server-Einstellungen die Datenbankaufbewahrungsrichtlinie anpassen und danach den VMware VirtualCenter Server-Dienst beenden vcenter_datenbankaufbewahrungsrichtline_client
    2. Ist eine Anmeldung nicht mehr möglich, z.B. weil der Dienst nicht gestartet werden kann, muss die Änderung direkt in der Datenbank vorgenommen werden:
      1. Mit einem SQL Management Studio auf den SQL-Server verbinden
      2. Im Objekt Explorer die Punkte Datenbanken, VIM_VCDB (standardmäßig), Tabellen erweitern
      3. Rechtsklick auf die Tabelle dbo.VPX_PARAMETER -> Oberste 200 Zeilen bearbeiten
      4. event.maxAge und task.maxAge anpassen und event.maxAgeEnabled und task.maxAgeEnabled auf true setzen
  2. Spätestens jetzt wird das SQL Management Studio benötigt: Datenbanken -> VIM_VCDB (standardmäßig) -> Programmierbarkeit -> Gespeicherte Prozeduren erweitern
  3. Rechtsklick auf dbo.cleanup_events_tasks_proc -> Gespeicherte Prozedur ausführen… und das nächste Fenster mit OK bestätigen
  4. Die ausführung kann je nach größe der Datenbank einige Zeit in Anspruch nehmen
  5. Danach Rechtsklick auf die Datenbank VIM_VCDB -> Tasks -> Verkleinern -> Datenbank und nächstes Fenster mit OK bestätigen
  6. Auch dieser Schritt kann einige Zeit in Anspruch nehmen
  7. Die Datenbank sollte nun wieder einiges an Platz haben
  8. Der Dienst kann wieder gestartet werden und die Datenbankaufbewahrungsrichtlinie kann zurück auf den Standard gesetzt werden (180 Tage / deaktiviert für Aufgaben und Ereignisse)

Mit icacls Vollzugriff vererben

Das Kommandozeilen-Tool icacls zum Vergeben und Vererben von NTFS-Berechtigungen ist nicht so vollständig wie wünschenswert dokumentiert. Beisoielsweise vergibt der Parameter /grant:r (Benutzer):F zwar für den Benutzer Vollzugriff, jedoch nur als „spezielle“ Berechtigung.

Lösung:

Als Beispiel wollen wir den Vollzugriff für einen Ordner und alle enthaltenen Objekte vererben.

icacls <ordner>/inheritance:r /grant:r "<domaene>Gruppe":(OI)(CI)F /T
  • /inheritance:r – Entfernt alle vererbten ACEs in diesem Ordner
  • /grant:r „<domaene>Gruppe“:(OI)(CI)F – „Echter“ Vollzugriff für die Gruppe setzen
  • /T – Rekursiv durch Unterordner und Dateien

Ein weiteres Beispiel aus der Praxis: Auf einem Zielordner muss ich ab und an mal alle wild gewuchterten (oder vom System beim Kopieren hinzugefügten) Rechte entfernen und eine saubere Rechtestruktur von oben nach unten vererben. Natürlich sollen dabei auch Besitzer-Rechte keine Rolle spielen und der Besitz durch den Admin (der ausführende) übernommen werden. Das Script wird mit dem Zielordner als Parameter gestartet (nimmrechte.cmd <ziel>). Achtung: Das ä ist schon ein ANSI-Ä, also Kommandozeilen-Kompatibel.

REM --- Besitz uebernehmen
takeown /F %1 /R /D J

REM --- Rechte korrekt setzen
icacls %1 /inheritance:r /grant:r "<domaene>Dom„nen-Admins":(OI)(CI)F /T /grant "<domaene>%1":(OI)(CI)F /T /remove "benutzer" /t /remove "Ersteller-Besitzer" /remove "system"

REM --- Vererbung innerhalb des Ordners wieder aktivieren
icacls %1* /inheritance:e /T