Migrer une base WordPress créée par module OVH vers une base MySQL « normale »

La création de blogs et autres sites web avec les modules d’OVH a l’avantage
de se faire en quelques clics de souris mais l’inconvénient d’entrainer
une certaine « lourdeur » voire carrément des blocages, notamment lorsque
l’on veut faire évoluer son site (mise à jour automatique de WordPress)
ou encore ajouter des plugins et autres add-ons.

Le but de la manipulation décrite ici est de passer facilement d’une base
MySQL créée par module OVH WordPress et relativement inaccessible
vers une base MySQL « normale », notamment accessible par PhpMyAdmin
et autres outils classiques.

En dehors du fichier « wp-config.php », il n’y a aucune modification à faire
dans les fichiers du site web (fichiers PHP, Javascript, images, feuilles
de style, etc.)

Ne pas se fier à la relative longueur de ce texte, si tout se passe bien,
vous en avez pour moins de 5 minutes 

Lire l’ensemble du texte avant de se lancer.

Etape 1 : créer une nouvelle base de données dans le manager du site web
d’OVH (dans « Hébergement » / « Gestion de MySQL » / « Nouvelle base MySQL »)

Etape 2 : attendre l’email d’OVH confirmant la bonne création de cette base
et noter les identifiants de connexion à celle-ci (login, mot de passe, etc.)

Si le script signale un problème d’accès à la nouvelle base et que vous êtes
sûr et certain d’utiliser le bon nom d’hôte, de base, de login et de mot de passe,
vous pouvez patienter un peu (disons 1 heure ou 2) ou sinon vous pouvez essayer
de réinitialiser le mot de passe d’accès à la base.

Etape 3 : Faire un copier-coller du script PHP qui suit et l’enregistrer dans
votre PC domicile/bureau sous un nom tel que « wp_move_db.php ».
(vous pouvez l’appeler comme bon vous semble mais l’extension « .php »
est obligatoire)

Le faire via un éditeur de texte ultra-simple du genre le « bloc-notes » sous Windows.
Ne pas utiliser de traitement de texte type « Microsoft Word » ou équivalent
qui risquerait d’introduire des caractères parasites invisibles.

Si vous utilisez « text edit » sous MacOS, attention au format du fichier,
cf le message n°53 et suivant de ce topic.

Etape 4 : Modifier au début de ce fichier les informations de connexion
à la nouvelle base MySQL (le script doit trouver tout seul les informations
de connexion à l’ancienne base) que vous venez de créer à l’étape 1.

Etape 5 : Une fois le script mis à jour, le transférer par FTP (avec FileZilla
par exemple) et le placer dans le même répertoire que le fichier « wp-config.php »
de votre installation WordPress (par exemple dans le répertoire « WordPress3 »)

Etape 6 : lancer l’exécution du script en tapant son adresse dans votre navigateur web :

http://www.votre_site.fr/WordPress3/wp_move_db.php

ou encore

http://www.votre_site.fr/wp_move_db.php

selon l’endroit où se trouve votre installation WordPress.

Le script devrait s’exécuter en quelques secondes et vous afficher
« Fin normale du programme » si tout s’est bien déroulé.

Etape 7 : par défaut, le script se contente de créer un nouveau
fichier « wp-config-nouveau.php » contenant les informations de connexion
à votre nouvelle base WordPress et laisse intact votre ancien « wp-config.php ».

Vous avez le choix :

– soit de renommer manuellement (par FTP) ce fichier en « wp-config.php »
(en effaçant/renommant au préalable l’ancien)

– soit de laisser faire cette modification par le script PHP, dans ce cas placer
la variable « $rename » à 1 au début du script. Le fichier courant « wp-config.php »
sera sauvegardé sous le nom « wp-config-ancien.php ».

Une fois le fichier « wp-config.php » mis à jour, votre installation WordPress
utilisera votre nouvelle base de données et non plus l’ancienne.
La migration est alors terminée 

