DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Nextcloud: Migration der Datenbank von MySQL/MariaDB auf PostgreSQL

Nextcloud PostgreSQL Logo

PostgreSQL ist ein Datenbank-System, welches mittlerweile von vielen verschiedenen Programmen genutzt wird (z.B. Matrix Synapse, Mastodon, oder auch PeerTube). Im direkten Vergleich zu MySQL/MariaDB ist PostgreSQL ein moderneres, objektrelationales Datenbankmanagementsystem (ORDBMS). MySQL/MariaDB sind lediglich relationale Datenbanksysteme (RDBMS). Nicht zuletzt ist PostgreSQL in den meisten Fällen performanter als MySQL/MariaDB.

Da ich mit PostgreSQL schon in einigen Projekten einsetzen konnte, bin ich mittlerweile ein Fan dieses Datenbanksystems. Nextcloud unterstützt neben MySQL/MariaDB ebenso PostgreSQL. Auch hier merkt man Änderungen: Die “Schwuppdiziät” der Cloud ist mit PostgreSQL um einiges besser.

Da meine Empfehlung in den vergangenen Artikeln immer eher in Richtung MariaDB als Datenbanksystem für Nextcloud gegangen sind, soll dieser Artikel die Migration der Datenbank von MySQL/MariaDB auf PostgreSQL beschreiben.

Als Grundlage dient wie immer der Artikel Nextcloud auf Ubuntu Server 20.04 LTS mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban.

Übrigens kann eine Datenbank-Migration nicht nur “in einer Richtung” durchgeführt werden, sondern es kann eine Migration in jedes von Nextcloud unterstütze Datenbank-System (MySQL/MariaDB, PostgreSQL und SQLite) vorgenommen werden.

Installation PostgreSQL

Zunächst muss das Datenbank-System installiert werden. Dazu empfehle ich, die Version aus den offiziellen PostgreSQL-Paketquellen zu nutzen, da die Version, die in den Ubuntu Paketquellen enthalten ist, schon ziemlich alt ist.

Hier wird erst einmal das entsprechende Repository eingebunden:

sudo sh -c 'echo "deb [arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Anschließend muss der Repository-Key noch auf dem System bekannt gemacht werden:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

Nun kann PostgreSQL auch schon installiert werden:

apt update && apt install postgresql

Damit PHP mit PostgreSQL zusammen arbeitet, ist zudem noch ein PHP-Paket nachzuinstallieren:

apt install php-pgsql

Die Installation von PostgreSQL ist damit auch schon abgeschlossen.

Optional kann das PostgreSQL noch auf das jeweilige System optimiert werden. Die Seite PGTune ist hier ein guter Ansatzpunkt.

Nextcloud-Datenbank in PostgreSQL anlegen

Bevor nun die eigentliche Konvertierung gestartet werden kann, muss die Datenbank und ein entsprechender User über die PostgreSQL-Kommandozeile angelegt werden:

sudo -u postgres psql

Folgende Befehle legen nun den Benutzer und die Datenbank an. nextcloud_db und nextcloud_db_user sind hier die beispielhaften Namen der Datenbank bzw. des Benutzers. Ebenso muss ein Passwort für den DB-User angegeben werden:

CREATE USER nextcloud_db_user WITH PASSWORD 'pAsSw0rD';
CREATE DATABASE nextcloud_db TEMPLATE template0 ENCODING 'UNICODE';
ALTER DATABASE nextcloud_db OWNER TO nextcloud_db_user;
GRANT ALL PRIVILEGES ON DATABASE nextcloud_db TO nextcloud_db_user;

Die PostgreSQL-Kommanozeile wird daraufhin durch folgenden Befehl beendet:

\q

Damit ist die Datenbank schon für die Migration vorbereitet.

Nextcloud-Datenbank migrieren

