Suchen und Ersetzen in MySQL-Datenbanken

Wie vielleicht schon bemerkt wurde, habe ich kürzlich eine Änderung an der Domain-Struktur meiner Webseite vorgenommen. Statt bisher www.jowra.de, ist nun jowra.com der allein gültige Domainname. www.jowra.de ist zwar auch weiterhin meinem Server-Webspace zugeordnet, Aufrufe über dieser Adresse werden aber per Redirect mit Statuscode 301 permanent auf jowra.com umgeleitet (um den gefürchteten Double Content bei Google zu vermeiden). Gleiches gilt für die Schreibweisen mit www. vor dem Domainnamen. (Warum dieses WWW in der heutigen Zeit unsinnig und veraltet ist, beschreibt dieser Artikel sehr anschaulich und umfassend. Siehe auch: no-www.org/ ) Es ergeben sich also folgende Schreibweisen und Redirects (alt -> neu):

www.jowra.de -> jowra.com
jowra.de -> jowra.com
www.jowra.com -> jowra.com
jowra.com -> jowra.com

Falls jemand mal ähnliches umschreiben möchte, hier die passende .htaccess Datei, die natürlich ins Root-Verzeichnis gehört (etwaige andere RewriteRules gehören dann auch in diese Datei).

RewriteEngine On
RewriteCond %{HTTP_HOST} !^jowra.com [NC]
Rewriterule ^(.*) http://jowra.com/$1 [R=301,L]

Die Änderung des Domainnamens hat mich zwar erst mal einen PageRank 5/6 gekostet, aber who cares, so wichtig ist das dann doch nicht. ;-) Das soll aber eigentlich auch nicht das Thema sein, sondern aus solch einer Umstellung (nicht nur bei Domainänderungen, sondern auch bei einer Neuinstallation, Pfadänderungen u.ä.) ergeben sich auch Auswirkungen auf die WordPress-Installation. Zum einen müssen natürlich die Pfade im Admin-Bereich angepaßt werden, auf der anderen Seite enthalten aber sicherlich auch die Beiträge, Kommentare usw. viele Verlinkungen auf die eigene Seite. Durch den permanenten Redirect ist das nicht ganz so dramatisch, aber ich wollte das Ganze eben stimmig machen und mußte deshalb in der Datenbank einige Ersetzungen vornehmen. Unter dem Motto Hilfe zur Selbsthilfe will ich deshalb mal schildern wie man das recht einfach über die Bühne bringt.

Vorab ein Hinweis: Die hier beschrieben Maßnahmen wirken sich direkt auf die Datenbank aus, d.h. die Erstellung eines Backups (z.B. mit dem seit WP 2.0 enthaltenen Backup-Plugin) wird unterstellt. Am besten die Änderungen auch mal im Rahmen eines lokalen Webservers (z.B. XAMPP) testen. Für Schäden die aus den folgenden Manipulationen an der Datenbank entstehen, übernehme ich selbstredend keine Haftung. (Es sollte aber keine Probleme geben. ;-) ).

WordPress sichert in der allgemeinen Datenbank welche in der wp-config.php definiert ist, verschiedene Tabellen die im Regelfall mit wp_ beginnen. Nach dem Durchforsten dieser Tabellen und der darin enthaltenen Felder kamen für die Anpassung geänderter Pfade folgende Tabellen und Felder in Frage:

wp_posts -> post_content
wp_comments -> comment_content
wp_comments -> comment_author_url
wp_comments -> comment_author_email

