Der Doublewrite Buffer: Schutz vor Torn Pages erklärt
AI generated
InnoDB
SQL
MySQL · InnoDB · Datenintegrität
Der Doublewrite Buffer
Schutz vor Torn Pages erklärt

Eine InnoDB-Page ist größer als der atomare Schreibblock der meisten Speichersysteme, wodurch ein Stromausfall mitten im Schreibvorgang eine Page halb alt und halb neu zurücklassen kann. Der Doublewrite Buffer ist der Mechanismus, der genau dieses Szenario, den Torn Page, zuverlässig verhindert. Dieser Artikel erklärt die Funktionsweise, die Performance-Kosten und wann sich eine Deaktivierung überhaupt lohnt.

17 Min. Lesezeit Torn Page · innodb_doublewrite · Atomic Writes MySQL 8.0 · MariaDB 10.x

1. Was ein Torn Page Write ist

Eine InnoDB-Datenseite ist standardmäßig 16 KB groß, während die meisten Speichersysteme nur deutlich kleinere Einheiten atomar schreiben können, häufig 512 Bytes oder 4 KB. Diese Diskrepanz ist die Grundlage für das Problem, das der Doublewrite Buffer löst: Schreibt InnoDB eine 16 KB große Page auf die Platte und stürzt der Server oder das Storage-System mitten in diesem Schreibvorgang ab, etwa durch einen Stromausfall, kann die Page teilweise mit alten und teilweise mit neuen Daten auf der Platte landen. Dieser inkonsistente Zustand wird als Torn Page bezeichnet, zu Deutsch etwa zerrissene Seite.

Eine Torn Page ist für InnoDB katastrophal, weil weder das Redo Log noch die Crash-Recovery-Logik damit umgehen können. Das Redo Log geht davon aus, dass die zu reparierende Page zumindest in einem konsistenten, wenn auch veralteten Zustand vorliegt, auf den die Redo-Einträge angewendet werden können. Eine Page, die aus einer Mischung von zwei verschiedenen Schreibvorgängen besteht, lässt sich so nicht reparieren, und die Prüfsumme der Page schlägt fehl. Ohne einen zusätzlichen Schutzmechanismus könnte ein einziger unglücklich getimter Stromausfall eine Tabelle dauerhaft beschädigen.

Das Risiko ist keineswegs theoretisch. In virtualisierten Umgebungen, bei denen mehrere Schichten aus Hypervisor, Netzwerk-Storage und physischer Hardware zwischen dem Schreibaufruf von InnoDB und der tatsächlichen Persistierung liegen, steigt die Wahrscheinlichkeit eines unvollständigen Schreibvorgangs zusätzlich, weil jede Schicht eigene Puffer und eigene Fehlerquellen mitbringt. Genau deshalb ist der Doublewrite Buffer seit den Anfängen von InnoDB ein Standardbestandteil und keine optionale Zusatzfunktion.

2. Wie der Doublewrite Buffer funktioniert

Der Doublewrite Buffer löst das Problem, indem InnoDB jede Page, bevor sie an ihre eigentliche Position in den Tablespace-Dateien geschrieben wird, zunächst sequentiell in einen dedizierten Zwischenspeicherbereich schreibt, den Doublewrite-Bereich. Dieser Zwischenschritt erfolgt in großen, sequentiellen Schreibvorgängen, was den zusätzlichen I/O-Aufwand im Vergleich zu wahllosen Einzelschreibvorgängen deutlich reduziert. Erst nachdem dieser Zwischenschritt erfolgreich mit fsync abgeschlossen wurde, schreibt InnoDB die Page an ihre finale Position in der eigentlichen Tablespace-Datei.