Bevor die Datenbank-Migration angestoßen wird, sollte in jedem Fall ein Backup der kompletten Nextcloud-Instanz angefertigt werden. Bei der Migration kann es normalerweise nicht passieren, dass die Nextcloud “zerschossen” wird, aber man weiß ja nie. Für das Backup können z.B. die bekannten Nextcloud Backup-/ und Restore-Skripte verwendet werden.

Die eigentliche Konvertierung wird nun mit einem OCC-Befehl angestoßen:

sudo -u www-data php occ db:convert-type --all-apps --password="pAsSw0rD" pgsql nextcloud_db_user 127.0.0.1 nextcloud_db

Hier sind folgende Parameter zu beachten:

  • –all-apps: Sorgt dafür, dass auch die Tabellen deaktivierter Apps konvertiert werden.
  • –password: Das Passwort des Nextcloud-Datenbank-Benutzers wie es bei der Anlage der Datenbank angegeben wurde.
  • pgsql: Es soll eine Konvertierung nach PostgreSQL stattfinden
  • Am Ende werden noch der Datenbank-Benutzer, die IP des Zielsystems (in diesem Fall localhost, also 127.0.0.1) und der Name der Datenbank selbst angegeben. Diese Angaben müssen natürlich wieder mit jenen übereinstimmen, die bei der Anlage der Datenbank genutzt wurden.

Nach dem Anlegen des Datenbank-Schemas wird man nun nochmal gefragt, ob man die Migration nun durchführen möchte. Die anschließenden Schritte können nun eine ganze Weile dauern, es wird aber immer eine Fortschrittsanzeige angezeigt.

Wenn der Vorgang abgeschlossen ist, sollte die Cloud wieder wie gewohnt verfügbar sein. Nun lohnt ein Blick in die Admin-Settings unter System: Hier sollte nun im Bereich Datenbank die Nutzung von PostgreSQL angezeigt werden:

PostgreSQL wird als Datenbank-System für Nextcloud genutzt
PostgreSQL wird als Datenbank-System für Nextcloud genutzt

Damit ist die Migration der Datenbank abgeschlossen. Es kann aber nicht schaden, alle Apps auf Funktionstüchtigkeit zu prüfen.

MariaDB/MySQL Datenbank löschen

Wenn es bei der Datenbank-Migration keine Probleme gab, wird die alte MariaDB/MySQL-Datenbank nicht mehr benötigt und kann daher gelöscht werden. Ich empfehle, mit diesem Schritt etwas abzuwarten und die Datenbank erst zu löschen, wenn sicher gestellt ist, dass die eigene Nextcloud-Instanz problemlos mit PostgreSQL funktioniert.

Um die alte Datenbank zu löschen, wird die MySQL-Kommandozeile genutzt:

mysql -u root -p

Nach der Eingabe des Passworts des root-Benutzers der Datenbank werden die Nextcloud-Datenbank und der dazugehörige User entfernt:

drop database nextcloud_db;
drop user nextcloud_db_user@localhost;
exit

nextcloud_db und nextcloud_db_user sind hier wieder durch die Namen der Datenbank bzw. des Users zu ersetzen, die bei der ursprünglichen Installation angegeben wurden.

Troubleshooting

Es kann passieren, dass es bei der Konvertierung zu Fehlern kommt. Meistens sind davon die Tabellen bestimmter Apps betroffen, wie im folgenden Screenshot (hier war die “News” App der Übeltäter):

Nextcloud: Fehler bei der Datenbank-Konvertierung
Nextcloud: Fehler bei der Datenbank-Konvertierung

Keine Panik: Wenn die Migration auf einen Fehler stößt, bricht diese einfach ab und die alte Datenbank (MySQL/MariaDB) bleibt weiterhin aktiv.

In diesen Fällen (Migration bricht auf Grund einer bestimmten App ab) reicht es aus, die App in der Nextcloud vor der Migration zu deaktivieren. Hier reicht erfahrungsgemäß die Deaktivierung aus, ein Entfernen der App ist meist nicht notwendig.

