|

Unter WordPress gelöschte Medien wiederherstellen

Thema: Ubuntu – MariaDB – WordPress – Apache – Theme.


Aber wichtig, das geht nur wenn man ein Backup der Daten und der Datenbank hat! Und gleich vorweg, einfach geht es nicht. Ich habe am Ende die ganze Datenbank durch ein Backup ersetzen müssen.

Man muss zuerst alle Bilder in die Ordnerstruktur unter /wp-content/uploads aus dem Backup wieder hochladen. Das geht per SFTP, aber Achtung: in sauberen Anwendungen gehört der Ordner dem User www-data und als normaler User kann man darin nicht schreiben. Man muss also entweder die Rechte öffnen (chmod -R o+w uploads/) oder zuvor woanders hinspielen und dann mit den passenden Rechten übertragen. Am Ende muss alles wieder www-data gehören (chown -R www-data:www-data uploads/).

Damit Erscheinen aber noch keiner Bilder in der Mediathek. Der Grund ist, dass die Bilder durch das Löschen auch aus der Datenbank flogen. Es gibt mehrere Plugins um die Bilder wieder hinzuzufügen:

  • Media Sync klappt gut, ist aber auf 120mb pro wiederhergestellten Ordner beschränkt. Dummerweise werden auch die heruntergerechneten Versionen in der Datenmenge mitgezählt.
  • Add From Server von Dion Hulse geht besser, hat aber auch unerklärliche Obergrenzen. Man kann aber sowieso nicht alle Bilder wählen und hochladen, da das Plugin verkleinerte Versionen des selben Bild als eigene Datei hochlädt. Das macht natürlich keinen Sinn. Man muss also aus der langen Liste nur die Originalbilder auswählen. Sie durchlaufen dann den normalen Prozess des Hochladens, Verkleinerungen werden erkannt weil das Hauptbild erkannt ist.

Damit erscheinen aber auch noch keine Bilder in den Beiträgen wo sie fehlen. Das liegt daran, dass WordPress nicht Dateinamen referenziert weil diese nicht eindeutig sein müssen. Stattdessen werden (meist) 5-Stellige IDs verwendet. Fügt man ein Bild normal zu erhält es eine ID und mit dieser ID wird es in einem Beitrag gespeichert. Löscht man ein Bild, so werden Bild und ID aus der Datenbank gelöscht. Im Beitrag bleibt die alte ID erhalten. Fügt man nun wie oben alte Bilder erneut zu erhalten sie nagelneue IDs und passen nicht mit den alten zusammen. Man muss also in der Datenbank arbeiten. Zwei Schritte sind theoretisch möglich:

  • Wenn man sicher eindeutige Dateinamen hat, dann kann man in den entsprechenden Tabellen alt und neu über die Dateinamen die alten und die neuen IDs matchen.
  • Wenn das Datenbank-Backup nicht zu alt ist, kann man die betreffende Tabelle einfach austauschen.

Bloss stimmen die theoretischen Annahmen nicht weil es nicht eine tabelle mit Verknüpfung von IDs und Dateinamen gibt sondern mehrere:

  • wp_posts : Umfasst Medien vom Typ attachment.
  • wp_postmeta : Umfasst Metainformationen zu den Medien wie _wp_attached_file und _wp_attachment_metadata.
  • wp_term_relationships : Auch hier stehen IDs wenn Medien z. B. Kategorien zu geordnet sind

Besonders wp_posts umfasst allerdings auch den Textinhalt von Beiträgen. Deswegen geht kein einfacher Austausch.

Also Zwischenfazit: das erneute Hochladen von Medien und hinzufügen mittels PlugIn geht nur für ein paar Medien, sagen wir maximal 20 Stück. Darüber hinaus ist das händische Ergänzen einfach nicht praktikabel.

Es blieb nur eine Lösung, ein altes Backup hochladen. Da ich gerade bei der Umstellung auf neue Versionen von WordPress und Designs war, hatte ich rund 10 Tage alte Backups. Das ist natürlich mehr Glück als Verstand, das vorangehende Update war mehr als 2 Jahre alt.

  • das Backup mit den Bildern hochladen wie oben Beschrieben, sie allerdings nicht per PlugIn in der Mediathek sichtbar machen. Es geht nur darum, dass sie physisch am Server sind.
  • die aktuelle Datenbank vorsichtshalber sichern: mysqldump [DBNAME] > [BACKUPNOW].sql. Diese SQL-Anweisungen macht man auf der Konsole und nicht im DB-Interface.
  • das alte Backup als ganzes wieder einspielen: mysql -u [USER] -p [DBNAME] < [BACKUPOLD].sql. Der [USER] ist ein User der Datenbank.

Alles in allem eine sehr unglückliche Geschichte. Wenn man bei jeden grösseren Änderungen wie dem Löschen von Beiträgen und dazugehörige Medien (die bei Galerien und dem Headerbild nicht automatischer verknüpft werden) ein Backup machen muss, generiert man massenweise Daten. Der DB-Dump von betreffender WP-Instanz ist 63mg gross und wp_content umasst 32gb.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.