Stürzt das System während des zweiten Schreibvorgangs ab, entsteht zwar theoretisch wieder eine Torn Page an der finalen Position, aber InnoDB hat jetzt eine intakte Kopie der Page im Doublewrite-Bereich zur Verfügung. Beim Crash Recovery prüft InnoDB jede Page anhand ihrer Prüfsumme. Erkennt InnoDB eine beschädigte Page in der Tablespace-Datei, wird sie einfach durch die intakte Kopie aus dem Doublewrite Buffer ersetzt, bevor die reguläre Redo-Log-Wiederherstellung beginnt. Dieser zweistufige Ansatz garantiert, dass am Ende immer mindestens eine konsistente Version jeder Page verfügbar ist.

Wichtig ist dabei die Reihenfolge der Operationen: Der Doublewrite-Bereich selbst wird ebenfalls mit einer eigenen Prüfsumme abgesichert, sodass InnoDB erkennen kann, ob auch dieser Zwischenschritt vollständig und korrekt abgeschlossen wurde. Nur eine Page, deren Prüfsumme im Doublewrite-Bereich gültig ist, wird als Reparaturquelle akzeptiert. Diese doppelte Absicherung stellt sicher, dass der Doublewrite Buffer selbst nicht zur Schwachstelle wird, sollte auch der Zwischenschritt einmal unvollständig bleiben.


-- Verify doublewrite buffer is active (default: ON)
SHOW VARIABLES LIKE 'innodb_doublewrite';

-- Conceptual write sequence for a single page update:
-- 1. Page modified in buffer pool
-- 2. Page written sequentially to doublewrite area (fsync)
-- 3. Page written to its final position in the tablespace file
-- 4. On crash between step 2 and 3: recovery restores page from
--    the doublewrite area before applying redo log entries

3. Aufbau seit MySQL 8.0.20

Bis MySQL 8.0.19 lag der Doublewrite Buffer physisch im System-Tablespace, was bei stark parallelisierten Workloads zu Contention führen konnte, da mehrere Threads um denselben Bereich konkurrierten. Seit MySQL 8.0.20 wurde die Implementierung grundlegend überarbeitet: Der Doublewrite-Bereich liegt jetzt in separaten Dateien außerhalb des System-Tablespace, standardmäßig im Datenverzeichnis, konfigurierbar über innodb_doublewrite_dir. Zusätzlich unterstützt die neue Implementierung parallele Doublewrite-Dateien pro Buffer-Pool-Instanz, was die Contention bei hoher Nebenläufigkeit deutlich reduziert.

Die Größe des Doublewrite-Bereichs wird über innodb_doublewrite_files und innodb_doublewrite_pages gesteuert. In den meisten Fällen sind die Standardwerte ausreichend dimensioniert, doch bei sehr schreiblastigen Systemen mit vielen parallelen Flush-Threads kann eine Anpassung der Anzahl der Doublewrite-Dateien die Performance verbessern, weil weniger Threads sich denselben Bereich teilen müssen.

Ein weiterer Vorteil der überarbeiteten Implementierung ist die bessere Beobachtbarkeit: Die separaten Doublewrite-Dateien lassen sich im Dateisystem direkt einsehen und ihre Größe über normale Betriebssystem-Tools überwachen, was vor MySQL 8.0.20 nicht möglich war, da der Bereich Teil der monolithischen System-Tablespace-Datei war.


# /etc/mysql/conf.d/innodb-doublewrite.cnf
[mysqld]
innodb_doublewrite = ON
innodb_doublewrite_dir = /var/lib/mysql-doublewrite
innodb_doublewrite_files = 2
innodb_doublewrite_pages = 128
innodb_doublewrite_batch_size = 120

4. Performance-Kosten messen

Der offensichtliche Nachteil des Doublewrite Buffer ist der zusätzliche I/O-Aufwand: Jede Page wird effektiv zweimal geschrieben, einmal in den Doublewrite-Bereich und einmal an ihre finale Position. In Benchmarks liegt der gemessene Overhead je nach Storage-Hardware typischerweise zwischen 5 und 15 Prozent bei schreiblastigen Workloads, kann aber auf langsamen, rotierenden Festplatten deutlich höher ausfallen. Auf modernen NVMe-SSDs mit hoher I/O-Bandbreite fällt der relative Overhead spürbar geringer aus, weil der sequentielle Doublewrite-Schreibvorgang von diesen Geräten sehr effizient verarbeitet wird.

