Pregunta mysqldump a un tar.gz


Por lo general, después de volcar una base de datos MySQL con mysqldump comando inmediatamente tar / gzip el archivo resultante. Estoy buscando una manera de hacer esto en un comando:

Así que de esto:

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

A algo como esto:

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

O incluso mejor (ya que normalmente estoy guardando el archivo de volcado en otro servidor):

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

Estoy corriendo bash en debian.


80
2018-01-26 23:15


origen




Respuestas:


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

No puedes usar tar en una tubería como esta, y no lo necesitas de todos modos, ya que solo estás generando un único archivo. tar solo es util si tienes multiples archivos.


97
2018-01-26 23:24



Tienes razón al no necesitar alquitrán, pero podrías usarlo en la tubería si lo hicieras, con mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
¿Eso realmente funciona? Estoy bastante seguro de que tar necesita una lista de nombres de archivos para trabajar. - James
Actualicé esto para trabajar localmente (no en un servidor ssh remoto) oh, y uso un nombre dinámico basado en la fecha, ¡gracias al contestador y al póster original! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake: no es necesario que uses 'cat' si es local. Sólo gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
Sólo por diversión, podrías usar netcat en lugar de canalizar a ssh. Usted ahorrará un poco en la sobrecarga de cifrado de ssh, si se transfiere a través de una red segura (o no le importa la seguridad). Hoy en día también podrías considerar usar xz en lugar de gzip. - James


Si está ejecutando esto localmente, use el siguiente comando para hacer una copia de seguridad de su base de datos y comprimirlo usando gzip:

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

(Editar: tecla fija -c)


37
2018-02-29 10:28



Sí, esta es la solución más simple. Yo también lo uso. - Roman Snitko
¡Simple y fácil de usar! ¡Gracias! - SPRBRN
Probablemente debería ser gzip -c, ¿derecho? - pilsetnieks
bonito ... pero ¿cómo redirecciono stderr en este comando? Si agrego 2> / dev / null ya no funciona. Y 2> / dev / null antes de la tubería tampoco funciona. - Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz - undefine


Utilice una tubería con nombre.

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

Lo uso todo el tiempo, es increíble.

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


18
2018-02-03 17:27



James hace lo mismo en 1 línea. - Jon Haddad
..pero aprender sobre tuberías con nombre vale la pena :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe allí, una línea. Por supuesto que mantendría el tubo alrededor y lo usaría cada vez. - d34dh0r53


Escribí una secuencia de comandos rápida para absorber una base de datos mysql remota. Utiliza compresión mysql, gzip y compresión ssh. Chupó una base de datos multi GB a una velocidad increíble.

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

Un beneficio adicional es que no requiere espacio libre en el servidor de base de datos de origen, por lo que puede usarlo para hacer una copia de seguridad de una base de datos en un servidor sin espacio en disco libre antes de podar sus datos.

Espero que ayude a alguien.


15
2018-06-18 15:52



He creado un script de shell simple: #! / Bin / bash if [-z "$ 1"]; luego echo "Uso: $ {0} [host] [usuario] [base de datos] [outputFile]" exit else HOST = $ 1 fi si [-z "$ 2"]; luego haga eco en "Uso: $ {0} $ {1} [usuario] [base de datos] [archivo de salida]" exit else USUARIO = $ 2 fi si [-z "$ 3"]; luego haga eco en "Uso: $ {0} $ {1} $ {2} [base de datos] [archivo de salida]" exit else DB = $ 3 fi si [-z "$ 4"]; luego OUTFILE = "$ {DB} .sql.gz" else OUTFILE = $ 4 fi COMMAND = "ssh -C $ {USER} @ $ {HOST} \" mysqldump --opt $ {DB} | gzip -9 -c \ "> $ {OUTFILE}" ssh -C $ {USER} @ $ {HOST} "mysqldump --opt $ {DB} | gzip -9 -c"> $ {OUTFILE} - Tony Dillon
Dos de esas compresiones son inútiles: la opción mysqldump comprime los datos en el proceso del servidor y los descomprime de inmediato (si mysqldump se ejecuta en el propio servidor DB). La opción -C de ssh activa la compresión gzip, lo que desperdiciará más ciclos de CPU porque los datos ya están comprimidos en ese momento. - MattW.


Utilizar pv y monitorear la tasa!

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

O, si conoce el tamaño (3 GB), obtenga una estimación precisa:

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

5
2017-08-20 23:08





Prueba esto:

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

Por favor, no es que no sea bueno para nada en estas cosas, simplemente combiné 2 opciones en la web en una.

Es muy posible que sea mejor de alguna otra manera, pero esta es una frase que funciona para mí.

Sin embargo, sí requiere ssh.keys para ser instalado y aceptado si desea usarlo en scripts o crontab o similar.


3
2018-04-15 21:08



Bienvenido a ServerFault. Me parece perfectamente razonable. - chicks


Puedes hacer como:

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

p.ej.

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


2
2018-03-10 08:45





He estado trabajando en esto guión de bash a continuación, que trata de reunir todos los buenos consejos que he visto cuando se trata de volcar / restaurar con mysql. Está dirigido a operaciones remotas.

Solo reconfigure vars y pruébelo. :)

Las características son:

  • puede pasar una lista de tablas para volcar (volcado selectivo)
  • se le pueden solicitar contraseñas (MySQL / SSH) o configurarlas en variables
  • la transmisión de la red está comprimida
  • Puedes optar por guardar el volcado gzipped al servidor remoto
  • puede reimportar el volcado al servidor remoto sobre la marcha (no hay archivos temporales en el servidor local / remoto)
  • Tienes retroalimentación visual de lo que está sucediendo (gracias a echo y pv)
  • Puede establecer variables mysql antes y después del proceso de volcado

Lo que necesita mejorar: 

  • debe pasar una lista de tablas (no puede volcar todas las tablas)
  • La contraseña de MySQL es la misma para origen y destino
  • necesita GRANT PRIVILEGES manualmente (parece que MySQL no permite hacerlo de forma remota)
  • necesitas tener instalado sshpass
  • algunas tablas comprimidas de innodb son lentas para volcarse (puede ser culpa de mysqldump)

Comparto este guión aquí con la esperanza de que la comunidad pueda mejorarlo. (Se ve mejor con nano u otro editor que colorea el código)

--------------------------------- corta aquí --------------- -------------------

#!/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
2018-04-03 01:33