1 Punkte von GN⁺ 2025-12-24 | Noch keine Kommentare. | Auf WhatsApp teilen
  • PostgreSQL 18 kann Datenbanken nahezu sofort klonen, indem es die Dateikopierstrategie (FILE_COPY) mit Dateisystem-Klonfunktionen kombiniert
  • Mit dem neuen Konfigurationswert file_copy_method = clone lassen sich Klonfunktionen moderner Dateisysteme (FICLONE) wie XFS, ZFS und APFS nutzen
  • Benchmark-Ergebnisse zeigen: Beim Klonen einer 6-GB-Datenbank benötigt die bisherige WAL_LOG-Methode etwa 67 Sekunden, die Klonmethode dagegen nur rund 0,2 Sekunden
  • Geklonte Datenbanken teilen sich anfangs dieselben physischen Blöcke, werden bei Schreibvorgängen aber per Copy-on-Write getrennt
  • Allerdings ist das Klonen nur ohne aktive Verbindungen möglich und funktioniert nur innerhalb eines einzelnen Dateisystems

PostgreSQLs templatebasierte Klonstruktur

  • PostgreSQL erstellt bei CREATE DATABASE dbname intern eine Kopie der Datenbank template1 und erzeugt daraus die neue Datenbank
    • Das entspricht dem Verhalten von CREATE DATABASE dbname TEMPLATE template1
  • Statt template1 kann auch eine andere Datenbank angegeben werden, sodass Klonen mit benutzerdefinierten Templates möglich ist
  • In PostgreSQL 18 wurde dieses Template-System zu einer Struktur für sofortiges Klonen erweitert

CREATE DATABASE ... STRATEGY

  • Seit PostgreSQL 15 gibt es den Parameter CREATE DATABASE ... STRATEGY, mit dem sich die Klonmethode auswählen lässt
    • Der Standardwert ist WAL_LOG und führt blockweises Klonen über das Write-Ahead Log aus
    • Diese Methode reduziert die I/O-Last und verbessert die Unterstützung für Parallelität, ist bei großen Klonvorgängen aber langsam
  • Mit STRATEGY=FILE_COPY lässt sich zur klassischen Dateikopiermethode zurückkehren; PostgreSQL 18 ergänzt darauf aufbauend eine neue Klonoption

FILE_COPY und file_copy_method

  • Die Einstellung file_copy_method in PostgreSQL 18 steuert die Dateikopiermethode auf Betriebssystemebene
    • Der Standardwert ist copy; dabei werden alle Bytes gelesen und an einen neuen Ort geschrieben
    • Bei clone wird die Klonfunktion des Dateisystems (FICLONE) verwendet, wodurch sofortiges Klonen ohne zusätzlichen Platzverbrauch möglich wird
  • Unterstützte Dateisysteme: XFS, ZFS, APFS, FreeBSD ZFS
  • Einrichtung
    • Den PostgreSQL-Cluster auf einem entsprechenden Dateisystem betreiben
    • file_copy_method = clone setzen und die Konfiguration neu laden

Benchmark-Ergebnisse

  • Nach dem Erstellen einer Testdatenbank (source_db) mit rund 6 GB wurden zwei Methoden verglichen
    • WAL_LOG: 67.000ms (etwa 67 Sekunden)
    • FILE_COPY + clone: 212ms
  • Bei derselben Datenmenge ergibt sich eine mehr als 300-fache Beschleunigung
  • Die geklonte Datenbank (fast_clone) belegt nahezu keinen zusätzlichen Speicherplatz

Funktionsweise der geklonten Daten

  • Bei Verwendung von file_copy_method = clone werden nur die Dateisystem-Metadaten geklont, sodass beide Datenbanken dieselben physischen Blöcke gemeinsam nutzen
  • Die von PostgreSQL gemeldete Datenbankgröße bleibt die logische Größe (rund 6 GB)
  • Bei Schreibvorgängen greift Copy-on-Write (COW) und trennt die betroffenen Seiten
    • Seiten mit geänderten Zeilen
    • Seiten, auf die neue Tupel geschrieben werden
    • Indexseiten sowie FSM-, Visibility-Map-Seiten usw.
  • Auch bei einem VACUUM werden zusätzliche Seiten getrennt

Verifikation gemeinsam genutzter Blöcke unter XFS

  • Mit dem Befehl filefrag -v lässt sich prüfen, ob zwei Datenbanken physische Blöcke gemeinsam nutzen
    • Im Ausgangszustand sind alle Extents als shared markiert
    • Werden einige Zeilen aktualisiert, werden die ersten 40 Blöcke (etwa 160 KB) getrennt und auf andere physische Adressen verschoben
    • Die übrigen Extents bleiben weiterhin gemeinsam genutzt

Hinweise und Einschränkungen

  • Beim Klonen darf es keine aktiven Verbindungen zur Quelldatenbank geben
    • Das ist eine Einschränkung von PostgreSQL, kein Problem des Dateisystems
    • In produktiven Umgebungen ist die Nutzung einer separaten Template-Datenbank üblich
  • Klonen ist nur innerhalb eines einzelnen Dateisystems möglich
    • Wenn mehrere Tablespaces auf unterschiedlichen Mount-Points liegen, wird auf normales Kopieren zurückgefallen
  • In verwalteten Cloud-Diensten (AWS RDS, Google Cloud SQL usw.) ist diese Funktion nicht nutzbar, da kein Zugriff auf das Dateisystem möglich ist
    • Auf eigenen VMs oder Bare-Metal-Systemen ist vollständige Kontrolle möglich

Fazit

  • Die Funktion file_copy_method = clone in PostgreSQL 18 nutzt Klonfunktionen auf Betriebssystemebene direkt, um
    die Klonzeit großer Datenbanken drastisch zu verkürzen
  • Damit lassen sich in Test-, Entwicklungs- und Lernumgebungen Datenbank-Workflows mit sofortigem Klonen und schnellem Reset umsetzen
  • Dabei müssen jedoch die Einschränkung aktiver Verbindungen und die Bindung an ein einzelnes Dateisystem in der Betriebsarchitektur berücksichtigt werden

Noch keine Kommentare.

Noch keine Kommentare.