Um den tatsächlichen Einfluss auf das eigene System zu messen, empfiehlt sich ein direkter Vergleich mit einem Benchmark-Tool wie sysbench, einmal mit aktiviertem und einmal mit deaktiviertem Doublewrite Buffer auf einem Testsystem. Wichtig dabei: Eine Deaktivierung sollte niemals ohne Messung und niemals auf Produktionsdaten getestet werden, da das Risiko eines Torn Page Write dann ungeschützt besteht.


# Compare write-heavy throughput with and without doublewrite buffer
# Run on a disposable test instance only, never in production

sysbench oltp_write_only --mysql-db=bench --tables=10 --table-size=1000000 \
  --threads=16 --time=120 prepare

# Baseline: doublewrite enabled (default)
sysbench oltp_write_only --mysql-db=bench --tables=10 --table-size=1000000 \
  --threads=16 --time=120 run

# Compare: doublewrite disabled (test system only)
mysql -e "SET GLOBAL innodb_doublewrite = OFF;"
sysbench oltp_write_only --mysql-db=bench --tables=10 --table-size=1000000 \
  --threads=16 --time=120 run

Neben dem reinen Durchsatz lohnt sich auch ein Blick auf die Latenzverteilung einzelner Schreibvorgänge, nicht nur auf den Durchschnittswert. Der Doublewrite Buffer kann in seltenen Fällen zu kurzzeitigen Latenzspitzen führen, wenn viele Flush-Threads gleichzeitig auf denselben Doublewrite-Bereich zugreifen, was sich in Perzentil-Messungen wie p99 deutlicher zeigt als im reinen Mittelwert.

5. Wann Deaktivierung sinnvoll ist: Atomic Writes

Der Doublewrite Buffer ist nur dann notwendig, wenn das darunterliegende Storage-System keine atomaren Schreibvorgänge in Page-Größe garantieren kann. Manche spezialisierten Storage-Lösungen, etwa bestimmte Enterprise-SSDs mit Power-Loss-Protection oder Dateisysteme wie ZFS mit Copy-on-Write-Semantik, garantieren bereits auf Hardware- oder Dateisystemebene, dass ein Schreibvorgang entweder vollständig oder gar nicht ankommt. In diesen Fällen ist ein Torn Page Write technisch unmöglich, wodurch der Doublewrite Buffer keinen zusätzlichen Schutz mehr bietet und nur noch Overhead verursacht.

MySQL unterstützt für solche Szenarien die Option innodb_doublewrite=OFF in Kombination mit Storage-Systemen, die Atomic Writes garantieren, etwa Fusion-io-Karten mit entsprechender Firmware-Unterstützung. Wichtig: Diese Entscheidung darf niemals auf Verdacht getroffen werden. Wer nicht mit absoluter Sicherheit nachweisen kann, dass das eigene Storage-System atomare Page-Writes garantiert, sollte den Doublewrite Buffer aktiviert lassen, denn die Kosten eines beschädigten Produktionssystems übersteigen den Performance-Gewinn um ein Vielfaches.

Ein belastbarer Nachweis erfordert in der Regel Rücksprache mit dem Storage-Hersteller oder Cloud-Anbieter sowie gezielte Crash-Tests unter kontrollierten Bedingungen, etwa durch abruptes Trennen der Stromversorgung eines Testsystems unter Last. Nur wenn diese Tests über mehrere Wiederholungen hinweg keine einzige Torn Page zeigen, gilt die Atomic-Write-Garantie als hinreichend belegt für eine produktive Deaktivierung.

6. Interaktion mit Dateisystem und Storage

