Umzug des WordPress-Blogs auf einen neuen Hosting-Provider

Es kommt leider vor, dass man umziehen muss oder möchte - aus welchen Gründen auch immer. Um dies ohne großen Ärger zu bewerkstelligen wird im folgenden eine kleine Anleitung Schritt für Schritt hinterlegt. Außerdem gehe ich auf bekannte Probleme ein und stelle einige Lösungen bereit.

Es kommt leider vor, dass man umziehen muss oder möchte - aus welchen Gründen auch immer.

Um dies ohne großen Ärger zu bewerkstelligen wird im folgenden eine kleine Anleitung Schritt für Schritt hinterlegt. Außerdem gehe ich auf bekannte Probleme ein und stelle einige Lösungen bereit.

Achtung: Bitte erst lesen und dann loslegen, keine Garantie auf zerstörte Daten! Sicherung anlegen!

  1. Zu erstes erst einmal einen neues Blog auf dem neuen Webspace installieren. Die folgenden Schritte importieren/ überschreiben dann die Daten in die bestehenden Tabellen.
  2. Als nächstes müssen wir die bestehenden Daten aus der „alten“ Datenbank exportieren. Dazu kann man das Plugin WP DatabaseBackup nutzen, oder den Export mit Hilfe eines mySQL-Tools bewerkstelligen. Im weiteren arbeite ich dabei mit phpMyAdmin, welches ein Freeware-Tool ist und von vielen Hosting-Providern angeboten wird.
  3. Den Export der Datenbank erläutere ich im Artikel „Datenbank Backup mit phpMyAdmin“ genauer. Da gibt es auch entsprechende Screenshots und nötige Erklärungen.
  4. Nun haben die Daten als SQL-Datei lokal vorliegen. Nun müssen wir die Daten in die neue Datenbank importieren und dabei gibt es nun eventuelle Probleme.
  5. Wenn nun das neue Blog auf dem neuen Webspace installiert ist, müssen wir die Daten importieren. Dazu ist es wichtig, dass ihr den Präfix kennt, der in der config.php von WP steht. Im Normalfall ist dies wp_ (Bsp.: wp_post2cat oder wordpress_post2cat). Solltet ihr diesen verändert haben bzw. sollte sich der Präfix eures alten Blogs vom neuen unterscheiden, so müssen in der SQL-Datei die Daten verändert ist. Dazu eignet sich jeder bessere Editor - zum Beispiel Notepad++, mit dem wir nun nach dem alten Präfix suchen und mit dem neuen ersetzen. Damit sollte selbst eine große SQL-Datei schnell verändert sein.
    Sucht mit dem Editor nach
    `ALTER_PRÄFIX_
    und ersetzt es mit dem neuen Präfix.
  6. Im weiteren kann es zu Problemen kommen, wenn die Datei zu groß ist. Das ist vorallem dann so, wenn Statistik-Plugins laufen und alles mögliche in der DB ablegen. Überlegt also im Gegenzug, was ihr für Daten benötigt - muss wirklich alles rein. Das ist von Provider zu Provider unterschiedlich, aber in der Regel kann man nie mehr als 1MByte an Daten importieren. Das führt nun dazu, dass wir die Datei, falls sie größer ist, aufspalten müssen. Dazu laden wir die SQL-Datei wieder in unseren Editor des Vertrauens und splitten an folgenden Punkten, so dass wir am Ende mehrere Dateien haben, die die max. erlaubte Größe nicht überschreiten.

    Beispiel für Tabelle post2cat:

    
    -- 
    -- Tabellenstruktur für Tabelle `wp_post2cat`
    -- 
    
    DROP TABLE IF EXISTS `wp_post2cat`;
    CREATE TABLE `wp_post2cat` (
      `rel_id` bigint(20) NOT NULL auto_increment,
      `post_id` bigint(20) NOT NULL default '0',
      `category_id` bigint(20) NOT NULL default '0',
      PRIMARY KEY  (`rel_id`),
      KEY `post_id` (`post_id`,`category_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=13 ;
    
    -- 
    -- Daten für Tabelle `wp_post2cat`
    -- 
    
    INSERT INTO `wp_post2cat` (`rel_id`, `post_id`, `category_id`) VALUES (1, 1, 1);
    INSERT INTO `wp_post2cat` (`rel_id`, `post_id`, `category_id`) VALUES (5, 6, 1);
    INSERT INTO `wp_post2cat` (`rel_id`, `post_id`, `category_id`) VALUES (3, 4, 1);
    ...
    INSERT INTO `wp_post2cat` (`rel_id`, `post_id`, `category_id`) VALUES (11, 12, 1);
    
    -- --------------------------------------------------------
    

    Nun heißt es also die Tabellen in eigene Dateien zu legen, wie im obigen Beispiel zu sehen ist, endet jeder Datensatz immer mit
    -- --------------------------------------------------------
    Danach folgt die nächste Tabelle und die zugehörigen Daten.

    Wichtig: legt vorher eine Sicherung der Originaldatei an!

  7. Nun werden die Daten in die neue Datenbank importiert. Auch dazu nutze ich im folgenden phpMyAdmin. Wer bei seinem Hoster dieses Tool nicht zur Verfügung hat, der kann es auch in seinem Webspace selber einrichten, aber aufpassen - mit einem Passwort schützen!
    Wenn der Link „Importieren“ zur Verfügung steht, dann kann man damit direkt die Datei wählen und alles andere macht phpMyAdmin.
    Importieren mit phpMyAdmin
    Sollte diese Möglichkeit nicht bestehen, dann gehen wir über „SQL“, ganz oben in den Tabs.
    SQLmit phpMyAdmin
  8. Wenn man nun mit SQl arbeiten muss, so müssen die Anweisungen aus dem SQL-File per Copy (Strg+C)/Paste (Strg+V) in das Fenster von phpMyAdmin übertragen werden und OK klicken.
  9. Nachdem man alle Daten in die neue Datenbank importiert hat, gehen wir in das Blog zurück und schauen mal, ob alles vorhanden ist und ohne Probleme läuft.

