Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

Für DevOps-Ingenieure und Systemadministratoren sind Snapshots virtueller Maschinen (VMs) ein grundlegendes Werkzeug. Sie bieten eine schnelle und bequeme Möglichkeit, den Zustand eines Servers vor einem riskanten Patch, einer größeren Konfigurationsänderung oder einer Anwendungsbereitstellung zu erfassen. Sollte etwas schiefgehen, dauert das Rollback nur Sekunden.

Wenn jedoch dieselbe Methodik auf transaktionale Datenbanken angewendet wird – wie PostgreSQL, MySQL, Oracle oder Microsoft SQL Server – verwandeln sich VM-Snapshots von einem Sicherheitsnetz in eine tickende Zeitbombe.

Das Vertrauen auf Standard-Hypervisor-Snapshots für Datenbank-Backups ist eine der häufigsten Ursachen für Datenkorruption, zerrissene Seiten (torn pages) und nicht wiederherstellbare Produktionsausfälle. In diesem Artikel untersuchen wir den architektonischen Konflikt zwischen Hypervisoren und Datenbank-Engines, die Mechanismen der Datenkorruption während Snapshots sowie die technischen Best Practices, die für eine sichere Sicherung virtualisierter Datenbanken erforderlich sind.

Der Architektur-Konflikt: Hypervisoren vs. Datenbank-Engines

Um zu verstehen, warum VM-Snapshots Datenbanken gefährden, müssen wir zunächst untersuchen, wie beide Systeme den Status und die E/A-Operationen verwalten.

Wie Hypervisoren Snapshots ausführen

Wenn ein Hypervisor (wie VMware ESXi, Microsoft Hyper-V oder KVM) einen Snapshot erstellt, kopiert er nicht die Festplatte. Stattdessen friert er die aktuelle virtuelle Festplattendatei (z. B. .vmdk oder .vhdx) in einen schreibgeschützten Zustand ein und erstellt eine neue Delta-Festplatte (Differenzdisk). Alle nachfolgenden Schreibvorgänge werden auf diese Delta-Festplatte umgeleitet.

Wenn der Snapshot gelöscht wird, muss der Hypervisor die Daten von der Delta-Festplatte zurück in die Basis-Festplatte übertragen (konsolidieren). Standard-Snapshots sind sich der Anwendungen, die im Gastbetriebssystem ausgeführt werden, nicht bewusst. Sie erfassen den Festplattenzustand genau so, wie er in dieser Mikrosekunde existiert.

Wie transaktionale Datenbanken den Status verwalten

Transaktionale Datenbanken basieren auf ACID-Eigenschaften (Atomicity, Consistency, Isolation, Durability). Um eine hohe Leistung bei gleichzeitiger ACID-Konformität zu erreichen, schreiben Datenbanken nicht jede Transaktion sofort direkt in die primären Datendateien auf der Festplatte. Stattdessen verwenden sie eine komplexe, mehrstufige Architektur:

  1. Buffer Pool / Shared Buffers: Daten werden in den Systemspeicher gelesen und dort modifiziert.
  2. Write-Ahead Log (WAL) / Redo Logs: Änderungen werden sequenziell in eine hochoptimierte Protokolldatei auf der Festplatte geschrieben, um die Dauerhaftigkeit zu gewährleisten.
  3. Checkpoints / Lazy Writers: In regelmäßigen Abständen schreibt die Datenbank die modifizierten (dirty) Seiten aus dem Speicher in die eigentlichen Datendateien auf der Festplatte.

Aufgrund dieser Architektur sind die physischen Datendateien auf der Festplatte fast immer nicht synchron mit dem tatsächlichen Zustand der Datenbank. Der wahre Zustand der Datenbank existiert nur als Kombination aus den Datendateien auf der Festplatte, den WAL/Redo-Logs und den Daten, die sich aktuell im Speicher befinden.

Die Gefahrenzone: Was während eines VM-Snapshots passiert

Wenn Sie einen Standard-VM-Snapshot eines Datenbankservers erstellen, erfassen Sie einen absturzkonsistenten (crash-consistent) Zustand.

Absturzkonsistenz vs. Anwendungskonsistenz

Ein absturzkonsistenter Snapshot entspricht dem Ziehen des Netzsteckers aus dem physischen Server. Der Festplattenzustand wird erfasst, aber alles, was sich im Speicher befand, geht verloren, und alles, was sich gerade auf dem Weg zum Speichercontroller befand, wird abrupt unterbrochen.

Obwohl moderne Datenbanken darauf ausgelegt sind, sich nach einem unerwarteten Stromausfall durch das erneute Abspielen des Write-Ahead Logs zu erholen, ist es äußerst gefährlich, sich bei der Backup-Strategie auf die Crash-Recovery zu verlassen. Wenn Ihre Datenbank mehrere virtuelle Festplatten umfasst (z. B. Datendateien auf Laufwerk D: und WAL auf Laufwerk E:), erstellt der Hypervisor möglicherweise nicht für beide Festplatten exakt in derselben Mikrosekunde einen Snapshot. Wenn der Snapshot der WAL-Festplatte auch nur einen Bruchteil einer Sekunde nach dem Snapshot der Datenfestplatte erstellt wird, kann die Datenbank die Sequenznummern bei der Wiederherstellung nicht abgleichen, was zu einer fatalen Korruption führt.