Die Wirksamkeit des Doublewrite Buffer hängt eng mit dem verwendeten Dateisystem und dessen Umgang mit fsync zusammen. Bei Dateisystemen mit Copy-on-Write-Semantik wie ZFS oder Btrfs wird jede Änderung ohnehin nie in-place geschrieben, sondern immer als neuer Block angelegt, wodurch ein Torn Page Write auf Dateisystemebene bereits ausgeschlossen ist. In solchen Umgebungen entsteht durch den Doublewrite Buffer eine doppelte Absicherung, die zwar sicher, aber redundant ist und spürbare Performance kostet, ohne zusätzlichen Nutzen zu bringen.

Bei klassischen Dateisystemen wie ext4 oder XFS ohne Copy-on-Write ist der Doublewrite Buffer hingegen essenziell, da diese Dateisysteme Änderungen typischerweise in-place vornehmen und keine Garantie für atomare Schreibvorgänge in InnoDB-Page-Größe bieten. Auch der Einsatz von O_DIRECT für Dateizugriffe, was InnoDB standardmäßig nutzt, um den Betriebssystem-Cache zu umgehen, ändert an dieser Notwendigkeit nichts, da O_DIRECT die Atomarität eines Schreibvorgangs nicht garantiert, sondern lediglich Pufferungsebenen umgeht.

Auch RAID-Controller mit batteriegepuffertem Schreib-Cache, sogenannte Battery-Backed Write Cache Controller, bieten keinen automatischen Ersatz für den Doublewrite Buffer, obwohl sie umgangssprachlich oft in diesem Zusammenhang genannt werden. Ein BBWC schützt primär gegen den Verlust von Daten im Controller-Cache bei einem Stromausfall, garantiert aber nicht zwangsläufig, dass ein einzelner Schreibvorgang auf Page-Ebene atomar bei der Platte ankommt.

7. Monitoring der Doublewrite-Statusvariablen

InnoDB stellt mehrere Statusvariablen bereit, um die Aktivität des Doublewrite Buffer zu beobachten. Innodb_dblwr_pages_written zeigt die Gesamtzahl der über den Doublewrite-Mechanismus geschriebenen Pages, während Innodb_dblwr_writes die Anzahl der physischen Schreibvorgänge in den Doublewrite-Bereich selbst zählt. Das Verhältnis zwischen beiden Werten gibt Aufschluss darüber, wie effizient InnoDB mehrere Pages in einem einzigen Doublewrite-Schreibvorgang bündelt.

Ein deutlicher Anstieg von Innodb_dblwr_writes im Verhältnis zur normalen Schreiblast kann auf eine ungünstige Konfiguration der Flush-Parameter hindeuten, etwa wenn innodb_doublewrite_batch_size zu klein für den aktuellen Workload gewählt wurde. Ein regelmäßiger Blick auf diese Kennzahlen im Rahmen des allgemeinen I/O-Monitorings hilft, Performance-Probleme frühzeitig auf den Doublewrite-Mechanismus statt auf andere Ursachen zurückzuführen.


-- Monitor doublewrite buffer activity
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (
    'Innodb_dblwr_pages_written',
    'Innodb_dblwr_writes'
);

-- Ratio close to 1 means little batching; higher ratio means
-- multiple pages are bundled efficiently per doublewrite write

Ergänzend lohnt sich ein Blick auf die Ausgabe von SHOW ENGINE INNODB STATUS, die im Abschnitt zu Buffer-Pool und Speicher zusätzliche Kontextinformationen liefert, etwa wie viele Pending Writes gerade auf den Doublewrite-Bereich warten. Ein dauerhaft hoher Wert an Pending Writes deutet darauf hin, dass die konfigurierte Anzahl an Doublewrite-Dateien für die aktuelle Schreiblast nicht mehr ausreicht.

8. Fallstricke bei der Deaktivierung