einige Änderungen sind u.U. auch an der wp_options Tabelle vorzunehmen, dies hatte ich aber vorher schon per Hand erledigt. Wir wollen nun in diesen Tabellen/Feldern die Adresse www.domain.de durch domain.com ersetzen (alles andere natürlich sinngemäß). Dazu startet man ausgehend vom Administrationsbereich des Webspace-Paketes, die Verwaltung der Datenbank(en), im Regelfall sollte dies über phpMyAdmin erfolgen. Unter phpMyAdmin wählen wir zunächst im linken Bereich die Datenbank aus. Daraufhin werden die darin enthaltenen Tabellen angezeigt, von denen die WordPress-Tabellen wie oben erwähnt, mit wp_ beginnen. Durch einen Klick auf die Tabelle wp_posts wählen wir diese aus und im rechten Administrationsbereich erscheinen daraufhin Informationen zu dieser Tabelle. Wir halten uns damit nicht weiter auf und wechseln zum Karteireiter SQL. Es öffnet sich ein Eingabefeld in welches MySQL-Datenbank-Befehle geschrieben und dann direkt ausgeführt werden können. Rechts daneben sind übrigens die Felder der aktuellen Tabelle (wp_posts) aufgeführt, klickt man diese an, wird die Bezeichnung in das Eingabefeld übernommen.

Der allgemeine Befehl zum Ersetzen einer Zeichenkette in MySQL lautet wie folgt (Der Zeilenumbruch nach dem Gleichheitszeichen erfolgt hier nur aus Platzgründen):

UPDATE tabellenname SET feldname =
replace(feldname, suchstring, ersatzstring);

in unserem Fall schreiben wir also:

UPDATE wp_posts SET post_content =
replace(post_content, 'www.domain.de', 'domain.com');

nach einem Klick auf OK dauert es nicht lange und SQL meldet die erfolgreiche Ersetzung des Suchstrings in XXX Fällen. Das wars schon. Das Gleiche führen wir nun für die Tabelle wp_comments durch, also wp_comments im linken Bereich auswählen, im rechten Bereich den Karteireiter SQL aktivieren und mit dem Kommando:

UPDATE wp_comments SET comment_content =
replace(comment_content, 'www.domain.de', 'domain.com');

die betreffende Zeichenkette ersetzen. Je nach dem ob es notwendig ist (weiß der Seitenbetreiber wohl am besten), die Ersetzungen dann auch noch in den Feldern comment_author_url und comment_author_email vornehmen und dabei gegebenenfalls den Suchstring anpassen. Bei der EMail-Adresse habe ich z.B. folgendes eingegeben:

UPDATE wp_comments SET comment_author_email =
replace(comment_author_email, 'domain.de', 'domain.com');

da ja in dem Fall das www. nicht vorhanden ist. Mit diesem Wissen lassen sich natürlich auch andere Zeichenketten in allen möglichen Tabellen ersetzen. Sehr praktisch und dem manuellen Ändern von Postings wohl vorzuziehen.

Wo wir gerade die Datenbank-Verwaltung geöffnet haben: Ich stellte erst kürzlich fest, daß WordPress als SPAM deklarierte Kommentare trotzdem in der Datenbank sichert und unter den ca. 3.300 Kommentaren nur 1.000 »vernünftige« waren. Wer (wie ich) den SPAM mal aussortieren möchte, wendet folgendes Kommando an:

DELETE FROM wp_comments WHERE comment_approved = 'spam'

Damit werden alle Kommentare die im Feld comment_approved das Wort spam enthalten unwiderbringlich gelöscht. Dies kann u.a. auch sinnvoll sein, wenn man mit seinem Datenbestand von WordPress auf ein anderes System umsteigen will, da dieses u.U. mit der SPAM-Markierung nichts anfangen kann und als ganz normale Kommentare übernimmt.

Der zu Grunde liegende Fall mit meiner Domainumschreibung mag nicht so häufig vorkommen, ich denke aber, daß allgemein das Suchen und Ersetzen von Zeichen- und Zeichenketten in MySQL praxisrelevant ist und einige Handarbeit bei der nachträglichen Korrektur von Artikeln (u.ä.) erspart. Die Möglichkeiten sind vielfältig, so lassen sich beispielsweise auch HTML-Entities in die numerische Schreibeweise konvertieren (z.B. von ä nach ä) u.v.m.

Artikel: Suchen und Ersetzen in MySQL-Datenbanken
Datum: Monday, 27. March 2006, 14:25 Uhr
Kategorien: SQL, WordPress
Feed zum Beitrag: RSS 2.0 · Trackback: Trackback-URL
Diesen Artikel kommentieren.

18 Kommentare

Artikel kommentieren




Formatierung per XHTML oder Textile möglich.