Der „VM Stun“-Effekt bei hochtransaktionalen Systemen

Der Prozess der Snapshot-Erstellung – und noch wichtiger, der Prozess der Snapshot-Konsolidierung – verursacht ein Phänomen, das als „VM Stun“ bekannt ist.

Um die E/A sicher von der Basis-Festplatte auf die Delta-Festplatte umzuschalten, muss der Hypervisor die virtuelle Maschine kurzzeitig anhalten (stun). Bei einem leicht ausgelasteten Webserver kann dieser Stun 10-50 Millisekunden dauern und unbemerkt bleiben. Bei einer Datenbank mit hohem Durchsatz und massiver E/A kann die Konsolidierung einer großen Delta-Festplatte die VM jedoch für mehrere Sekunden anhalten.

Während eines VM Stun:
* Netzwerkverbindungen brechen ab, was zu Anwendungs-Timeouts führt.
* Hochverfügbarkeitscluster (wie SQL Server Always On, PostgreSQL Patroni oder MySQL Galera) verpassen Heartbeat-Prüfungen.
* Der Cluster geht möglicherweise davon aus, dass der angehaltene Knoten ausgefallen ist, was ein unnötiges und störendes Failover (Split-Brain-Szenario) auslöst.

Zerrissene Seiten (Torn Pages) und E/A-Fehlausrichtung

Datenbank-Engines schreiben Daten normalerweise in spezifischen Seitengrößen (z. B. 8 KB für PostgreSQL und SQL Server, 16 KB für InnoDB). Das zugrunde liegende Betriebssystem und die Speicher-Arrays verarbeiten E/A jedoch in kleineren Blöcken (z. B. 4 KB oder 512 Bytes).

Wenn ein Hypervisor einen Snapshot genau dann erstellt, während die Datenbank eine 8-KB-Seite schreibt, erfasst der Snapshot möglicherweise die ersten 4 KB der neuen Daten und die letzten 4 KB der alten Daten. Dies erzeugt eine zerrissene Seite. Wenn Sie versuchen, den Snapshot wiederherzustellen, liest die Datenbank die Seite, die Prüfsummenvalidierung schlägt fehl und die Datenbank wird als korrupt markiert.

Reale Konsequenzen für spezifische Datenbank-Engines

Verschiedene Datenbank-Engines reagieren unterschiedlich auf absturzkonsistente Snapshots, aber keine von ihnen verarbeitet dies in einer Produktionsumgebung problemlos.

  • PostgreSQL: PostgreSQL verlässt sich stark auf das pg_wal-Verzeichnis. Wenn ein Snapshot das Datenverzeichnis ($PGDATA) und das WAL nicht synchron erfasst, startet PostgreSQL nicht mehr und gibt den Fehler PANIC: could not locate a valid checkpoint record aus.
  • MySQL/InnoDB: InnoDB verwendet einen Doublewrite-Buffer, um zerrissene Seiten zu verhindern, was einen gewissen Schutz gegen absturzkonsistente Zustände bietet. Wenn jedoch die ibdata1-Datei und das ib_logfile nicht synchron erfasst werden, stürzt die InnoDB-Engine bei der Wiederherstellung ab.
  • Microsoft SQL Server: SQL Server reagiert sehr empfindlich auf das Einfrieren von E/A. Ohne ordnungsgemäße VSS-Integration (Volume Shadow Copy Service) führt die Wiederherstellung eines SQL Servers aus einem Standard-VM-Snapshot oft zu „suspect“-Datenbanken und unterbrochenen Protokollketten, was Ihre Point-in-Time-Recovery-Fähigkeiten (PITR) zerstört.

Best Practices für die sichere Sicherung virtualisierter Datenbanken

Um transaktionale Datenbanken zu schützen, müssen Sie von absturzkonsistenten Backups zu anwendungskonsistenten Backups übergehen. Dies erfordert, dass der Backup-Mechanismus mit der Datenbank-Engine kommuniziert, sie zwingt, den Speicher auf die Festplatte zu leeren und die E/A-Operationen kurzzeitig anzuhalten, während der Snapshot erstellt wird.

1. Nutzen Sie anwendungsbewusstes Quiescing (VSS und fsfreeze)

Für Windows (SQL Server):
Stellen Sie sicher, dass Ihre Backup-Lösung den Microsoft Volume Shadow Copy Service (VSS) verwendet. Wenn ein VSS-fähiges Backup ausgelöst wird, friert der SQL Server VSS Writer die Datenbank-E/A ein, leert ausstehende Transaktionen auf die Festplatte und stellt sicher, dass der Snapshot perfekt anwendungskonsistent ist.