Der häufigste Fehler im Umgang mit dem Doublewrite Buffer ist eine vorschnelle Deaktivierung zur Performance-Optimierung, ohne die Garantien des zugrunde liegenden Storage-Systems tatsächlich zu kennen. Cloud-Umgebungen sind hier besonders tückisch: Ein virtualisierter Block-Storage-Dienst kann sich nach außen wie ein normales Blockgerät verhalten, garantiert aber intern oft keine atomaren Schreibvorgänge in InnoDB-Page-Größe, selbst wenn die zugrunde liegende physische Hardware das theoretisch könnte.

Ein zweiter Fallstrick betrifft Backup- und Replikationsszenarien: Wird der Doublewrite Buffer auf einem Primärsystem deaktiviert, aber auf einer Replika mit anderem Storage-Backend aktiviert gelassen, oder umgekehrt, entstehen inkonsistente Sicherheitsgarantien innerhalb derselben Infrastruktur. Eine Deaktivierung sollte deshalb immer für die gesamte Topologie einheitlich entschieden und dokumentiert werden, nicht als isolierte Einzelfall-Optimierung auf einem Server.

Ein dritter Fallstrick entsteht bei Storage-Migrationen: Wechselt ein System von einer Hardware mit garantierten Atomic Writes zu einer neuen Plattform, etwa im Rahmen eines Cloud-Umzugs, ohne dass die Doublewrite-Konfiguration erneut geprüft wird, bleibt der Schutz möglicherweise deaktiviert, obwohl die neue Plattform die notwendigen Garantien gar nicht mehr bietet. Jede Storage-Migration sollte deshalb die Doublewrite-Einstellung als festen Punkt in der Abnahme-Checkliste enthalten.

9. Doublewrite vs. Atomic Writes vs. COW-FS

Die folgende Tabelle vergleicht die drei gängigen Strategien gegen Torn Pages.

Strategie Schutzebene Performance-Overhead Voraussetzung
Doublewrite Buffer InnoDB-intern 5 bis 15 Prozent Keine, funktioniert überall
Atomic Writes Hardware / Firmware Minimal Spezielle SSDs mit Power-Loss-Protection
Copy-on-Write-FS Dateisystem, z.B. ZFS/Btrfs Gering, abhängig vom FS CoW-Dateisystem korrekt konfiguriert

Für die überwiegende Mehrheit produktiver Systeme bleibt der Doublewrite Buffer die richtige, universell funktionierende Wahl. Atomic Writes und Copy-on-Write-Dateisysteme sind Optimierungen für spezielle Infrastrukturen, bei denen die zugrunde liegenden Garantien nachweislich vorhanden und dokumentiert sind, nicht für den Standardfall.

Eine sinnvolle Entscheidungsregel lautet: Solange keine dokumentierte, getestete Garantie für atomare Schreibvorgänge vorliegt, bleibt der Doublewrite Buffer aktiviert. Erst wenn diese Garantie schriftlich vom Storage-Anbieter bestätigt und durch eigene Crash-Tests verifiziert wurde, ist eine Deaktivierung eine verantwortbare Optimierung statt eines vermeidbaren Risikos.

Mironsoft

Storage-Architektur und InnoDB-Datenintegrität

Ist euer Storage-Setup wirklich Torn-Page-sicher?

Wir prüfen, ob euer Storage-Backend Atomic Writes tatsächlich garantiert, benchmarken den Doublewrite-Overhead auf eurer Hardware und dokumentieren eine belastbare Entscheidungsgrundlage.

Storage-Audit

Atomic-Write-Garantien der eingesetzten Hardware verifizieren

Performance-Benchmark

Doublewrite-Overhead unter realistischer Last messen

Konfigurationsreview

Konsistente Doublewrite-Einstellungen über die gesamte Topologie

10. Zusammenfassung

Der Doublewrite Buffer schützt InnoDB vor Torn Pages, indem jede Page zunächst sequentiell in einen dedizierten Zwischenspeicherbereich geschrieben wird, bevor sie an ihre finale Position im Tablespace gelangt. Stürzt das System während des zweiten Schreibvorgangs ab, kann InnoDB beim Crash Recovery auf die intakte Kopie aus dem Doublewrite-Bereich zurückgreifen und die beschädigte Page reparieren, bevor die reguläre Redo-Log-Wiederherstellung beginnt.

