Inkrementelle Sicherungen der Zertifizierungsstellen-Datenbank schlagen fehl mit der Fehlermeldung "The database missed a previous full backup before incremental backup"

Folgendes Szenario angenommen:

  • Man verwendet certutil.exe oder das PowerShell Commandlet Backup-CAService, um seine Active Directory Certificate Services Datenbank zu sichern.
  • Nebst einem Vollbackup führt man auch regelmäßige inkrementelle Sicherungen der CA-Datenbank durch.
  • Die inkrementellen Sicherungen schlagen mit Fehlermeldung "The database missed a previous full backup before incremental backup" fehl.
Incremental database backup for…
Backing up Log files: 0%CertUtil: -backupDB command FAILED: 0xc8000230 (ESE: -560 JET_errMissingFullBackup)
CertUtil: The database missed a previous full backup before incremental backup

Die Information, wann zuletzt eine vollständige Sicherung durchgeführt wurde, sind an zwei Stellen hinterlegt:

  • In der Registrierungsdatenbank des Zertifizierungsstellen-Dienstes unter HKLM:\CurrentControlSet\Services\CertSvc\Configuration\ im Wert "DBLastFullBackup".
  • In den Header-Daten der Zertifizierungsstellen-Datenbank.

Aus der Registrierung des Zertifizierungsstellendienstes bekommt man die Information am einfachsten, in welchem man folgenden Befehl ausführt:

certutil -getreg DBLastFullBackup

Beispiel:

certutil -getreg DBLastFullBackup
DBLastFullBackup REG_BINARY = 19.12.2018 20:00

Aus der Zertifizierungsstellen-Datenbank bekommt man die Information mit einem esentutl-Befehl, welcher die Header-Informationen ausgibt:

esentutl /mh <Pfad-zur-Zertifizierungsstellen-Datenbank>.edb

Zu beachten ist, dass hierfür der Zertifizierungsstellen-Dienst angehalten werden muss, da esentutl sonst nicht auf die Datenbank zugreifen kann und mit folgenden Fehler abbricht:

Operation terminated with error -1032 (JET_errFileAccessDenied, Cannot access file, the file is locked or in use) after 0.16 seconds.

Wenn der Befehl erfolgreich ausgeführt wurde, sehen wir uns die Sektion "Previous Full Backup" an.

Beispiel:

esentutl /mh "C:\Windows\System32\CertLog\ADCSLabor Root CA.edb"
Previous Full Backup:
Log Gen: 167-189 (0xa7-0xbd) - OSSnapshot
Mark: (0xBE,1,0)
Mark: 12/19/2018 22:16:49.142

Im vorliegenden Fall sieht man, dass sich die Werte aus Registrierung und Zertifizierungsstellen-Datenbank unterscheiden. Im "Log Gen" Bereich sieht man außerdem, dass die letzte Vollsicherung durch einen Betriebssystem-Schnappschuss (OSSnapshot) gemacht wurde. Entsprechende Einträge waren auch in der Ereignisanzeige der Maschine zu finden:

Wie sich herausstellte, war die betreffende Zertifizierungsstelle auf einer virtuellen Maschine installiert und wurde nebst geskripteter Sicherung auch noch mittels Schnappschuss der virtuellen Maschine gesichert.

Da die Zertifizierungsstellen-Datenbank vom Betriebssystem über Volumeschattenkopien (Volume Shadow Copy) informiert wird, wird dieser Schnappschuss als die letzte erfolgreiche Sicherung gespeichert.

Hierbei handelt es sich um eine Funktion der Extensible Storage Engine (ESE) Datenbank, von welcher der Zertifizierungsstellen-Dienst jedoch nichts mitbekommt. Darum weichen die beiden Werte nun voneinander ab. Certutil versucht vergeblich, ein Inkrement zur letzten geskripteten Sicherung zu machen.

Die Lösung ist, die beiden Sicherungsprozesse aufeinander abzustimmen, sodass die geskriptete Vollsicherung der Zertifizierungsstellen-Datenbank immer erst dann erfolgt, wenn der Schnappschuss der virtuellen Maschine bereits erfolgt ist, und dass die inkrementellen Sicherungen aufhören, bevor der nächste Schnappschuss erfolgt.

Üblicherweise werden die virtuellen Maschinen nacheinander gesichert, sodass nie exakt garantiert werden kann, wann die Zertifizierungsstelle an die Reihe kommt, daher sollte dieses Zeitfenster großzügig geplant werden.

Weiterführende Links:

Externe Quellen