Für Linux (PostgreSQL / MySQL):
Linux hat kein natives Äquivalent zu VSS. Um Anwendungskonsistenz zu erreichen, müssen Sie Pre-Freeze- und Post-Thaw-Skripte in Verbindung mit den Gast-Tools des Hypervisors (z. B. VMware Tools) verwenden.

Hier ist ein Beispiel für ein VMware pre-freeze-script für PostgreSQL 15+, das die Datenbank sicher auf einen Snapshot vorbereitet:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# Stellen Sie sicher, dass dieses Skript ausführbar ist (chmod +x)

# 1. PostgreSQL anweisen, sich auf ein Backup vorzubereiten
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. Dateisystem-Puffer auf die Festplatte leeren
sync

# 3. Dateisystem einfrieren (unter der Annahme, dass die Daten unter /var/lib/pgsql liegen)
fsfreeze -f /var/lib/pgsql

Und das entsprechende post-thaw-script, um den Betrieb fortzusetzen:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. Dateisystem auftauen
fsfreeze -u /var/lib/pgsql

# 2. PostgreSQL mitteilen, dass das Backup abgeschlossen ist
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. Verwenden Sie native Datenbank-Backup-Dienstprogramme

Obwohl anwendungskonsistente Snapshots besser sind als Standard-Snapshots, bergen sie immer noch das Risiko eines VM Stun. Der sicherste Ansatz für Datenbank-Backups ist die Verwendung nativer Streaming-Backup-Dienstprogramme, die unabhängig vom Hypervisor arbeiten.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
Diese Tools erstellen Hot-Backups ohne Blockierung, indem sie die Datendateien kopieren und gleichzeitig Änderungen im Redo-Log verfolgen.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. Implementieren Sie Point-in-Time Recovery (PITR) durch Protokollarchivierung

Ein täglicher Snapshot oder ein vollständiges Backup schützt Sie nur bis zu dem Zeitpunkt, an dem es erstellt wurde. Wenn Ihre Datenbank um 16:00 Uhr abstürzt und Ihr letzter Snapshot um 02:00 Uhr morgens war, verlieren Sie 14 Stunden an transaktionalen Daten.

Um eine echte Unternehmensresilienz zu erreichen, müssen Sie vollständige anwendungskonsistente Backups mit kontinuierlicher Protokollarchivierung kombinieren (Sicherung der WAL-, Redo- oder Transaktionsprotokolle alle paar Minuten). Dies ermöglicht es Datenbankadministratoren, die Datenbank auf eine bestimmte Minute oder sogar eine bestimmte Transaktions-ID vor einem Vorfall wiederherzustellen.

Enterprise-Backup-Strategien mit CloudSave

Die Verwaltung benutzerdefinierter Pre-Freeze-Skripte, Cron-Jobs für native Dumps und Log-Shipping über Dutzende von Datenbankservern hinweg ist ein operativer Albtraum für DevOps-Teams. Hier wird eine Enterprise-Plattform wie CloudSave entscheidend.

CloudSave schließt die Lücke zwischen Virtualisierung und Datenbankarchitektur. Anstatt sich auf blinde Hypervisor-Snapshots zu verlassen, nutzt CloudSave anwendungsbewusste Agenten, die nativ in SQL Server, PostgreSQL, MySQL und Oracle integriert sind.

Wenn CloudSave ein Backup initiiert:
1. Kommuniziert es direkt mit der Datenbank-Engine über native APIs (wie VSS für Windows oder natives WAL-Streaming für Linux).
2. Orchestriert es das Leeren der Speicherpuffer auf die Festplatte, ohne störende VM Stuns zu verursachen.
3. Erfasst es sicher die Datendateien und verwaltet automatisch die Kürzung der Transaktionsprotokolle.
4. Sichert es kontinuierlich Transaktionsprotokolle, was eine granulare Point-in-Time Recovery (PITR) mit wenigen Klicks ermöglicht.

Durch die Auslagerung der Komplexität der Anwendungskonsistenz an CloudSave können Datenbankadministratoren und Systemadministratoren die Datenintegrität garantieren, ohne die Leistung oder Verfügbarkeit ihrer Produktionscluster zu opfern.

Fazit

Snapshots virtueller Maschinen sind ein unglaubliches Werkzeug für das Infrastrukturmanagement, aber sie sind grundlegend inkompatibel mit den ACID-Anforderungen transaktionaler Datenbanken. Das Vertrauen auf absturzkonsistente Hypervisor-Snapshots setzt Ihr Unternehmen zerrissenen Seiten, unterbrochenen Replikationsketten und katastrophalem Datenverlust aus.

Um Ihre geschäftskritischen Daten zu schützen, müssen Sie anwendungsbewusstes Quiescing implementieren, native Datenbank-Backup-Methoden nutzen und kontinuierliche Transaktionsprotokoll-Archive pflegen. Durch die Einführung zweckgebundener Enterprise-Backup-Lösungen können Sie sicherstellen, dass Ihre Datenbanken hochverfügbar, vollständig wiederherstellbar und absolut sicher bleiben.