Der Performance-Overhead von typischerweise 5 bis 15 Prozent ist der Preis für diese Sicherheit und in den allermeisten Fällen gerechtfertigt. Nur wenn das Storage-System nachweislich atomare Page-Writes garantiert, etwa durch spezielle Hardware mit Power-Loss-Protection oder ein Copy-on-Write-Dateisystem, lohnt sich eine wohlüberlegte Deaktivierung, immer mit Benchmark-Nachweis und niemals auf Verdacht.

Wer den Mechanismus einmal verstanden hat, erkennt den Doublewrite Buffer nicht mehr als lästigen Performance-Bremser, sondern als das, was er ist: eine gezielte, gut durchdachte Absicherung gegen eines der heimtückischsten Fehlerbilder in der Datenbankwelt, das ohne diesen Schutz kaum zuverlässig erkennbar wäre.

Für Teams, die neue Datenbankinfrastruktur planen, lohnt sich deshalb, die Doublewrite-Frage frühzeitig als festen Bestandteil der Storage-Auswahl zu behandeln, statt sie erst nach einem Vorfall nachträglich zu klären.

Doublewrite Buffer, das Wichtigste auf einen Blick

Was er verhindert

Torn Pages, also teilweise geschriebene Datenseiten nach einem Absturz mitten im Schreibvorgang.

Mechanismus

Sequentieller Zwischen-Schreibvorgang in einen dedizierten Bereich, bevor die finale Position beschrieben wird.

Kosten

Typischerweise 5 bis 15 Prozent I/O-Overhead bei schreiblastigen Workloads, je nach Storage-Hardware.

Deaktivierung

Nur mit nachgewiesenen Atomic Writes oder Copy-on-Write-Dateisystem, sonst aktiviert lassen.

11. FAQ: Doublewrite Buffer

1Was ist eine Torn Page?
Eine Page, die durch einen Absturz mitten im Schreiben teilweise alt und teilweise neu auf der Platte landet, weil sie größer als der atomare Schreibblock ist.
2Wie schützt der Buffer davor?
Sequentieller Zwischen-Schreibvorgang mit fsync in einen dedizierten Bereich vor dem finalen Schreiben. Ermöglicht Reparatur bei Absturz.
3Wie hoch ist der Overhead?
Typischerweise 5 bis 15 Prozent bei schreiblastigen Workloads, geringer auf modernen NVMe-SSDs als auf HDDs.
4Einfach deaktivierbar?
Nur mit nachgewiesenen Atomic Writes des Storage-Systems. Ohne diese Garantie riskiert man Datenkorruption bei einem Absturz.
5Was änderte sich in 8.0.20?
Separate Dateien außerhalb des System-Tablespace, parallele Dateien pro Buffer-Pool-Instanz, weniger Contention.
6Nötig auf ZFS/Btrfs?
Copy-on-Write-Dateisysteme schließen Torn Pages bereits aus, der Doublewrite Buffer bringt dort weniger zusätzlichen Nutzen.
7Aktivität überwachen?
Innodb_dblwr_pages_written und Innodb_dblwr_writes aus performance_schema.global_status zeigen Bündelungseffizienz.
8Weniger wichtig in der Cloud?
Nicht unbedingt. Virtualisierter Block-Storage garantiert oft keine atomaren Page-Writes trotz möglicher Hardware-Fähigkeit.
9Was passiert ohne Buffer?
Prüfsumme schlägt fehl, weder Redo Log noch Recovery können reparieren, die Tabelle kann dauerhaft beschädigt bleiben.
10Beeinflusst O_DIRECT die Notwendigkeit?
Nein, O_DIRECT umgeht nur den OS-Cache, garantiert aber keine Atomarität. Doublewrite bleibt notwendig ohne Atomic Writes.