Etape optionnelle : le script sauvegarde l’ancienne base dans un fichier
SQL compressé, « wp_20110930.gz » par exemple (format « wp_YYYYMMDD.gz »).
Une fois la migration terminée, vous pouvez effacer (par FTP) ce fichier
ou encore le recopier localement afin d’en avoir une sauvegarde.

Précisions : le script PHP de migration ne peut en aucune façon détruire/modifier
votre ancienne base de données (il ne fait que la lire).

Par précaution, avant de lancer l’exécution du script, faite une copie locale
(par FTP) de votre ancien fichier « wp-config.php » afin d’en garder une trace
juste au cas où.

<?PHP

// --------------------------------------------------

/*
   AVANT d'exécuter ce script, vous devez, impérativement, avoir créé
   une nouvelle base de données pour WordPress via le manager
   du site web d'OVH.

   Une fois la base créée, vous aller recevoir un email d'OVH
   intitulé "[MySQL] La base MySQL ...". A l'intérieur se trouvent
   les informations de connexion que vous allez devoir reprendre
   dans ce script :

     Serveur        : $new_db_host
     Utilisateur    : $new_db_user
     Nom de la base : $new_db_name
     Mot de passe   : $new_db_password

   Par exemple, si dans l'email vous avez :

     Serveur        : mysql5-1.starter
     Utilisateur    : mon_login
     Nom de la base : mabase
     Mot de passe   : XYZ1234

   cela donnera dans ce script :

    $new_db_host = "mysql5-1.starter";
    $new_db_user = "mon_login";
    $new_db_name = "mabase";                
    $new_db_password = "XYZ1234";                

*/

    $new_db_host = "";
    $new_db_user = "";
    $new_db_name = "";
    $new_db_password = "";

    // ----------------------------------

    $rename = 0;        // Valeurs possibles : 0 ou 1. 1 signifiant que le programme va modifier les informations
                            // de connexion dans le fichier "wp-config.php" afin que WordPress ne se connecte plus
                            // à l'ancienne base mais à la nouvelle base.

                            // 0 signifie que ce script va seulement créer le nouveau fichier "wp-config-nouveau.php",
                            // il ne vous restera plus qu'à le renommer manuellement par FTP en "wp-config.php" afin
                            // de permettre à WordPress d'utiliser la nouvelle base.

    $db_charset = "";     // Valeurs possibles : 'utf8' ou 'latin1', à ne changer que si les caractères accentués
                            // de la nouvelle base sont incorrects

    $DEBUG = 0;        // Valeurs possibles 0 ou 1, afin d'afficher davantage d'informations lors de l'exécution

// **********************************************************************************************

function GetCharset ($db,$db_name)
{
        $cmd = "SHOW TABLE STATUS FROM `$db_name` LIKE 'wp_users'";
        $result=mysql_query ($cmd,$db);
        $myrow=mysql_fetch_array($result);

        $db_charset = "utf8"; // Par défaut, on utilise l'Unicode

        if ($myrow)
        {
            if ($myrow["Collation"] == "utf8_general_ci")
            {
                $db_charset = "utf8";
            }
            else
            {
                $db_charset = "latin1";
            }
        }

    return ($db_charset);
}

function my_exec ($cmd, $error_msg)
{
    global $DEBUG;

       if ($DEBUG)
       {
           print "cmd = $cmd<br>\n";
       }

       $statut = system($cmd);

       if ($statut === FALSE)
       {
           print "<br>".$error_msg;
           exit;
       }
}

