Migration MariaDB zu PostgreSQL

Einleitung

Dieser Leitfaden beschreibt den Prozess der Datenbankmigration für eine Relution-Instanz innerhalb einer Docker-Umgebung.

Voraussetzungen

Bevor Sie mit der Migration beginnen, stellen Sie sicher, dass folgende Bedingungen erfüllt sind:

  • Speicherplatz: Mindestens so viel freier Speicherplatz wie die aktuelle MariaDB-Datenbank groß ist (1:1 Verhältnis).
  • S3 Speicher: Ein kompatibler S3-Speicher muss bereits eingerichtet sein.
    Veraltet: Dokumentation zu S3/MinIO.
  • Version: Die Relution-Instanz sollte auf die die Version 26.0.0 aktualisiert werden, mindestens jedoch auf Version 5.31.0 aktualisiert sein.

Datensicherung (Optional)

Falls keine Snapshots der virtuellen Maschine oder externe Backups vorhanden sind, führen Sie einen manuellen Export und eine Dateisicherung durch.

  1. Export der MariaDB in eine SQL-Datei

    docker exec docker_mariadb mariadb-dump -u relution -p --max_allowed_packet=5G relution > relution.sql
    
  2. Backup der Konfigurationsdateien

    cd /opt/relution/ && zip -r backup.zip ./*
    

Vorbereitung der Umgebung

Relution aktualisieren

Stellen Sie sicher, dass Sie auf dem neuesten Stand sind:

cd /opt/relution/ && docker compose pull && docker compose up -d

Dienste stoppen

Stoppen Sie den Relution-Container, um Datenkonsistenz während der Vorbereitung zu gewährleisten:

docker compose down relution

Docker-Konfiguration anpassen

Ergänzen Sie Ihre docker-compose.yml. Fügen Sie die Services für pgloader und die neue database (PostgreSQL) hinzu und passen Sie den relution-Block an.

Neue Services hinzufügen

services:
  pgloader:
    image: dimitri/pgloader:latest
    networks:
      - relution-network
    volumes:
      - "./pgloader.load:/pgloader.load"
    tty: true

  database:
    image: postgres:18
    restart: unless-stopped
    container_name: database
    environment:
      - TZ=Europe/Berlin
      - POSTGRES_DB=relution
      - POSTGRES_USER=relution
      - POSTGRES_PASSWORD=$PASSWORD
    expose:
      - "5432"
    volumes:
      - "postgresql:/var/lib/postgresql"
    networks:
      - relution-network

Bestehenden Relution-Block anpassen

Ändern Sie die Abhängigkeiten und fügen Sie das Migrations-Argument hinzu:

  relution:
    image: relution/relution:latest
    restart: on-failure # Geändert von always auf on-failure
    container_name: docker_relution
    networks:
      relution-network:
        aliases:
          - relution-docker
    depends_on:
      - database # Geändert von mariadb
    environment:
      - TZ=Europe/Berlin
      - RELUTION_ARGUMENTS='--database-migration-only' # Neu hinzugefügt

volumes:
  mariadb:
  postgresql: # Neu hinzugefügt


pgloader Konfiguration

  1. Laden Sie die Datei pgloader.load in das Verzeichnis /opt/relution/ herunter.
  2. Passen Sie die Konfiguration an Ihre Umgebung an.
     FROM mysql://relution:dbpassword@mariadb-docker:3306/relution
     INTO postgresql://relution:dbpassword@database:5432/relution

Datenbank-Schema initialisieren

Passen Sie zuerst die application.yml an, damit Relution weiß, dass nun PostgreSQL genutzt wird:

relution:
  database:
    type: postgresql
    url: jdbc:postgresql://database/relution?useServerPrepStmts=true
    username: relution
    password: $PASSWORD

Starten Sie nun PostgreSQL und Relution. Relution wird aufgrund des Flags --database-migration-only nur das Schema in PostgreSQL erstellen und sich dann beenden.

docker compose up -d database && docker compose up relution

Der Prozess ist abgeschlossen, wenn der Container mit Code 0 beendet wurde: docker_relution exited with code 0

picture


Datenmigration durchführen

Starten Sie den pgloader-Container und führen Sie die Migration der Daten von MariaDB zu PostgreSQL aus:

docker compose up -d pgloader && docker compose exec pgloader bash

Innerhalb des Containers führen Sie den Migrationsbefehl aus:

pgloader pgloader.load

picture


Bereinigung und Abschluss

Nach erfolgreicher Migration müssen die temporären Konfigurationen und der alte MariaDB-Container entfernt werden.

  1. In der docker-compose.yml entfernen:
  • Den gesamten Block mariadb: unter services.
  • Den Block pgloader: unter services.
  • Das Volume mariadb: unter volumes.
  1. Im relution Block anpassen:
  • restart: unless-stopped (wieder zurückstellen auf always).
  • Entfernen der Zeile: - RELUTION_ARGUMENTS=--database-migration-only.
  1. Aufräumen:
rm pgloader.load

Dienste neu starten: Fahren Sie alles herunter, um verwaiste Container zu löschen, und starten Sie das System neu:

docker compose down --remove-orphans && docker compose up -d

Die Migration ist damit abgeschlossen und Relution läuft nun nativ auf PostgreSQL.