Nextcloud Datenbank Update
Seit einigen Jahren nutze ich nun die Nextcloud auf meinem Server für private Zwecke. Einige Updates hat das Tool bei mir schon mitgemacht. Dank Docker-Containern hielt sich der Aufwand dafür auch sehr in Grenzen, doch langsam wurde das Updaten schwierig: Ab Version 21 unterstützt die Cloud keine MySQL Version 5.7 mehr. Zeit, die Datenbank mal auf den neuesten Stand zu migrieren. Hier eine kurze Anekdote zum Update meiner Cloud.
MySQL Daten Upgrade?
Für das Upgrade von MySQL 5.7 auf die aktuelle Version 8.* gibt es ein Feature, um die Kompatibilität abzufragen. Mit mysqlcheck --all-databases --check-upgrade
(siehe Quelle 1) lässt sich dies ganz einfach testen. Laut Aussage dessen, wäre das Upgrade möglich, jedoch hatte ich schon einmal Probleme mit einem solchen Upgrade. Und ich reagiere irgendwie allergisch auf einmal schlecht erfahrene Updates. Sollte dies wieder schief laufen, muss man sich über die MySQL Shell um eine Wiederherstellung bemühen und da habe ich erst recht keine Lust drauf.
Stattdessen möchte ich lieber gleich von MySQL zu PostgreSQL wechseln. Nextcloud bietet dafür ein Command an, welches per ORM die Daten von einer Datenbank zur anderen Kopiert. Also noch schnell ein Abbild der aktuellen DB zur Sicherheit gemacht und los geht der Spaß!
Ein neuer Container für die Ziel-Datenbank
In meinem Docker Setup war dies wohl das geringste Problem. Zuerst wird die ganze Cloud heruntergefahren und dann die docker-compose.yaml
aktualisiert:
volumes: db-volume: pg-volume: services: # ... pg: image: postgres:13 container_name: nextcloud-pg restart: unless-stopped env_file: .env volumes: - pg-volume:/var/lib/postgresql/data
Man beachte hier, dass auch ein neues Volume angelegt wurde. Ist nicht notwendig, erlaubt aber eine Benennung des neuen Volumes für bessere Zuordnung. Im Nextcloud Docker-Container führe man folgenden Befehl aus, um die Datenbank vom aktuellen Provider (in meinem Fall MySQL) nach PostgreSQL (dem neuen Container) zu kopieren: php occ db:convert-type [options] type username hostname database
All das findet man – recht gut dokumentiert – in der Nextcloud Doku. Abgesehen von den möglichen Namen der Datenbanktypen. Ich habe es mit postgres
, postgresql
und pg
versucht, bin aber nicht auf die Idee gekommen, dort pgsql
einzutragen. Das musste ich mir erst im Quellcode erschließen. Danach hat Nextcloud leider auch noch den Kopiervorgang vermasselt und der Prozess endete mit einem Fehler:
An exception occurred while executing 'SELECT setval('oc_text_documents_id_seq', (SELECT MAX() FROM ))': SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near ")" LINE 1: ...ECT setval('oc_text_documents_id_seq', (SELECT MAX() FROM ))
Zum Glück bin ich nicht der erste mit diesem Problem (siehe Quelle 2). Leider wird dieses jedoch – laut Kommentar der Entwickler – erst in der folgenden Major-Version von Nextcloud behoben. Blöd, dass ich genau für dieses Update erst das Problem mit der Datenbankversion lösen muss…
Mit ein paar Einstellungen am System konnte der Prozess beim nächsten Versuch erfolgreich beendet werden. Dafür brauchte ich nur die Container erneut herunter zu fahren, das Postgres-Volume von Docker zu löschen, um beim nächsten Start einen Neuanfang auszulösen. Zum Schluss mussten nur noch ein paar Indizes nachgepflegt werden. Auch dafür hat die Cloud mit php occ db:add-missing-indices
ein passendes Command vorbereitet.
Update der Major-Version
Nachdem die Datenbank erfolgreich konvertiert wurde, konnte ich das Update der Nextcloud durchführen. Auch dies ist mit Docker ein sehr einfacher Prozess. Man löscht das alte Docker Image, zieht sich das neue und startet den Nextcloud-eigenen Update-Prozess. Auch danach war wieder eine Aktualisierung der Indizes notwendig und es tauchten neue Warnungen der Systemkonfiguration auf der Einstellungsseite auf.
Das beste kommt natürlich zum Schluss: Nachdem ich endlich das Update auf Version 21.* geschafft habe, informiert mich die Cloud über die längst veröffentlichte Version 22. Es soll ja auch nicht langweilig werden…