web-dev-qa-db-fra.com

mysqldump dans un tar.gz

Habituellement, après avoir vidé une base de données MySQL avec la commande mysqldump, je tar/gzip immédiatement le fichier résultant. Je cherche un moyen de le faire en une seule commande:

Donc à partir de là:

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

Pour quelque chose comme ça:

mysqldump dbname -u root -p > some wizardry > dbname.sql.tgz

Ou encore mieux (puisque je scp'e habituellement le fichier de vidage sur un autre serveur):

mysqldump dbname -u root -p > send dbname.sql.tgz to user@Host

J'utilise bash sur debian.

92
pygorex1
mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

Vous ne pouvez pas utiliser tar dans un tube comme celui-ci, et vous n'en avez pas besoin de toute façon, car vous ne sortez qu'un seul fichier. tar n'est utile que si vous avez plusieurs fichiers.

106
James

Si vous l'exécutez localement, utilisez simplement la commande suivante pour sauvegarder votre base de données et la compresser à l'aide de gzip:

mysqldump -u userName -p (passwordPrompt) yourDatabaseName | gzip -c > output.gz 

(Édition: clé fixe -c)

46
Dax

Utilisez un canal nommé.

mkfifo mysql_pipe
gzip -9 -c < mysql_pipe > name_of_dump.gz &
mysqldump database > mysql_pipe 
rm mysql_pipe

Je l'utilise tout le temps, c'est génial.

http://en.wikipedia.org/wiki/Named_pipe

18
Jon Haddad

J'ai écrit un script rapide pour aspirer une base de données mysql distante. Il utilise la compression mysql, la compression gzip et ssh. Aspiré une base de données de plusieurs Go à un rythme incroyable.

    ssh -C user@Host "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz

Un avantage secondaire est qu'il ne nécessite aucun espace libre sur le serveur de base de données source, vous pouvez donc l'utiliser pour sauvegarder une base de données sur un serveur avec zéro espace disque libre avant de procéder à un élagage de vos données.

J'espère que cela aide quelqu'un.

17
Tony Dillon

Utilisez pv et surveillez le taux!

mysqldump prod_db -h dbslave | pv | gzip -c > prod_2012_08_20.dump.tgz

Ou, si vous connaissez la taille (3 Go), obtenez une estimation précise:

mysqldump prod_db -h dbslave | pv -s 3g | gzip -c > prod_2012_08_20.dump.tgz
5
New Alexandria

Essaye ça:

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

Veuillez noter que je ne suis en aucun cas bon dans ces domaines, je viens de combiner 2 options sur le Web en une seule.

Cela peut très bien être mieux d'une autre manière, mais c'est un doublure qui fonctionne pour moi.

Il nécessite cependant ssh.keys à installer et à accepter si vous souhaitez l'utiliser dans des scripts ou crontab ou similaire.

4
Charlie Candergart

Vous pouvez faire comme:

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

par exemple.

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

2
Min He

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

Reconfigurez simplement vars et essayez-le. :)

