Contactez-nous : 01 71 18 39 72
Suivez-nous sur Facebook

Copier votre base de données MySQL en local... en une ligne

Votre site web est en production, mais vous détectez une anomalie sur la production, mais impossible de la reproduire en local. L'anomalie est généralement liée au jeu de données et donc, vous décidez de:

  • Effectuer un dump de la base de données en production
  • Télécharger la base de données sur votre poste
  • Supprimer la base de données locale
  • La recréer
  • Charger les données à partir du dump serveur

Ces 5 étapes, sur la vie d'une application vous allez les exécuter des dizaines de fois.

Entre en jeu un mini script qui va effectuer ces 5 étapes pour vous, en une seule ligne.
Prennez le code ci-dessous et sauvez le dans une fichier "copy_prod_db.sh".

Le script s'utilise ainsi:
./copy_prod_db.sh user@host host_db_name host_db_user host_db_password [local_db_name] [local_db_user] [local_db_password]

Le premier paramètre correspond au login et à l'adresse du serveur distant.
Le second paramètre est le nom de la base de données sur le serveur distant.
Le troisième paramètre est le nom de l'utilisateur de la base de données sur le serveur distant.
Le quatrième paramètre est le mot de passe de la base de données sur le serveur distant.

Les 3 derniers paramètres sont optionnels. Il s'agit des nom/login/password de la base de données locale. Si ils ne sont pas spécifiés, le script tentera de créer une base de données avec le même nom, en utilisant l'utilisateur root, sans mot de passe.

#!/bin/sh
 
if [ $# -le 3 ]
then
	echo "copy_prod_db.sh expects at least 4 parameters: "
	echo "copy_prod_db.sh host host_db_name host_db_user host_db_password [local_db_name] [local_db_user] [local_db_password]"
	echo "Note:"
	echo "- if no local database name is given, the host_db_name will be used"
	echo "- if no local db user is given, root will be used"
	echo "- if no local db password is given, an empty password will be used"
	exit 1
fi
 
SSH_HOST=$1
HOST_DB_NAME=$2
HOST_DB_USER=$3
HOST_DB_PASSWORD=$4
 
if [ $# -ge 5 ]
then
	LOCAL_DB_NAME=$5
else
	LOCAL_DB_NAME=$HOST_DB_NAME
fi
 
if [ $# -ge 6 ]
then
	LOCAL_DB_USER=$6
else
	LOCAL_DB_USER=root
fi
 
if [ $# -ge 7 ]
then
	LOCAL_DB_PASSWORD=-p$7
else
	LOCAL_DB_PASSWORD=
fi
 
echo "DROP DATABASE IF EXISTS $LOCAL_DB_NAME" | mysql -u$LOCAL_DB_USER $LOCAL_DB_PASSWORD
echo "CREATE DATABASE $LOCAL_DB_NAME DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci" | mysql -u$LOCAL_DB_USER $LOCAL_DB_PASSWORD
 
ssh $SSH_HOST "mysqldump -u$HOST_DB_USER -p'$HOST_DB_PASSWORD' $HOST_DB_NAME" | mysql -u$LOCAL_DB_USER $LOCAL_DB_PASSWORD $LOCAL_DB_NAME

Vous remarquerez qu'une fois tous les paramètres spécifiés, le dump et le chargement sont effectués en une seule ligne, le dump étant "pipé" directement dans la commande de chargement.

Une dernière note: il s'agit bien évidemment d'un script "sh", donc exécutable sous Linux, mais aussi sous Windows si vous utilisez Cygwin.