MySQL, PhpMyadmin, Console – Les bonnes pratiques pour la migration d’une base de données MySQL


Voilà un problème éminemment concret, en temps de crise ! Faute d’argent, on est souvent contraint par les circonstances de migrer un site qui vivait tranquillement sa vie sur un serveur dédié ou sur le Cloud pour prendre un hébergement moins onéreux. Le choix se porte alors fréquemment sur un serveur mutualisé où les contraintes (espace, bande de passante, accès à la BDD…etc.) sont plus serrées. Un des problèmes si vous avez à migrer un site va être d’optimiser votre temps et d’éviter au maximum une interruption de service, forcement dommageable à la relation commerciale que vous entretenez avec votre client ! Si le site est « down » pendant une durée indéterminée, cela fait mauvais genre.

Dans cet article, on va donc voir surtout comment migrer une Base de Données MySQL sur un espace mutualisé où vos possibilités d’import de fichiers .sql sont limités en poids. A titre d’exemple chez OVH, vous ne pouvez importer que des fichiers de 16 Mo dans les premiers offres mutualisés or en moyenne un site qui existe depuis 3 ou 4 ans peut avoir une base complète bien au-de-là de cette limite ridicule.

Un autre cas de figure, assez classique, qui vous impose cette pratique, c’est que vous ne pouvez avoir accès en console au client MySQL de ce nouvel espace d’hébergement soit parce qu’il est mutualisé soit par exemple que l’administrateur réseaux psychote grave à l’idée de vous laisser un accès au client MySQL* ! Vous n’aurez donc qu’un accès réduit à MySQL via phpMyAdmin

* Une remarque, on est jamais trop prudents toutefois donc ne pas livrer des accées root au premier venu est plutôt salutaire mais disons que certains administrateurs réseaux abusent un peu de leurs prérogatives… Que voulez-vous ? Ce sont des nerds au dernier degré, il faut donc composer.

La marche à suivre pour « spliter » une BDD MySQL en vue d’une migration sur un hébergement mutualisé

Pour se faire, la marche à suivre la plus rapide est de passer par un environnement de développement tel que MAMP sur MAC ou de EasyPHP sur PC afin d’accéder via la console au client MySQL et de réaliser une série d’import et d’export sans aucune restriction.

  1. Création d’une BDD MySQL vide sous votre nouvel espace d’hébergement via PhpMyadmin
  2. Importation de la BDD initiale du site dans le client MySQL en local (MAMP ou EASYPHP)
  3. Exportation de chaque table au format .sql à l’aide de mysqldump
  4. Injection via PhpMyadmin de chaque table au format .sql

Création de la BDD sur l’espace mutualisé

Un PhpMyadmin sur un espace mutualisé
MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Votre BDD est vide, vous sélectionnez ensuite la fonction d’import pour envoyer l’ensemble de vos « petits » fichiers .sql
MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

La limite de 16 Mo chez OVH
MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Injection en local de votre ancienne BDD et « split » de celle-ci

Se connecter an local via la console au client MySQL sous MAMP. Par défaut, le couple utilisateur:mot de passe est root:root

	# Se connecter an LOCAL via la console au client MySQL
	/Applications/MAMP/Library/bin/mysql -u root -p

MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Créer une BDD

	# Créer une BDD
	CREATE DATABASE migratiowp1;

MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Utiliser cette BDD vide nouvelle créée

	# Selectionner la BDD
	USE migratiowp1;

MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Injecter le contenu de votre ancienne BDD

	# Injecter le contenu
	SOURCE /Users/nom-utilsateur/Documents/chemin-vers-les-fichiers-SQL/sql_fichier/dump_sql_migratiowp1.sql;

MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

Pour l’exemple, nous avons décidé de migrer un blog sous WP

# Export de la TABLE wp_posts
/Applications/MAMP/Library/bin/mysqldump -c -u root -p migratiowp1 wp_posts > /Users/nom-utilsateur/Documents/chemin-vers-les-fichiers-SQL/sql_fichier/wp_posts_migratiowp1.sql

MySQL, PhpMyadmin, Console - Les bonnes pratiques pour la migration d'une base de données MySQL