weitere Probleme:

Unter anderem kann es zu Problemen mit Sonderzeichen kommen, heist wir sehen in der Ausgabe kein Ü sondern kryptische Zeichenœ. Die können wir mit einem kleinen Script beheben. Sollen alle Tabellen in der Datenbank durchforstet werden und alle Sonderzeichen sollen UTF-8 codiert sein, so ist das Script content encoding zu empfehlen.
Die Mime-Deklarierung eures Blogs findet ihr bei WP unter Einstellungen --> Lesen - UTF-8 ist Standard und auch zu empfehlen.

Will man nur einzelne Tabellen durchforsten und gegebenfalls die Zeichen ändern, so kann der folgende Code genutzt werden - Kopieren, in einer php-Datei speichern und in den Ordner wp-content des Blogs kopieren, oder downloaden.

Die Datei dann über den Browser aufrufen. Die Datei für jede Tabelle anpassen.


<?php
	/**************************************************
		Convert WP Content encoding
	
		BASISSCRIPT: Markus Tacker <m@tacker.org>
		Modified:    Frank Bueltge <bueltge.de>
	***************************************************/

	// New coding
	$new_encoding = 'UTF-8';

	// WordPress config
	require_once '../wp-config.php';

	// Connect DB
	$DBC = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
	mysql_select_db(DB_NAME, $DBC);

	$table = $wpdb->prefix.'comments';

	echo '<pre>';
		$result_data = mysql_query('SELECT * FROM ' . $table);
		echo $table . ' ';
		while ($data = mysql_fetch_assoc($result_data)) {
			$sql = 'UPDATE ' . $table;
			// Build set
			$set = array();
			foreach ($data as $key => $val) {
				$set[] = ek($key) . '=' . ev(mb_convert_encoding($data[$key], $new_encoding));
			}
			$sql .= ' SET ' . join(', ', $set);
			// Build where
			$where = array();
			foreach ($data as $key => $val) {
				if (!preg_match('/[0-9]+/', $val)) continue; // Use only numbers in where
				$where[] = ek($key) . '=' . ev($data[$key]);
			}
			$sql .= ' WHERE ' . join(' AND ', $where);
			$query_result = mysql_query($sql, $DBC);
			if (!$query_result) {
				die('Invalid query: ' . mysql_error());
			}
			echo '.';
			flush();
		}
		echo "\n";
	echo 'All done.&gt;/pre>';

	// Disconnect DB
	mysql_close($DBC);

	function ek($string)
	{
		global $DBC;
		return "`" . mysql_real_escape_string($string, $DBC) . "`";
	}

	function ev($string)
	{
		global $DBC;
		return "'" . mysql_real_escape_string($string, $DBC) . "'";
	}