Anschließend kann die Konvertierung erneut angestoßen werden. Wenn die vorherige Konvertierung jedoch wegen eines Fehlers nicht beendet werden konnte, ist die PostgreSQL-Datenbank schon z.T. gefüllt. Bevor eine erneute Konvertierung gestartet werden kann, muss zuvor die Datenbank und der dazugehörige User manuell aus der Datenbank entfernt werden. Dies geschieht wiederum über die PostgreSQL-Kommandozeile:

sudo -u postgres psql

Folgende Befehle sind zum Löschen zu verwenden:

DROP DATABASE nextcloud_db;
DROP USER nextcloud_db_user;

Anschließend können (immer noch in der gleichen Kommandozeilen-Sitzung) der Benutzer und die Datenbank neu angelegt werden (siehe oben).

Beendet wird die PostgreSQL-Kommandozeile wieder durch den Befehl \q.

Fazit

Nach der Migration auf PostgreSQL als Nextcloud-Datenbank sollte man schon recht schnell einen Performance-Gewinn in der Cloud feststellen können. Erfahrungsgemäß profitieren davon sowohl größere, als auch kleinere Nextcloud-Instanzen.

Was meint ihr zu diesem Thema? Habt ihr bereits Erfahrungen bzgl. PostgreSQL als Datenbanksystem für Nextcloud? Oder bleibt ihr doch bei der “traditionellen Variante” mit MySSQL/MariaDB? Hinterlasst mir dazu doch einfach einen Kommentar.

Weiterführende Artikel

Links

, , , , , ,