# Export de la TABLE wp_terms
/Applications/MAMP/Library/bin/mysqldump -c -u root -p migratiowp1 wp_posts > /Users/nom-utilsateur/Documents/chemin-vers-les-fichiers-SQL/sql_fichier/wp_terms_migratiowp1.sql

Conclusion : Il ne vous reste plus qu’à exporter toutes les tables les unes après les autres. Vous devriez vous retrouver avec une collection de fichiers .sql de taille inférieure à la BDD complète et donc avoir toutes les chances de passer sous les fourches caudines de l’import sous PhpMyadmin de votre espace mutualisé. Un conseil avant de vous livrer à l’import, certaines tables sont dépendantes entre elles donc assurez-vous de bien avoir sous les yeux le schéma relationnel de votre BDD

Pour mémoire, les mêmes commandes servent d’ailleurs au backup des BDD

	# Utiliser le client mysqldump pour faire un backup de la TABLE hecube_demo_users dans la base hecube_demo
	/Applications/MAMP/Library/bin/mysqldump -c -u root -p hecube_demo hecube_demo_users > /Users/username/rep-1/he3_blog/datas/hecube_demo_users.mysqldump-1.SQL

Pour mémoire, quelques commandes toujours utiles

		# voir toutes les BDD
		SHOW DATABASES;
	# Supprimer une BDD
	DROP DATABASE migratiowp1;

Pour plus d’informations, sur la gestion des BDD MySQL, vous pouvez jeter un oeil à cet article de notre blog.

Extrait de l’export de la table wp_posts via la client MySQL sous MAMP

	# Utiliser le client mysqldump pour faire un backup de toutes TABLES dans une base hecube_demo
	/Applications/MAMP/Library/bin/mysqldump -c -u root -p hecube_demo hecube_demo_users > /Users/username/rep-1/he3_blog/datas/hecube_demo.mysqldump-FULL.SQL
		-- MySQL dump 10.13  Distrib 5.1.37, for apple-darwin8.11.1 (i386)
		--
		-- Host: localhost    Database: migratiowp1
		-- ------------------------------------------------------
		-- Server version	5.1.37
 
		/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
		/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
		/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
		/*!40101 SET NAMES utf8 */;
		/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
		/*!40103 SET TIME_ZONE='+00:00' */;
		/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
		/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
		/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
		/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
		--
		-- Table structure for table `wp_posts`
		--
 
		DROP TABLE IF EXISTS `wp_posts`;
		/*!40101 SET @saved_cs_client     = @@character_set_client */;
		/*!40101 SET character_set_client = utf8 */;
		CREATE TABLE `wp_posts` (
		  `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
		  `post_author` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
		  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
		  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
		  `post_content` longtext NOT NULL,
		  `post_title` text NOT NULL,
		  `post_excerpt` text NOT NULL,
		  `post_status` VARCHAR(20) NOT NULL DEFAULT 'publish',
		  `comment_status` VARCHAR(20) NOT NULL DEFAULT 'open',
		  `ping_status` VARCHAR(20) NOT NULL DEFAULT 'open',
		  `post_password` VARCHAR(20) NOT NULL DEFAULT '',
		  `post_name` VARCHAR(200) NOT NULL DEFAULT '',
		  `to_ping` text NOT NULL,
		  `pinged` text NOT NULL,
		  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
		  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
		  `post_content_filtered` text NOT NULL,
		  `post_parent` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
		  `guid` VARCHAR(255) NOT NULL DEFAULT '',
		  `menu_order` INT(11) NOT NULL DEFAULT '0',
		  `post_type` VARCHAR(20) NOT NULL DEFAULT 'post',
		  `post_mime_type` VARCHAR(100) NOT NULL DEFAULT '',
		  `comment_count` BIGINT(20) NOT NULL DEFAULT '0',
		  PRIMARY KEY (`ID`),
		  KEY `post_name` (`post_name`),
		  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
		  KEY `post_parent` (`post_parent`),
		  KEY `post_author` (`post_author`)
		) ENGINE=MyISAM AUTO_INCREMENT=2743 DEFAULT CHARSET=utf8;
		/*!40101 SET character_set_client = @saved_cs_client */;
 
		--
		-- Dumping data for table `wp_posts`
		--
 
		--- les données viennent ensuite...

En savoir plus