?>

42 Comments

  1. "[...] aber in der Regel kann man nie mehr als 1MByte an Daten importieren [...]"

    Dazu ist anzumerken, dass die Daten erst hochgeladen werden müssen bevor sie von phpMyAdmin verarbeitet werden können. Somit stellt jeder Import für den Server erst einmal einen Upload dar.
    Die Dateigröße für einen Upload wird i.d.R. in der php.ini geregelt. Es liegt also in der Hand des Server-Admins wie groß Dateien für den Upload sein dürfen. Bei sehr konservativ eingestellten Servern sind das auch schon mal weit weniger als 1MB. Bei anderen Servern auch schon mal mehr als 2MB.

    Ich benutze aus verschiedenen Gründen einen Desktop-Client für MySQL-Operationen. Dazu verwende ich MySQL Control Center (gibt es z.B. hier: http://www.soft-ware.net/office/daten/oberflaeche/p03277.asp).
    Zum einen habe ich beim Client nicht die Upload-Beschränkungen. Zum anderen lassen sich damit auch noch einige andere "Pflegearbeiten" an den DBS recht komfortabel vornehmen. Man kann SQL-Befehle in Textdateien abspeichern und sie im Client mit 2,3 Mausklicks ausführen.
    Ein weiterer Vorteil eines Desktop-Clients liegt in der maximalen Ausführungszeit für PHP-Scripte. Ist diese auf dem Server zu kurz bemessen, kann phpMyAdmin Probleme bei recht umfangreichen (langwierigen) DB-Aktionen bekommen.

    Jeder der sich etwas intensiver mit seinen MySQL-DBs beschäftigt, sollte auch mal eionen Blick auf einen Desktop-Client werfen. Neben MySQL Control Center gibt es davon noch ein paar andere.

  2. Hi
    danke für die Erklärung, die sehr einfache, ich nehm die in meine Liste zu den WP Tipps auf.

    Für große Datenbanken nehm ich immer dieses Script:
    http://www.ozerov.de/bigdump.php

    damit habe ich Foren mit >500 000 Einträgen und >5000User leichtest übersiedelt.

    offtopic:
    gemein, vergaß die Spamfrage, nutz den Return button der ganze Kommentar weg *snief* und
    entweder hat mein Flock was, aber Deine Seiten *derladen* bei mir kaum

    Dir einen schönen Sonntag
    Monika, die jetzt die Spamschutzfrage vorher ausgefüllt hat 😉

  3. "Fatal error: Call to undefined function: mb_convert_encoding() in ...\wp-content\iconv.php on line 32"

    Beim Aufruf des Konvertierungs-Scriptes

  4. Danke für die Hilfe. Nur habe ich das Problem, dass alle Bilder und Artikel noch auf den alten Server verlinken sind, woran kann das liegen?

  5. Dann wirst du nochmal mit Suchen/Ersetzen in der Datenbank die Links ändern müssen. Prüfe im Vorfeld doch mal einen Link im Editor und unbedingt eine Sicherung der DB aufsetzen.

  6. Hallo Frank,

    ich bin auch gerade am umziehen und habe eine Frage:

    Früher gab es doch in den WordPress-Optionen mal die Möglichkeit, den "echten" Serverpfad zum Blog irgendwo in den Optionen einzustellen. Ich finde das mittlerweile in der neuen Version nirgendwo wieder - weder in den Optionen, noch in der config-Datei.

    Nun suchen nur leider ein, zwei Plugins und die Upload-Optionen an der alten Stelle: /homepages/45/d1234583xx/htdocs/blog/wp-content/ .

    Hast du eine Ahnung, wo - in welcher Datei - sich die Einstellung versteckt?

    Das Problem mit den Umlauten hatte ich auch, habe es mit einem zweiten Import mittels WP-DBManager gelöst ( http://lesterchan.net/portfolio/programming.php ).

Comments are closed.