Januar 30

Owncloud von SQLite auf MySQL konvertieren

Mit steigender Benutzerzahl hatte ich bei owncloud in letzter Zeit
öfter mal das Problem, dass Daten nicht gesynced wurden. Das hat
sich in den Serverlogs mit folgender Meldung bemerkbar gemacht:

"app":"remote","message":"An exception occurred while executing 'UPDATE \"oc_filecache\" SET \"size\"=? WHERE \"fileid\" = ?':\n\nSQLSTATE[HY000]: General error: 5 database is locked","level":4,"time":"2015-01-28T19:04:55+00:00"
"app":"PHP","message":"Session has been closed - no further changes to the session as allowed at \/var\/www\/owncloud\/lib\/private\/session\/memory.php#80","level":3,"time":"2015-01-28T19:04:55+00:00"

Die gängigen Sofortmaßnahmen á la Apache restart haben nur selten geholfen.
Also wollte ich das Problem bei der Wurzel packen: die Datenbank kommt nicht hinterher.

Das ist bei SQLite wenig überraschend, schließlich wird in der owncloud Doku auch
erwähnt, dass eben jenes DBMS nur für Einzelnutzer Installationen empfohlen wird –
bei mehreren Nutzern wird aus Gründen der Perfomance zu leistungsfähigeren Datenbanken
geraten. Also zum Beispiel MySQL, MariaDB oder auch PostgreSQL.

Aufgrund der hohen Verbreitung (und weil ich eh schon ein
MySQL Setup am laufen hatte) habe ich mich für MySQL entschieden.
Spätestens seit Version 7 läuft eine Umstellung der owncloud DB sehr einfach ab –
wenn man weiss wie.
Hier also mal meine Vorgehensweise, natürlich ohne Gewähr.
Dabei nehme ich jetzt mal an, dass eure Installation in /var/www/owncloud sitzt.

Zuerst habe ich alles in den Wartungsmodus gesetzt, damit mir keine laufenden syncs in die
Quere kommen. Dazu reicht eine Änderung in der config/config.php :
'maintenance' => true,
mit der Einstellung true befindet sich owncloud im Wartungsmodus und lässt keine Zugriffe
per Client und Webinterface zu.
Nach der Konvertierung setzt owncloud von sich aus den Maintenance Modus wieder auf false.
Ansonsten kann das natürlich auch manuell wieder gesetzt werden.
Wer nun ganz sicher gehen will, stoppt auch noch den Apache/nginx,
aber das dürfte dann mangels Benachrichtigung beim Zugriff einige Endnutzer verwirren.

Nun sollte man zur Sicherheit noch ein Backup der aktuellen SQLite Datenbank ziehen,
man weiss ja nie…
Dabei genügt folgender Befehl: sqlite3 owncloud.db .dump > owncloud.bak
Das Leerzeichen zwischen owncloud.db und .dump ist gewollt!

Nun sollte natürlich auch eine entsprechende Datenbank und ein DB-Nutzer vorhanden sein.
Ist das noch nicht der Fall, kann das mit folgenden Befehlen innerhalb der mysql CLI nachgeholt werden:
CREATE USER 'owncloud'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'password';

Dabei ist owncloud Benutzer- und Tabellenname und password natürlich das Passwort,
welches angepasst werden muss.
Wer einen ausgelagerten Datenbankserver hat, muss natürlich auch
localhost entsprechend ersetzen. In diesem Beispiel liegen Webserver und DB auf einer
Maschine, sodass der Zugriff lokal erfolgt.

So weit, so gut.
Wir haben sichergestellt, dass sich aktuell nix an der Datenbank ändert (Wartungsmodus),
haben ein Backup der Datenbank und für die kommende Umstellung
Nutzer und Datenbank samt Rechten angelegt.
Jetzt kommt der entscheidende Moment: die Konvertierung.
Vorab: Kaffeevorrat und ggf. Zigaretten sollten vorhanden sein, je nach Datenbankgröße kann es nun etwas länger dauern.

Im owncloud Verzeichnis muss die Datei occ ausführbar gemacht werden (chmod +x occ).
Mit diesem Script wird die Umstellung gestartet (und es kann noch viel mehr, einfach mal anschauen).
Folgender Befehl muss nun ausgeführt werden:
./occ db:convert-type --password="mysqlPassword" --all-apps mysql mysql_username sql-server database_name
So sieht die Syntax aus. Das muss natürlich für euch angepasst werden,
in diesem Beispiel würde es folgendermaßen aussehen:
occ db:convert-type --password="password" --all-apps mysql owncloud localhost owncloud
Das Script macht dann alles weitere nahezu automatisch.
In nahezu allen Fällen wird euch jedoch folgende Meldung präsentiert:
The following tables will not be converted:
oc_permissions
Continue with the conversion?

Die Anzahl und Namen der Tabellen kann stark variieren.
Aber keine Angst, das sind mit höchster Wahrscheinlichkeit alles Überbleibsel aus alten Versionen.
Hier gibt es sogar eine ganze Liste mit solchen Tabellen: Link.

Es geht also mit einem Y weiter. Jetzt kann man sich nur noch zurücklehnen
und mehr oder weniger entspannt die Show genießen.
Das Script hält euch durchgehend über den Fortschritt auf dem Laufenden.
Vorallem die Tabellen oc_activity und vielmehr noch oc_filecache waren bei mir sehr zeitintensiv.

Wenn das Script fertig ist, gibt es keine großartige Schlussmeldung –
es ist dann einfach fertig (die letzte Tabelle war zumindest bei mir oc_vcategory_to_object).
Wenn alles gut gelaufen ist, hat owncloud dann sowohl die Tabelle umgewandelt,
als auch die Config entsprechend angepasst und den Wartungsmodus abgeschaltet. Fertig!
Jetzt kann es mit vielen Nutzern ohne Performanceprobleme in der Datenbank weitergehen.


Schlagwörter: , ,

Veröffentlicht30. Januar 2015 von gerger in Kategorie "Allgemein

6 COMMENTS :

  1. By Michael on

    Prima Anleitung – vielen Dank dafür.
    Hat auf Anhieb geklappt bei mir. Ohne diese Seite hätte ich mich da wohl noch nicht ran getraut.

    Antworten
    1. By gerger (Beitrag Autor) on

      Hallo Michael, vielen Dank – das freut mich zu hören!

      Antworten
  2. By Heinz on

    Hallo Kevin,
    ich hätte nicht gedacht, dass das so einfach und glatt über die Bühne geht. Ich kann mich Michael nur anschließen. Super Anleitung!
    Vielen Dank dafür!
    Heinz

    Antworten
  3. By Martin on

    Hallo Kevin,
    vielen Dank für die Anleitung. Vielleicht noch zur Ergänzung:
    mysql -u root -p (für die Erstellung der Datenbank)
    sudo -u www-data occ … (für die Umstellung als user www-data)
    Gruß, Martin

    Antworten
  4. Pingback: Testing ownCloud – IT Merge

  5. Pingback: Testing ownCloud – IT Merge

Schreibe einen Kommentar

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