Frequently Asked Question

Dateianhänge von der Datenbank ins Filesystem verschieben (Erklärung ./manage.php)

Last Updated 8 months ago

Wird die Datenbank durch sehr viele Dateianhänge zu groß, besteht die Möglichkeit, die Dateianhänge aus der Datenbank zu holen und ins Filesystem zu verschieben. Dazu benötigt man das Plugin "storage_fs". Ist dieses Plugin installiert und aktiviert, kann man im Admin-Bereich unter Einstellungen->System den Speicherort für die Dateianhänge ändern. (Bereich: Speicherung und Einstellungen für Anhänge). Zur Auswahl steht "in der Datenbank" und, wenn das Plugin korrekt installiert wurde, auch der Pfad aus dem Plugin...

Wenn das Plugin korrekt installiert wurde, können wir mit dem Verschieben beginnen. (Die Einstellung zum Speicherort im Admin-Bereich ist hier nicht von Bedeutung. Das betrifft nur Anhänge, die neu gespeichert werden).
Das Verwalten der Dateianhänge läuft nun über die Konsole, auf die Sie, in der Regel per SSH, zugreifen können müssen.

Vorbereitende Maßnahmen / Infos

Die Datei, die wir hier benötigen ist die ./manage.php aus dem Root-Verzeichnis der osTicket-Installation. Diese muss ausführbar sein. Dies lässt sich auf verschiedene Wege machen. z.B. über ein FTP-Programm, mit dem Sie Zugriff auf diese Datei haben. Aber da wir bereits in der Konsole sind, ist es warscheinlich einfacher, das auch gleich in der Konsole zu machen. Unter Linux lautet der Befehl hierfür:

Datei ausführbar machen

chmod 754 manage.php

Die PHP-Version prüfen: in der Konsole ist nicht zwangsläufig die gleiche PHP-Version aktiv, wie über den Webzugriff auf osTicket. Welche PHP-Version verwendet wird, lässt sich in der Konsole ebenfalls prüfen:

PHP-Version prüfen:

php -v

Wenn der Befehl "php" nicht funktioniert, ist der Symlink zum Interpreter nicht gesetzt, bzw, wenn die Version zu alt ist, wurde er nicht aktualisiert. In diesem Fall muss der Interpreter direkt aufgerufen werden. Wird der Server mit Plesk verwaltet, könnte der Aufruf z.B. "/opt/plesk/php/7.4/bin/php" für PHP7.4 lauten. Wenn Sie den Pfad zum Interpreter nicht kennen, fragen Sie bei Ihrem Server-Admin oder Provider nach.

Nun wechseln Sie am besten in den Root-Ordner Ihrer Installation, damit die Befehle kürzer zu schreiben sind.

cd /Pfad_zu_osTicket/

Nun kennen wir alles, was wir benötigen. Die Befehle sind wiefolgt aufgebaut:

PHP-Interpreter Befehl Parameter1 Parameter2 ...

Maßnahmen durchführen

Infos abfragen:

Hilfe für Befehle:

php manage.php file -h

Welche Speicher-Backends stehen zur Verfügung:

php manage.php file backends

Dateien aus der DB ins Filesystem verschieben (der Parameter -v erzeugt eine Ausgabe, damit man sieht, was der Befehl gerade macht)

php manage.php file migrate --backend=D --to=F -v

Das ganze geht auch umgekehrt vom Filesystem in die DB

php manage.php file migrate --backend=F --to=D -v

Es sind auch ausführlichere Aktionen möglich. Im englischen Forum gab es dazu vor Jahren folgenden Hinweis, wenn man die Anhänge in der DB speichern möchte, aber wenn das Ticket geschlossen wird, die Anhänge ins Filesystem verschoben werden sollen:

Zitat:

We commonly use the file CLI to migrate attachments for closed tickets. This helps keep data available, but offloads data to a cheaper storage system (S3 in our case). We use something like this in a 5-minute scheduled task:php /path/to/manage.php file migrate --status=closed --min-size=8000 --backend=D --to 3 --limit=1The min-size option specifies that attachments under 8000 bytes should stay in the database (this is a comfortable number for BLOB fields saved in InnoDB tables, as it allows MySQL to store all the BLOB data in just one row block), and the status option indicates that only attachments associated with closed tickets should be migrated.Just more food for thought.

Um das Zitat zusammenzufassen: Wenn die Dateianhänge der offenen Tickets in der DB sein sollen, diese aber nach dem Schließen in das Filesystem verschoben werden sollen, wenn die Dateigröße 8 kB übersteigt, kann man das über einen CronJob mit folgendem Befehl machen:

manage.php file migrate --status=closed --min-size=8000 --backend=D --to=F --limit=1

Das Ziel-Backend muss nicht unbedingt das Filesystem sein. Das kann auch ein anderes, registriertes Backend sein, das man mit dem Befehl "php manage.php file backends" ermitteln kann.

Wie Ihr seht, man kann sich da nach belieben austoben...

Fehlerbehebung:

Manchmal kommt es zu Lesefehlern beim Verschieben der Dateien. Dann kann man prüfen, ob es Datei-Einträge ohne Dateien in der DB gibt, also es ist eine Datei eingetragen, aber es ist keine Datei dazu vorhanden. Diese Einträge lassen sich über die Datenbank ermitteln. Man kann dazu folgenden MySQL-Befehl verwenden:

SELECT * FROM `ost_file` f LEFT JOIN `ost_file_chunk` fc ON f.id=fc.file_id WHERE f.bk = 'D' AND fc.filedata=null ORDER BY f.size ASC

Die angezeigten Einträge mit bk=D und filedata=NULL können gelöscht werden, da die Dateien sowieso nicht existieren...

Weiterführende Infos auf der englischen Seite:

Der Link zur englischen Plugin-Beschreibung findet Ihr hier:

https://docs.osticket.com/en/latest/Plugins/Attachments%20on%20the%20Filesystem.html

Ich hoffe, ich konnte euch hiermit etwas Arbeit abnehmen und euch eine Möglichkeit aufzeigen, die Datenbank zu verkleinern und dadurch die Performance zu erhöhen.

Viel Spaß beim Ausprobieren...

Please Wait!

Please wait... it will take a second!