// **********************************************************************************************

    // --------------------------------------------------------------
    // Récupération des données de connexion à l'ancienne base WordPress
    // dans le fichier 'wp-config.php'

    $tab = file("wp-config.php");

    if ($tab === FALSE)
    {
        print "Impossible de lire le fichier 'wp-config.php'<br>\n";
        print "Ce script PHP doit être dans le même répertoire que le fichier 'wp-config.php' de WordPress .<br>\n";
        exit;
    }

    $db_name ="";
    $db_host = "";
    $db_user = "";
    $db_password = "";

    for ($i=0; $i<50; $i++)
    {
        $ligne = $tab[$i];

        if (strpos($ligne,'define(\'DB_NAME') !== FALSE)
        {
            preg_match('/(.*)\'(.*)\'(.*)\'(.*)\'(.*)/', $ligne, $data);
            $db_name = $data[4];
        }

        if (strpos($ligne,'define(\'DB_USER') !== FALSE)
        {
            preg_match('/(.*)\'(.*)\'(.*)\'(.*)\'(.*)/', $ligne, $data);
            $db_user = $data[4];
        }

        if (strpos($ligne,'define(\'DB_PASSWORD') !== FALSE)
        {
            preg_match('/(.*)\'(.*)\'(.*)\'(.*)\'(.*)/', $ligne, $data);
            $db_password = $data[4];
        }

        if (strpos($ligne,'define(\'DB_HOST') !== FALSE)
        {
            preg_match('/(.*)\'(.*)\'(.*)\'(.*)\'(.*)/U', $ligne, $data);
            $db_host = $data[4];
        }
    }

    if (($db_name == "") || ($db_user == "") || ($db_password == "") || ($db_host == ""))    
    {
        print "Probleme lors de la recuperation des donnees de connexion depuis le fichier 'wp-config.php'";
        exit;
    }

    if (strpos ($db_host, "modules") === FALSE)
    {
        print "Attention, votre fichier 'wp-config.php' semble ne pas utiliser le module OVH WordPress.<br><br>\n";

        print "Si vous avez deja execute une premiere fois ce script, verifiez que votre fichier<br>\n";
        print "'wp-config.php' contient bien les informations de connexion a votre ancienne base de donnees<br>\n";
        print "et non celles de la nouvelle base.<br>\n";

        exit;
    }

    // ----------------------------------------------------------------
    // Connexion a la nouvelle base de données
    // Seulement dans le but de s'assurer que les paramètres de connexion sont les bons

    $db = mysql_connect($new_db_host, $new_db_user, $new_db_password);

    if ($db === FALSE) 
    {
            print "Connexion impossible à la nouvelle base de donnees : ".mysql_error();
            print "Verifiez bien vos informations : nom d'hote, login et surtout mot de passe<br>\n";            
            exit;
    }
    else
    {
            // On teste seulement la connexion a la nouvelle base de donnee

            $statut = mysql_select_db ($new_db_name, $db);

        if ($statut === FALSE) 
        {
               print "Impossible de selectionner la nouvelle base de donnees : ".mysql_error();
               print "Verifiez bien vos informations : nom de base<br>\n";
               mysql_close ($db);
               exit;
        }    
        else
        {
               mysql_close($db);
            }
    }

    // ----------------------------------------------------------------
    // Connexion a l'ancienne base de données (créee par le module OVH)

    $db = mysql_connect($db_host, $db_user, $db_password);

    if ($db === FALSE) 
    {
            print "Connexion impossible à l'ancienne base de donnees : ".mysql_error();
            exit;
    }

    $statut = mysql_select_db ($db_name, $db);

    if ($statut === FALSE) 
    {
           print "Impossible de selectionner l'ancienne base de donnees : ".mysql_error();
           mysql_close ($db);
           exit;
    }    

    $db_charset = GetCharset ($db,$db_name);

    if ($DEBUG)
    {    
        print "db_name = $db_name<br>\n";    
        print "db_user = $db_user<br>\n";
        print "db_password = $db_password<br>\n";
        print "db_host = $db_host<br>\n";
        print "db_charset = $db_charset<br>\n";
    }

    // ------------------------------------------------------------------
    // Sauvegarde de l'ancienne base de données (créee par le module OVH)

    $date_actuelle = date ("Ymd",time());
    $backup_filename = "wp_".$date_actuelle.".gz";

    $cmd = "mysqldump --host='$db_host' --user='$db_user' --password='$db_password' -e --default-character-set='$db_charset' '$db_name' | gzip -c > $backup_filename ";
    my_exec ($cmd, "Erreur lors de l'execution du mysqldump"); 

    mysql_close ($db); 

    print "La sauvegarde (mysqldump) de l'ancienne base s'est bien deroulee.<br>\n";

    // --------------------------------------------------------------
     // Injection des données de l'ancienne base dans la nouvelle base

     if (($new_db_name == "") || ($new_db_host == "") || ($new_db_password == "") || ($new_db_user == ""))
     {
         print "<br>Erreur : vous devez indiquer les informations de connexion à la nouvelle base de donnees,<br>\n";
         print "Cf les explications en commentaires au début de ce script.<br>\n";
         exit;
     }

    $cmd = "gzip -d < $backup_filename | mysql --host='$new_db_host' --user='$new_db_user' --password='$new_db_password' '$new_db_name'";
    my_exec ($cmd, "Erreur lors de l'injection des donnees dans la nouvelle base"); 

    print "L'injection des donnees de l'ancienne base dans la nouvelle s'est bien déroulee.<br>\n";

    // --------------------------------------------------------------------------
    // On va créer un nouveau fichier "wp-config.php" contenant les informations
    // de connexion à la nouvelle base de données.

    $fp = fopen ("wp-config-nouveau.php","w");

    if (!$fp)
    {
        print "<br>Impossible d'ouvrir en ecriture le nouveau fichier 'wp-config-nouveau.php'<br>\n";
        exit;
    }

    foreach ($tab as $ligne)
    {
        if (strpos($ligne,'define(\'DB_NAME') !== FALSE)
        {
            $ligne = "define('DB_NAME', '".$new_db_name."');\n";
        }

        if (strpos($ligne,'define(\'DB_USER') !== FALSE)
        {
            $ligne = "define('DB_USER', '".$new_db_user."');\n";
        }

        if (strpos($ligne,'define(\'DB_PASSWORD') !== FALSE)
        {
            $ligne = "define('DB_PASSWORD', '".$new_db_password."');\n";
        }

        if (strpos($ligne,'define(\'DB_HOST') !== FALSE)
        {
            $ligne = "define('DB_HOST', '".$new_db_host."');\n";
        }

        fwrite ($fp, $ligne);
    }

    fclose ($fp);

    print "Le fichier 'wp-config-nouveau.php' a bien ete cree.<br>\n";

    if ($rename)
    {
        my_exec ("mv wp-config.php wp-config-ancien.php", "Erreur lors du renommage de l'ancien fichier 'wp-config.php'");
        my_exec ("cp wp-config-nouveau.php wp-config.php", "Erreur lors du renommage du nouveau fichier 'wp-config.php'");

        print "Le fichier 'wp-config-nouveau.php' a bien ete renomme en 'wp-config.php'<br>\n";
        print "Vous pouvez desormais utiliser WordPress avec votre nouvelle base de donnees.<br>\n";
    }
    else
    {
        print "Il ne vous reste plus qu'a renommer par FTP le fichier 'wp-config-nouveau.php'<br>\n";
        print "en 'wp-config.php' afin de permettre à WordPress d'utiliser la nouvelle base de données<br>\n";
    }

    print "<br><br>Fin normale du programme.<br>\n";
?>

Edit 06/XII/2011 : Adaptation pour WordPress 2.5
Edit 24/V/2012 : Ajout d'informations pour Text Edit sous MacOS
Edit 30/V/2012 : Renforcement des contrôles sur les paramètres d'accès à la nouvelle base
Edit 18/XI/2012 : Ajout d'informations en cas de souci d'accès à la nouvelle base

http://forum.ovh.com/showthread.php?t=73712

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *