mysqldump para um tar.gz

82

Geralmente depois de descarregar um banco de dados MySQL com o comando mysqldump , imediatamente ordeno / gzip o arquivo resultante. Eu estou procurando uma maneira de fazer isso em um comando:

Então, a partir disso:

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

Para algo assim:

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

Ou melhor ainda (já que normalmente eu estou scp'ing o arquivo de despejo para outro servidor):

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

Estou executando o bash no debian.

    
por pygorex1 27.01.2010 / 00:15

8 respostas

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

Você não pode usar o tar em um pipe como este, e você não precisa dele de qualquer maneira, já que você está apenas produzindo um único arquivo. O tar é útil apenas se você tiver vários arquivos.

    
por 27.01.2010 / 00:24
40

Se você estiver executando isso localmente, apenas use o seguinte comando para fazer backup de seu banco de dados & zip usando gzip:

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

(Editar: tecla -c fixa)

    
por 29.02.2012 / 11:28
18

Use um pipe nomeado.

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

Eu uso isso o tempo todo, é incrível.

link

    
por 03.02.2010 / 18:27
15

Eu escrevi um script rápido para sugar um banco de dados mysql remoto. Ele usa compressão mysql, compactação gzip e ssh. Chupou um banco de dados multi GB a uma taxa incrível.

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

Um benefício colateral é que ele não requer espaço livre no servidor de banco de dados de origem, portanto, você pode usá-lo para fazer backup de um banco de dados em um servidor com zero de espaço livre antes de remover seus dados.

Espero que ajude alguém.

    
por 18.06.2011 / 17:52
5

Use pv e taxa de monitoramento!

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

Ou, se você souber o tamanho (3 GB), obtenha uma estimativa precisa:

mysqldump prod_db -h dbslave | pv -s 3g | gzip -c > prod_2012_08_20.dump.tgz
    
por 21.08.2012 / 01:08
3

Tente isto:

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

Por favor, não que eu seja de modo algum bom nessas coisas, eu apenas combinei duas opções na Web em uma.

Pode muito bem ser melhor de alguma outra forma, mas esta é uma frase que funciona para mim.

No entanto, é necessário que ssh.keys seja instalado e aceito se você quiser usá-lo em scripts ou crontab ou similar.

    
por 15.04.2017 / 23:08
2

Você pode fazer como:

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

por exemplo,

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

    
por 10.03.2011 / 09:45
1

Eu tenho trabalhado neste script bash abaixo que tenta reunir todos os bons conselhos que eu vi quando se trata de despejar / restaurar com o mysql. Destina-se a operações remotas.

Apenas reconfig vars e experimente. :)

As funcionalidades são:

  • você pode passar uma lista de tabelas para despejar (despejo seletivo)
  • você pode ser solicitado a fornecer senhas (MySQL / SSH) ou defini-las em variáveis
  • transmissão de rede é compactada
  • você pode optar por salvar o despejo com gzip no servidor remoto
  • você pode reimportar o despejo para o servidor remoto on-the-fly (sem arquivos temporários no servidor local / remoto)
  • você tem um feedback visual do que está acontecendo (graças ao echo e ao pv)
  • você pode definir variáveis mysql antes e depois do processo de despejo

O que precisa ser melhorado:

  • você precisa passar uma lista de tabelas (não é possível dump todas as tabelas)
  • A senha do MySQL é a mesma para origem e destino
  • você precisa GRANT PRIVILEGES (parece que o MySQL não permite fazer isso remotamente)
  • você precisa ter instalado o sshpass
  • algumas tabelas compactadas enormes do innodb demoram a ser despejadas (pode ser culpa do mysqldump)

Eu compartilho este script aqui esperando que ele possa ser melhorado pela comunidade. (melhor visualizado com o nano ou outro editor que colore o código)

--------------------------------- corte aqui ------------ ----------------------

#!/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
    
por 03.04.2013 / 03:33