Suchen und ersetzen in SQL / mySQL Datenbanken

Heute war etwas Aufr├Ąumarbeit in der Blog-Datenbank angesagt. ­čÖé

Im speziellen ging es um die Ersetzung von Links auf den alten Webspace in den Beitr├Ągen und noch ein paar andere kleinere ├änderungen.

F├╝gt man in WordPress ein Bild ein, wir der Pfad nicht relativ zum Webspace sondern absolut gespeichert, also mit kompletter URL. Zieht man mit dem Blog ├╝ber den Lauf der Jahre mehrfach um (so wie ich) und ├Ąndert evtl. noch die Domain des Blogs, entstehen so einige Karteileichen.

Hier mal ne kleine Anleitung, wie man die ung├╝ltigen Links auf die aktuelle Adresse umbiegt:

  1. Als erstes erstellt man ein Backup – das ist wirklich sehr wichtig! ­čÖé Ich benutze dazu immer mysqldump Damit kann man den kompletten Inhalt einer Datenbank einfach in eine Datei “dumpen”:
    shell> mysqldump --all-databases -u$USER -p$PASSWORT > dump.sql
    Geht anschlie├čend etwas schief, hat man ein Backup und kann darauf zur├╝ckgreifen. Das Backup kann man mit:
    shell> mysql < dump.sql
    wieder einspielen. Hat man beim Erstellen des Dumps eine spezielle Datenbank ausgew├Ąhlt sollte man:
    shell> mysql $DB-NAME < dump.sql
    verwenden.
  2. Jetzt die eigentliche Aufgabe, suchen und ersetzen: Hier zu setzt man ein Konstrukt aus dem UPDATE und REPLACE Befehl ein, f├╝hrt man hintereinander mehrere Ersetzungen durch ist der Feldname in der REPLACE-Funktion besonders t├╝ckisch, da man leicht vergisst ihn mitzu├Ąndern:
    mysql> UPDATE [table_name] SET [field_name] = REPLACE([field_name],'[string_to_find]','[string_to_replace]');
  3. Im Vorfeld sollte man nat├╝rlich auch per SELECT schauen, wie viele Datens├Ątze man ├╝berhaupt ├Ąndern muss. Hier f├╝r ist LIKE ganz praktisch:
    mysql> SELECT * FROM [table_name] WHERE [field_name] like "%SUCHTEXT%";
  4. Das war’s!
  5. Kleiner Hinweise noch: Ich l├Âsche immer noch die bash_history, wenn ich das mysql-Passwort per Befehl mitgebe. Man wei├č ja nie…

Leave a Reply

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