Les fonctionnalités sont:

  • vous pouvez passer une liste de tables à vider (vidage sélectif)
  • vous pouvez être invité à saisir des mots de passe (MySQL/SSH) ou à les définir dans des variables
  • la transmission réseau est gzippée
  • vous pouvez choisir d'enregistrer le vidage gzippé sur un serveur distant
  • vous pouvez réimporter le vidage sur le serveur distant à la volée (pas de fichiers temporaires sur le serveur local/distant)
  • vous avez un retour visuel de ce qui se passe (grâce à l'écho et au pv)
  • vous pouvez définir des variables mysql avant et après le processus de vidage

Ce qui doit être amélioré:

  • vous devez passer une liste de tables (ne peut pas vider toutes les tables)
  • Le mot de passe MySQL est le même pour la source et la cible
  • vous devez ACCORDER PRIVILÈGES manuellement (on dirait que MySQL ne le laisse pas à distance)
  • vous devez avoir installé sshpass
  • certaines énormes tables compressées innodb sont lentes à vider (peut-être la faute de mysqldump)

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

--------------------------------- couper ici --------------- -------------------

#!/bin/bash
#set -x

#REQUIRED VARS
SOURCE_USER=root   #MySQL user
SOURCE_Host=localhost
SOURCE_PASSWORD=yourmysqlpass  #optional
SOURCE_DBNAME=yourdbname
TARGET_Host=192.168.1.2
TARGET_DBNAME=yourdbname
TARGET_SSHUSER=root
TARGET_SSHPASSWORD=yoursshpass  #optional
TABLES='table1 table2 table3 table4'
TARGET_DIR="/data/dumpfiles"
EXEC_ACTION_TEXT[0]='Reimport TABLES directly into remote MySQL database'
EXEC_ACTION_TEXT[1]='Backup gzipped data to TARGED_DIR on remote TARGET_Host'
EXEC_ACTION=0

#print config
echo "---------------------------------"
echo " SOURCE_USER:    $SOURCE_USER (MySQL)"
if [ "SOURCE_PASSWORD" != "" ]; then
echo " SOURCE_PASSWORD:<present>        "; else
echo " SOURCE_PASSWORD:<to be asked>    "
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: <present>     "; else
echo " TARGET_SSHPASS: <to be asked>    "
fi
echo " TABLES:         $TABLES          "
echo " EXEC_ACTION:    $EXEC_ACTION - ${EXEC_ACTION_TEXT[$EXEC_ACTION]}"
echo " TARGET_DIR:     $TARGET_DIR (only for action 1)"
echo "---------------------------------"
echo "PRESS <ENTER> to continue...";  read;  echo

#read the mysql password from command-line (SOURCE and TARGET uses the same password)
if [ "$SOURCE_PASSWORD" == "" ]; then
     echo -n "Type $SOURCE_USER password for MySQL servers: "; read -s SOURCE_PASSWORD; echo
fi
echo "Creating database $TARGET_DBNAME on $TARGET_Host if not exists ... "
mysql \
--user=$SOURCE_USER \
--password=$SOURCE_PASSWORD \
--Host=$TARGET_Host \
--execute "create database if not exists $TARGET_DBNAME;"

echo '--------------------------------------------------------------------------------------'
echo "**** ATTENTION ****: execute this command on mysql server at  $TARGET_Host :"
echo "GRANT ALL PRIVILEGES ON $TARGET_DBNAME.* TO '$SOURCE_USER'@'%' IDENTIFIED BY 'yourpass';"
echo '--------------------------------------------------------------------------------------'
echo "PRESS <ENTER> to continue...";  read;  echo

#read the password from command-line
if [ "$TARGET_SSHPASSWORD" == "" ]; then
     echo -n "Type the password for remote SSH Server (TARGET) ['$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='remote reimporting has finished'
         ;;
         1)
         thisaction="cat > $TARGET_DIR/`date +%Y.%m.%d`-"$thistable".gz"
         endmessage="$thisaction has finished"
         ;;
         *)   echo "EXEC_ACTION=$EXEC_ACTION not supported" && exit 1
     esac

     echo "---------------------------------------------------------------------"
     echo "-- table $thistable"
     echo "---------------------------------------------------------------------"
     (
       echo -n "-- setting variables... " > /dev/stderr  #talk to user via stderr
       echo "SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;"
       echo -n "starting mysqldump... " > /dev/stderr
       mysqldump --opt --user=$SOURCE_USER --password=$SOURCE_PASSWORD --Host=$SOURCE_Host $SOURCE_DBNAME $thistable
       echo -n "done mysqldump, reseting variables... " > /dev/stderr
       echo "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;"
       echo -n "commiting... " > /dev/stderr
       echo "COMMIT;"
       echo "done!" > /dev/stderr
     ) | \
     gzip -c -2 | \
     pv | \
     sshpass -p $TARGET_SSHPASSWORD ssh $TARGET_SSHUSER'@'$TARGET_Host $thisaction
     echo $endmessage ' with exit status '$?
done
1
Fernando Fabreti

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 DataBaseName | gzip -c > DBOutputName.sql.gz

Le fichier de configuration peut ressembler à ceci:

[mysqldump]
Host = localhost
user = username
password = "password"
0
linstar