Kommentare: 46

  • Hans sagt:

    Hallo Jan,

    und wieder ein toller Blog, vielen Dank dafür.

    PostgreSQL habe ich mir bis jetzt noch nicht angeschaut, eher MariaDB und beruflich Microsoft SQL.

    Ich werde mir mal PostgreSQL auf einer VM genauer anschauen.

    Gruß Hans

  • Ronald sagt:

    Hat super funktioniert, ganz ohne Fehler und geht auch gefühlt flinker – vielen Dank Jan!

  • Thomas sagt:

    Hallo Jan,

    hätte hier eine Frage bevor ich die Migration in Angriff nehme, muss eigentlich auch das Backup Script das Du in Deinem Forum für die Nextcloud vorgestellt hast angepasst werden.

    • Mark sagt:

      Hallo Thomas,

      ich glaube du musst im Skript die Variable databaseSystem von “mariadb” auf “postgresql” ändern. Der Rest ist glaube ich dynamisch.

      • Jan sagt:

        Hi Mark und Thomas,

        ganz genau: Die Skripte sind sowohl mit MySQL/MariaDB, als auch mit PostgreSQL kompatibel. Hier muss nur die Art des DB-Systems in der entsprechenden Variable mit angegeben werden. DB-Benutzername bzw. -Passwort sind ggf. auch noch zu ändern, wenn diese bei der Migration geändert wurden.

        Gruß,
        Jan

  • Mark sagt:

    Super Anleitung! Es hat alles reibungslos funktioniert.
    Danke!

  • Samuel sagt:

    Hi,

    hat alles soweit funktioniert, jedoch sind die Apps verschwunden.

    Ist das ein bekannter möglicher Fehler?

    MfG
    Samuel

  • Jakob sagt:

    Danke für die Anleitung.
    Ist das System wirklich spürbar schneller nach dem Umstieg?

  • Martin sagt:

    Danke für den Artikel.

    Ist es sinnvoll die Pakete von MariaDB/MySQL zu deinstallieren?

    • Jan sagt:

      Hi Martin,

      wenn keine andere Anwendung MariaDB/MySQL nutzt, dann ja. Ich würde aber erst einmal den entsprechenden Dienst deaktivieren und schauen, ob nicht doch eine Anwendung meckert.

      Gruß,
      Jan

  • Mirko sagt:

    Gute Anleitung, so hat es problemlos funtkionert! :-)

  • Paul sagt:

    Wie viele Nutzer willst du eigentlich OneDrive und GDrive durch für alle Verständliche und zugängliche Nextcloud Tutorials abjagen ?
    Jan: JA ! :D
    Danke für die Tutorials, nach der Klausurenphase wird erstmal die Nextcloud neu aufgesetzt

  • Hans sagt:

    Hallo Jan,

    bei MariaDB/MySQL Datenbank löschen fehlt bei exit “;”.

    Gruß Hans

  • Hans Müller sagt:

    Hallo Jan,

    wollte mich jetzt auch mal an die Konvertierung setzen.

    Nach der Erstellung der Datenbank wollte ich die Konvertierung starten. Mit dem occ Konvertierungsbefehl erhalte ich folgende Fehlermeldung.

    Failed to connect to the database: An exception occurred in the driver: could not find driver

    Scheinbar muss ich php noch beibringen, dass eine PostgreSQL genutzt werden soll.

    Wie kann ich den Fehle beheben? Eine rudimentäte Google Suche hat mir nichts gebracht.

    Ein Neustart hat leider auch nichts gebracht.

    Gruß
    Hans

  • Chris sagt:

    Der OCC-Befehl zur eigentlichen Konvertierung wurde bei mir sofort mit einer Fehlermeldung der bash abgebrochen.

    Ich musste mit set +H die History-Substitution bzw. -Expandierung setzten, damit der Befehl erfolgreich ausgeführt werden konnte.

    Vielen Dank für die gute und sehr nützliche Anleitung!

    • Jan sagt:

      Hi Chris,

      wie lautete die exakte Fehlermeldung? Ist vielleicht auch für andere interessant, daher würde ich evtl. den Artikel dahingehend erweitern.

      Gruß,
      Jan

      • Chris sagt:

        Hi Jan,
        die ursprüngliche Fehlermeldung war “bash: !84: event not found”. Nach dem Setzen der History-Expandierung mit “set +H” konnte ich den Befehl dann ohne weitere Schwierigkeiten ausführen.

        • Jan sagt:

          Hi Chris,

          hier vermute ich mal, dass ein Passwort o.ä. Sonderzeichen enthalten hat, welche die Bash als Befehl interpretieren wollte. Hast du all diese Sachen in Anführungszeichen gesetzt?

          Gruß,
          Jan

          • Chris sagt:

            Hallo Jan,
            es kann ja eigentlich nur das Passwort gewesen sein, dieses war allerdings natürlich im Befehl in Anführungszeichen gesetzt, wie du es ja auch beispielhaft oben erklärst. Immerhin hat es mit diesem Workaround gut funktioniert.

  • John sagt:

    Vielen Dank für das Tutorial.
    Der Switch zu postgres hat bei mir reibungslos funktioniert.
    Nur leider erzeugt postgres dauerfaft eine fast Vollauslastung der CPU.
    Woher kann das kommen?

    • Jan sagt:

      Hi,

      eine hohe CPU-Last ist mir hier noch nicht untergekommen. Hast du irgend etwas an der Konfiguration von PostgreSQL geändert?
      Ansonsten gibt es hier ein paar Tipps, wie man solche Probleme analysieren kann.

      Gruß,
      Jan

  • GH sagt:

    Vielen Dank für die tolle Anleitung! Es hat alles geklappt. Kann ich, nachdem die alte Datenbank gelöscht ist, zudem noch Programme löschen, die ich nach deiner Anleitung damals installiert hatte oder wird weiterhin alles benötigt?

    • Jan sagt:

      Hi,

      wenn MariaDB gar nicht mehr benötigt wird, kannst du MariaDB komplett vom System entfernen. Ich würde allerdings empfehlen, fürs erste den MariaDB-Service erst einmal zu stoppen und zu deaktivieren. Wenn dann auch nach einigen Tagen kein Programm meckert, dann wird MariaDB wohl echt nicht mehr benötigt.

      Gruß,
      Jan

  • Hi, und danke für die gute Erklärung.
    Bei uns wurde die Migration auf Grund von den oben beschriebenen “App”Fehlern abgebrochen, so dass wir uns nochmal genauer anschauen müssen, welche Apps die verursacher sind.
    Aber mit PostgreSQL betreiben wir bereits eine andere Nexctloud Instanz auf einem anderen Server seit über einem Jahr und hatten bis jetzt nie Probleme damit. Deshalb wollten wir auch die Nextcloud von einem Kunden zu Postgresql migrieren. Die Performace von Nextcloud mit Postgresql ist (subjektiv) gefühlt besser als mit einer Mysql Variante.
    Grüße!

    • Jan sagt:

      Hi,

      danke für das Feedback.
      Bzgl. der “App-Fehler”: Hier sollte eigentlich schon aus den Tabellennamen hervorgehen, um welche App(s) es sich handelt. Zumindest sollte daraus ein Hinweis abzulesen sein.

      Gruß,
      Jan

  • Martin sagt:

    Hi Jan,

    wieder mal vielen Dank für die tolle Anleitung!
    Nachdem ich den Hinweis bekommen hatte, dass es für meine MariaDB 10.4 keine Updates mehr gibt, habe ich die Migration gewagt und konnte nach ein paar Stunden noch keine Fehler feststellen.

    Viele Grüße
    Martin

    • Jan sagt:

      Hi Martin,

      wenn es bei der Migration selbst zu keinen Problemen gekommen ist, dann werden erfahrungsgemäß auch in der weiteren Nutzung der Cloud keine weiteren Probleme entstehen (außer z.B. man installiert zu PostgreSQL inkompatible Apps).
      Merkst du einen Unterschied bei der Performance?

      Gruß,
      Jan

      • Martin sagt:

        Hi Jan,

        ehrlich gesagt, merke ich noch keinen Unterscheid und habe sogar das Gefühl, dass es “hakeliger” läuft. Mir ist eben auch erst aufgefallen, dass der Nextcloud angeblich nach der Installation von PostgrSQL ‘imagick’ fehlt. Die Installation mit ‘apt install php-imagick imagemagick’ wirft aber aus, dass alles bereits vorhanden ist!
        Ich weiß nicht, ob das noch ein Performance-Problem darstellt, aber damit kämpfe ich gerade. Irgendeine Idee?

        Grüße
        Martin

        • Jan sagt:

          Hi Martin,

          dass es hakeliger läuft konnte ich bisher noch bei keiner Instanz beobachten. Du kannst hier noch versuchen, die PostgeSQL-Konfiguration zu optimieren, siehe hier.
          Für die Imagemagick-Sachen: apt install imagemagick libmagickcore-6.q16-6-extra sollte hier Abhilfe schaffen. Das liegt aber nicht an PostgreSQL, hast du vielleicht im gleichen Atemzug Nextcloud upgedatet?

          Gruß,
          Jan

  • Martin sagt:

    Hi Jan,

    ja, ich gehe auch davon aus, dass es mit gleichzeitigen Updates zu tun hat.
    Leider hat auch Dein Tipp in diesem Fall nichts gebracht (bereits installiert).
    Keine Ahnung, was die NC noch erwartet. Ein Entfernen mit “remove” und erneutes Installieren hat leider auch nichts gebracht. Oder muss ich vielleicht es mit “purge” versuchen?

    Grüße
    Martin

    • Jan sagt:

      Hi Martin,

      wie lautet die exakte Fehlermeldung? Auf welcher Distribution- und Version bist du?

      Gruß,
      Jan

      • Martin sagt:

        Hi Jan,

        die Fehlermeldung in der NC 22.2.2 lautet:
        “Dieser Installation fehlen einige empfohlene PHP-Module. Für bessere Leistung und bessere Kompatibilität wird dringend empfohlen, diese zu installieren.

        – imagick”

        Linux-Distribution/Version:
        Linux version 5.4.0-90-generic (buildd@lgw01-amd64-054) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04))

        Der Server wurde mit Deiner Anleitung ‘Nextcloud auf Ubuntu Server 20.04 LTS mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban’ aufgesetzt.

        Die installierte imagick-Version:
        ImageMagick 6.9.10-23 Q16 x86_64 20190101

        Danke!

        Grüße
        Martin

        • Jan sagt:

          Hi Martin,

          er spricht hier von einem fehlenden PHP-Modul. Daher würde ich mal darauf tippen, dass ihm php-imagick fehlt. Hast du dies installiert?

          Gruß,
          Jan

          • Martin sagt:

            Hi Jan,

            ja, das ist das Problem. Wenn ich versuche php-imagick zu installieren, ist es bereits installiert:
            “php-imagick is already the newest version (3.5.1-2+ubuntu20.04.1+deb.sury.org+3)”

            Gruß
            Martin

          • Jan sagt:

            Hi Martin,

            ok, du hast PHP aus einem PPA installiert. Hier wird aber meistens recht viel Zeug installiert (mehrere PHP-Versionen), ich würde es nochmal mit einem apt install php7.3-imagick versuchen (je nach PHP-Version anpassen).

            Letzten Endes ist es aber die Theming App, die diese Warnung verursacht. Wenn du also kein Theming nutzt, kannst du die App einfach deaktivieren und die Meldung sollte dann auch verschwunden sein.

            Gruß,
            Jan

          • Martin sagt:

            Hi Jan,
            vielen Dank, mit ‘install php8.0-imagick’ (oder der Deaktivierung der Theming-App) war das Problem gelöst!
            Viele Grüße
            Martin

  • Stefan Harbich sagt:

    Hallo Jan,
    ich habe eine Frage zum Nextcloud Backup-Skript. Kannst Du mir einen Tipp geben wie ich im Skript eine Rotation einbauen kann. Sprich das nur maximal fünf Verzeichnisse angelegt werden? Z. B. mit folgenden Code:

    # Rotate Backups
    max_number_of_backups=2

    function number_of_backups() {
    echo `ls -1 $BACKUPDIR | wc -l`
    }

    function oldest_backup() {
    echo -n `ls -1 $BACKUPDIR | head -1`
    }

    while [ $(number_of_backups) -gt $max_number_of_backups ]
    do
    rm -rf “$BACKUPDIR/$(oldest_backup)”
    done

    Mit freundlichen Grüßen
    Stefan Harbich

  • Stefan Harbich sagt:

    Hallo Jan,
    bei der Konvertierung der Datenbank bekomme ich folgende Fehlermeldung:

    root@dsme01:/var/www/html/nextcloud# sudo -u www-data php occ db:convert-type –all-apps –password=”#########” pgsql nextcloud 127.0.0.1 nextcloud
    Creating schema in new database

    In Connection.php line 87:

    Failed to connect to the database: An exception occurred in the driver: SQLSTATE[08006] [7] received invalid response to SSL negotiation: g

    db:convert-type [–port PORT] [–password PASSWORD] [–clear-schema] [–all-apps] [–chunk-size CHUNK-SIZE] [–]

    Hast Du einen Tipp für mich woran das liegen kann?

    Mit freundlichen Grüßen
    Stefan harbich

    • Jan sagt:

      Hi Stefan,

      das Paket “php-pgsql” hast du installiert und die PostgreSQL-DB vor der Konvertierung angelegt?
      Läuft PostgreSQL auf Port 5432? Wenn nicht, dann musst du vermutlich den Port noch mit dem Parameter “port” mit angeben.

      Gruß,
      Jan

    • Chris sagt:

      Überprüfe mal in der postgresql.conf die Zeile “listen_addresses” und kommentiere diese probeweise aus. Solange die DB und die Nextcloud auf demselben Server laufen, sollte das kein Problem darstellen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.