102 votes

Mysqldump vers un tar.gz

Généralement, après avoir fait un dump d'une base de données MySQL avec la commande mysqldump, je comprime immédiatement le fichier résultant avec tar/gzip. Je cherche un moyen de le faire en une seule commande :

Donc, au lieu de faire ceci :

mysqldump dbname -u root -p > dbname.sql
tar czvf dbname.sql.tgz dbname.sql
rm dbname.sql

Je voudrais quelque chose comme :

mysqldump dbname -u root -p > un peu de magie > dbname.sql.tgz

Ou même mieux (puisque j'envoie souvent le fichier de dump vers un autre serveur via scp) :

mysqldump dbname -u root -p > envoyer dbname.sql.tgz à user@host

Je suis sous bash sur Debian.

4voto

Essayez ceci:

mysqldump --all-databases --password=dbpassword | gzip -c | ssh user@servername "cat >/tmp/nom_de_votre_choix.gz"

Veuillez noter que je ne suis en aucun cas bon en cela, j'ai simplement combiné 2 options sur le web en une seule.

Il est possible qu'il existe une méthode meilleure, mais ceci est une commande qui fonctionne pour moi.

Toutefois, cela nécessite que les clés ssh soient installées et acceptées si vous voulez l'utiliser dans des scripts ou crontab ou autre.

1 votes

Bienvenue sur ServerFault. Cela me semble parfaitement raisonnable.

2voto

Min He Points 61

Vous pouvez faire comme:

mysqldump --add-drop-table -h dbhost -u dbuser -p dbname (nomtable nometable ... ) | gzip -c > wp.sql.gz

par exemple

mysqldump --add-drop-table -h localhost -u root -p wordpress | gzip -c > wp.sql.gz

1voto

Fernando Fabreti Points 123

J'ai travaillé sur ce script bash ci-dessous qui essaie de rassembler tous les bons conseils que j'ai vus en ce qui concerne les opérations de sauvegarde/restauration avec mysql. Il est destiné aux opérations à distance.

Il vous suffit de reconfigurer les variables et de l'essayer. :)

Les fonctionnalités sont :

  • vous pouvez passer une liste de tables à sauvegarder (sauvegarde sélective)
  • vous pouvez être invité à saisir des mots de passe (MySQL/SSH) ou les définir dans des variables
  • la transmission réseau est compressée en gzip
  • vous pouvez choisir de sauvegarder la sauvegarde compressée en gzip sur un serveur distant
  • vous pouvez réimporter la sauvegarde sur un serveur distant à la volée (pas de fichiers temporaires sur le serveur local/distant)
  • vous avez un retour visuel sur ce qui se passe (grâce à echo et pv)
  • vous pouvez définir des variables mysql avant et après le processus de sauvegarde

Les améliorations nécessaires :

  • vous devez passer une liste de tables (vous ne pouvez pas sauvegarder toutes les tables)
  • les mots de passe MySQL sont les mêmes pour la source et la cible
  • vous devez ACCORDER LES PRIVILÈGES manuellement (il semblerait que MySQL ne permette pas de le faire à distance)
  • vous devez avoir installé sshpass
  • certains tables compressées de grande taille innodb sont lentes à sauvegarder (peut-être à cause de mysqldump)

Je partage ce script ici en espérant qu'il puisse être amélioré par la communauté. (meilleur visualisé avec nano ou un autre éditeur qui colorie le code)

--------------------------------- coupez ici----------------------------------

#!/bin/bash
#set -x

#VARIABLES REQUISES
SOURCE_USER=root   #utilisateur MySQL
SOURCE_HOST=localhost
SOURCE_PASSWORD=votremotdepassemysql  #facultatif
SOURCE_DBNAME=votrenomdb
TARGET_HOST=192.168.1.2
TARGET_DBNAME=votrenomdb
TARGET_SSHUSER=root
TARGET_SSHPASSWORD=votepassessh  #facultatif
TABLES='table1 table2 table3 table4'
TARGET_DIR="/data/dumpfiles"
EXEC_ACTION_TEXT[0]='Réimporter les TABLES directement dans la base de données MySQL distante'
EXEC_ACTION_TEXT[1]='Sauvegarder les données compressées en gzip dans TARGED_DIR sur TARGET_HOST distant'
EXEC_ACTION=0

#afficher la configuration
echo "---------------------------------"
echo " SOURCE_USER:    $SOURCE_USER (MySQL)"
if [ "SOURCE_PASSWORD" != "" ]; then
echo " SOURCE_PASSWORD:        "; else
echo " SOURCE_PASSWORD:<à demander>    "
fi
echo " SOURCE_HOST:    $SOURCE_HOST     "
echo " SOURCE_DBNAME:  $SOURCE_DBNAME   "
echo " TARGET_HOST:    $TARGET_HOST     "
echo " TARGET_DBNAME:  $TARGET_DBNAME   "
echo " TARGET_SSHUSER: $TARGET_SSHUSER  "
if [ "TARGET_SSHPASSWORD" != "" ]; then
echo " TARGET_SSHPASS:      "; else
echo " TARGET_SSHPASS: <à demander>    "
fi
echo " TABLES:         $TABLES          "
echo " EXEC_ACTION:    $EXEC_ACTION - ${EXEC_ACTION_TEXT[$EXEC_ACTION]}"
echo " TARGET_DIR:     $TARGET_DIR (uniquement pour l'action 1)"
echo "---------------------------------"
echo "Appuyez sur  pour continuer...";  read;  echo

#lire le mot de passe mysql à partir de la ligne de commande (SOURCE et TARGET utilisent le même mot de passe)
if [ "$SOURCE_PASSWORD" == "" ]; then
     echo -n "Saisissez le mot de passe de $SOURCE_USER pour les serveurs MySQL : "; read -s SOURCE_PASSWORD; echo
fi
echo "Création de la base de données $TARGET_DBNAME sur $TARGET_HOST si elle n'existe pas ... "
mysql \
--user=$SOURCE_USER \
--password=$SOURCE_PASSWORD \
--host=$TARGET_HOST \
--execute "create database if not exists $TARGET_DBNAME;"

echo '--------------------------------------------------------------------------------------'
echo "**** ATTENTION **** : exécutez cette commande sur le serveur mysql à  $TARGET_HOST :"
echo "ACCORDER TOUS LES PRIVILÈGES SUR $TARGET_DBNAME.* À '$SOURCE_USER'@'%' IDENTIFIED BY 'yourpass';"
echo '--------------------------------------------------------------------------------------'
echo "Appuyez sur  pour continuer...";  read;  echo

#lire le mot de passe à partir de la ligne de commande
if [ "$TARGET_SSHPASSWORD" == "" ]; then
     echo -n "Saisissez le mot de passe pour le serveur SSH distant (CIBLE) ['$TARGET_SSHUSER'@'$TARGET_HOST'] : "; read -s TARGET_SSHPASSWORD; echo
fi

for thistable in $TABLES
do
     case "$EXEC_ACTION" in
         0)
         thisaction="gunzip | mysql --user=$SOURCE_USER --password=$SOURCE_PASSWORD -D $TARGET_DBNAME"
         endmessage='la réimportation distante est terminée'
         ;;
         1)
         thisaction="cat > $TARGET_DIR/`date +%Y.%m.%d`-"$thistable".gz"
         endmessage="$thisaction est terminé"
         ;;
         *)   echo "EXEC_ACTION=$EXEC_ACTION non supporté" && exit 1
     esac

     echo "---------------------------------------------------------------------"
     echo "-- table $thistable"
     echo "---------------------------------------------------------------------"
     (
       echo -n "-- configuration des variables... " > /dev/stderr  #parler à l'utilisateur via stderr
       echo "SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;"
       echo -n "démarrage de mysqldump... " > /dev/stderr
       mysqldump --opt --user=$SOURCE_USER --password=$SOURCE_PASSWORD --host=$SOURCE_HOST $SOURCE_DBNAME $thistable
       echo -n "mysqldump terminé, réinitialisation des variables... " > /dev/stderr
       echo "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;"
       echo -n "engagement... " > /dev/stderr
       echo "COMMIT;"
       echo "terminé !" > /dev/stderr
     ) | \
     gzip -c -2 | \
     pv | \
     sshpass -p $TARGET_SSHPASSWORD ssh $TARGET_SSHUSER'@'$TARGET_HOST $thisaction
     echo $endmessage ' avec un statut de sortie '$?
done

0voto

linstar Points 101

Vous pouvez également stocker votre mot de passe dans un fichier de configuration et utiliser cette option --defaults-extra-file:

mysqldump --defaults-extra-file=mysqldump.cnf NomBaseDeDonnées | gzip -c > NomSortieBD.sql.gz

Le fichier de configuration peut ressembler à ceci :

[mysqldump]
host = localhost
user = nomutilisateur
password = "motdepasse"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X