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.
Journal (Artikel)
28. March 2006
@ 11:13
[...] Aah die Anleitung, die ich heute auf jowra.com gefunden habe, hätte ich vor einer Woche gut gebrauchen können. Habe nämlich meine Domain gewechselt von agnes-cebulla.de auf agnes-deters.de und auch beim Umzug mit Wordpress dann feststellen müssen, dass einige Tabellen in der Datenbank die vollständigen Pfade enthalten anstatt relative. Aber für’s nächste Mal werd ich mir mal die Anleitung bookmarken, weil bis dahin hab ich es sicher wieder alles vergessen! [...]
30. March 2006
@ 22:39
Vielen Dank für diesen tollen Beitrag!
Ich habe die Anleitung gut gebrauchen können, als ich mein Weblog vor ein paar Tagen in ein Unterverzeichnis umziehen musste.
Übrigens berichtet bueltge hier über ein Wordpress Suchen-und-Ersetzen-Plugin, das einem die Arbeit abnehmen soll und das man bei ihm auch in deutscher Version downloaden kann.
Hab es aber nicht getestet.
31. March 2006
@ 01:01
Hey Franziska,
Danke fürs Feedback. =)
Da siehste mal, ich guck meist vorher gar nicht, ob es schon was in der Richtung gibt. Und um selbst immer wieder was dazu zu lernen, geh ich manchmal auch freiwillig den vielleicht komplizierteren Weg. Ich bin auch so ein bißchen ein WP-Plugin-Muffel. :D
Toller Gravatar, gefällt mir!
Liebe Grüße,
John
31. March 2006
@ 11:50
Hi John,
ich hab das Plugin auch nicht getestet.
Ist doch immer besser, noch ein bisschen Kontrolle selbst zu behalten über das, was man da so verändert ;)
Du, by the way, wie machst Du das denn hier in den Kommentaren, dass Du Deine von den anderen unterscheiden (und dann auch anders darstellen) kannst?
Hab das schon öfter gesehen und würde es auch gern so umsetzen.
Wünsch Dir ein schönes Wochenende :)
Franziska
31. March 2006
@ 12:26
Ja, es ist einfach so, daß ich gerne die volle Kontrolle über alles habe und bei zu vielen Plugins hätte ich einfach Angst, ich verliere den überblick. ;)
Das mit den »Colour Comments« ist recht einfach, Du fragst einfach im Comment-Loop die EMail-Adresse des Kommentators ab, also ungefähr so:
(Hm… trotz PRE und CODE ergänzt WP automatisch die schließenden LI-Elemente. Also die </li> bitte wegdenken. ;) )
Ist es Deine EMail wird der Kommentar mit der Klasse »authorcommentbody« formatiert, ist es eine andere mit der Standardklasse »commentbody«.
Auf die Idee kam ich hier: Comment Highlighting based on author. Das fand ich aber noch etwas umständlich, ich denke kürzer als im Beispiel oben gehts nicht.:)
Dir auch ein schönes WE!
John
31. March 2006
@ 16:16
üsch hap das plugin getestet, ist klasse :-). bin ja von einen server zum anderen umgezogen und hab auch die domain geändert, funktioniert einfach wunderbar, sämtliche änderungen in 3o sec. erledigt. :-)
1. April 2006
@ 14:57
Mhm, irgendwie zieht gerade jeder seiner Webseite um, liegt das am Frühling, dem schönen Wetter oder was? Nun ja, auf jedenfall hab ich auch mein Wordpress Blog von einer Domain auf die andere verlegt und bin durch Zufall mal wieder auf deine Webseite gekommen (wollte jemandem dein Wordpress Theme empfehlen) und sehe dass auch du deine Seite umgezogen hast.
Dann hab ich doch gleich mal dein Tip mit der Datenbank angewandt. Danke, du hast mir einiges an Arbeit erspart. Allerdings würde ich dir eine andere Weiterleitung empfehlen, nicht durch die .htaccess Datei sondern am besten direkt in der Apache konfiguration, solltest du Zugriff darauf haben. Ich hab die Möglichkeit bei mir geschildert. Einfach zwei zusätzliche Virtuelle Hosts einrichten. Dann hat man auch keine Problem mit Subdomains. Bei deiner Methode kann man leider keine Subdomains anlegen, die werden alle auf die Hauptdomain weitergeleitet.
Ansonsten gute Arbeit :) weg mit dem www
13. April 2006
@ 14:42
Suchen und Ersetzen in MySQL-Datenbanken…
John Wrana hat einen Beitrag zu Suchen und Ersetzen in MySQL-Datenbanken geschrieben. Wer wegen eines Umzuges oder Umstellung seiner Website/Weblog solche Aktivitäten plant oder sich einfach vor dem Schaden informieren will, der sollte vorher sich ein…
12. October 2006
@ 17:51
Für dein letztere Problem, die Einträge in der DB zu prüfen und zu löschen, habe ich ein Plugin geschrieben und ich würde mich freuen, wenn du es mal mit testen könntest.
Beitrag: http://bueltge.de/wp-trackback-validator-spam-cleaner-plugin/243/
Download: http://bueltge.de/wp-content/download/wp/spam_viewer.phps
** Ich muss sicher nicht darauf hinweisen, dass die DB vorher zu sichern ist. Gelöschte Einträge sind nicht wieder herzustellen.
Herzlichen Dank und liebe Grüsse
27. November 2006
@ 13:28
[...] Suchen und Ersetzen in MySQL-Datenbanken – Jowra – Webdesign · Photo · Artwork (tags: Wordpress MySQL S9Y Umlaute) [...]
30. December 2006
@ 19:04
Hallo John,
habe das mit dem Redirect probiert – funktioniert allerdings nicht:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.luogo.de$ [NC]
RewriteRule ^(.*) http://luogo.de/1 [L,R=301]
in Confixx ist der Domain/Adresse http://luogo.de ein Unterverzeichnis /v3 zugeordnet.
http://www.luogo.de ist nichts zugeordnet.
Rufe ich nun http://www.luogo.de auf wird die Seite gefunden, jedoch die Adresse nicht geändert – drücke ich auf reload sieht es so aus, als ob er auf http://luogo.de/v3/ zugreifen möchte, die es ja nicht gibt, sondern nur intern zur Nutzung mehrere Domains auf einem web-server!
Kannst du mir evtl. helfen – wäre nett!
Danke
Martin
30. December 2006
@ 21:03
ähem… hat sich erledigt. Man sollte die .htaccess Datei auch im /v3 Verzeichnis abspeichern….
26. February 2007
@ 18:53
Wie sieht das eigentlich aus wenn ich das Replace durch zwei verschiedene Datenfelder machen will
Also den Datenbankeintrag vom Feld comment_author_email in comment_author_url “verschieben” möchte weil mein alter Blogprovider im Exportfeld Email nicht die Email der Kommentatoren sondern deren URL gespeichert hat. Da ich nun nicht alles nochmal neu importieren möchte könnte ich da einen Tip gebrauchen.
27. February 2007
@ 00:30
Blog-Bastelstunde…
Nachdem ich einen ganzen Tag zugebracht habe, mein blog von meiner alten domain auf die neue zu verfrachten, war ich froh, dass es nun auf der neuen Domain läuft und alles, wie gewünscht angezeigt wird. Nein, leider nicht alles. Einige meiner…
1. August 2007
@ 19:56
[...] das hatt mich schon lange gestört aber jetz bin ich heute zufällig auf eine schön anleitung gestosen durch den cssNeustart (jetz für mich [...]
23. December 2007
@ 15:02
[...] eines SQL
Scriptes gemacht werden konnte! Nach kurzer Suche bei Google bin ich auf den Artikel Suchen und Ersetzen in MySQLDatenbanken bei jowra.com gestoßen. Zum Glück kenne ich mich ein wenig mit MYSQL und SQL-Scripten aus und so [...]5. January 2008
@ 23:24
Erfahrungsbericht: WordPress Artikel in Drupal importieren…
Mittlerweile habe ich es geschafft und alle meine alten WordPress Artikel in mein neues Blogmittel Drupal importiert. Nun will ich meinen ausstehenden Erfahrungsbericht nachreichen, der vielleicht anderen Wechselwilligen hilfreich sein könnte.
Ich bi…
10. April 2008
@ 03:33
Schön erklärt ist das hier. Das hätte ich vor 4 Jahren gebrauchen können. g
Für das löschen von Spam-Kommentaren, wie du ja berichtet hattest, empfehle ich das Plugin cjd_delete_de.
http://hollii.de/temp/wordpress_plugins/cjd_delete_de.zip