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.

117voto

James Points 7442
mysqldump --opt  | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

Vous ne pouvez pas utiliser tar dans une pipe comme celle-ci, et de toute façon ce n'est pas nécessaire, car vous ne sortez qu'un seul fichier. tar n'est utile que si vous avez plusieurs fichiers.

7 votes

Tu as raison de ne pas avoir besoin de goudron, mais tu pourrais l'utiliser dans le pipeline si tu le souhaitais, avec mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'

0 votes

Est-ce que cela fonctionne réellement? Je suis assez sûr que tar a besoin d'une liste de noms de fichiers sur lesquels travailler.

3 votes

J'ai mis à jour ceci pour fonctionner localement (pas sur un serveur ssh distant) oh, et j'utilise un nom dynamique basé sur la date, merci au créateur original et à la personne qui a répondu ! mysqldump --opt | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz

56voto

Dax Points 611

Si vous exécutez ceci localement, utilisez simplement la commande suivante pour sauvegarder votre base de données et la compresser avec gzip :

mysqldump -u userName -p (passwordPrompt) nomDeVotreBaseDeDonnées | gzip -c > output.gz 

(Edit : clé -c corrigée)

2 votes

Oui, c'est la solution la plus simple. Je l'utilise aussi.

2 votes

Il devrait probablement être gzip -c, non ?

0 votes

Nice... mais comment rediriger stderr dans cette commande ? Si j'ajoute 2> /dev/null, cela ne fonctionne plus. Et 2> /dev/null avant le pipe ne fonctionne pas non plus.

18voto

Jon Haddad Points 1332

Utilisez un tube 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

6 votes

James fait la même chose en 1 ligne.

16 votes

.. mais apprendre les tubes nommés en vaut la peine :-)

1 votes

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe une ligne. Bien sûr, je garderais le pipe et l'utiliserais à chaque fois.

18voto

Tony Dillon Points 181

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

ssh -C utilisateur@hôte "mysqldump --opt --compress base de données  | gzip -9 -c" > outputfile.sql.gz
Un avantage supplémentaire 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 sans espace disque libre avant d'aller tailler vos données. J'espère que cela aidera quelqu'un.

0 votes

J'ai créé un script shell simple: #!/bin/bash if [ -z "$1" ]; then echo "Utilisation: ${0} [hôte] [utilisateur] [base de données] [fichier de sortie]" exit else HÔTE=$1 fi if [ -z "$2" ]; then echo "Utilisation: ${0} ${1} [utilisateur] [base de données] [fichier de sortie]" exit else UTILISATEUR=$2 fi if [ -z "$3" ]; then echo "Utilisation: ${0} ${1} ${2} [base de données] [fichier de sortie]" exit else DB=$3 fi if [ -z "$4" ]; then FICHIER_SORTIE="${DB}.sql.gz" else FICHIER_SORTIE=$4 fi COMMANDE="ssh -C ${UTILISATEUR}@${HÔTE} \"mysqldump --opt ${DB} | gzip -9 -c\" > ${FICHIER_SORTIE}" ssh -C ${UTILISATEUR}@${HÔTE} "mysqldump --opt ${DB} | gzip -9 -c" > ${FICHIER_SORTIE}

0 votes

Deux de ces compressions sont inutiles: L'option de mysqldump compresse les données dans le processus serveur et les décompresse immédiatement de nouveau (si le mysqldump est exécuté sur le serveur DB lui-même). L'option -C de ssh active la compression gzip qui gaspillera encore plus de cycles CPU car les données sont déjà gzippées à ce moment-là.

5voto

seengee Points 9367

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

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