mysqldump in un tar.gz


88

Di solito dopo aver scaricato un database MySQL con il mysqldumpcomando ho immediatamente tar / gzip il file risultante. Sto cercando un modo per farlo in un solo comando:

Quindi da questo:

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

A qualcosa del genere:

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

O ancora meglio (dato che di solito sto scansionando il file di dump su un altro server):

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

Sto correndo su Debian.

Risposte:


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

Non puoi usare tar in una pipe come questa e non ti serve comunque, dato che stai solo producendo un singolo file. tar è utile solo se hai più file.


6
Hai ragione a non aver bisogno del catrame, ma potresti usarlo in cantiere se lo facessi, conmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
Darren Chamberlain,

Funziona davvero? Sono abbastanza sicuro che tar abbia bisogno di un elenco di nomi di file su cui lavorare.
James,

2
Ho aggiornato questo per funzionare localmente (non su un server SSH remoto) oh, e utilizzo un nome dinamico basato sulla data, grazie al poster e al risponditore originali! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
electblake,

4
@electblake: non è necessario utilizzare 'cat' se è locale. Sologzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
James

Solo per divertimento, potresti usare netcatinvece di piping su ssh. Risparmierai un po 'sul sovraccarico di crittografia di ssh, se viene trasferito su una rete sicura (o non ti interessa la sicurezza). Al giorno d'oggi potresti anche considerare di utilizzare xzinvece di gzip.
James,

45

Se lo stai eseguendo localmente, usa il seguente comando per eseguire il backup del database e comprimerlo usando gzip:

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

(Modifica: tasto -c fisso)


2
Sì, questa è la soluzione più semplice. Lo uso anch'io.
Roman Snitko,

2
Probabilmente dovrebbe essere gzip -c, giusto?
pilsetnieks,

bello ... ma come reindirizzare stderr in questo comando? Se aggiungo 2> / dev / null non funziona più. E neanche 2> / dev / null prima che pipe non funzioni.
Nelson Teixeira,

mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz
undefine

sto usando come mysqldump -u root -p nome database --routines | gzip -v> myfile.sql.gz ... ottengo un file .gz di parte che non riesco a scaricare
Sushivam,

18

Usa una pipa denominata.

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

Lo uso sempre, è fantastico.

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


6
James fa la stessa cosa in 1 riga.
Jon Haddad,

15
..ma ne vale la pena conoscere le pipe nominate :-)
Tomasz Zieliński,

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipelì, una riga. Ovviamente avrei tenuto il tubo intorno e lo avrei usato ogni volta.
d34dh0r53

15

Ho scritto uno script veloce per risucchiare un database mysql remoto. Utilizza la compressione mysql, la compressione gzip e ssh. Succhiato un database multi GB a un ritmo incredibile.

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

Un vantaggio secondario è che non richiede spazio libero sul server del database di origine, quindi è possibile utilizzarlo per eseguire il backup di un database su un server con zero spazio libero su disco prima di andare in una potatura dei dati.

Spero che aiuti qualcuno.


Ho creato un semplice script di shell: #! / Bin / bash if [-z "$ 1"]; quindi echo "Utilizzo: $ {0} [host] [utente] [database] [outputFile]" exit else HOST = $ 1 fi se [-z "$ 2"]; quindi echo "Utilizzo: $ {0} $ {1} [utente] [database] [outputFile]" exit else USER = $ 2 fi se [-z "$ 3"]; quindi echo "Utilizzo: $ {0} $ {1} $ {2} [database] [outputFile]" exit else DB = $ 3 fi se [-z "$ 4"]; allora 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

Due di queste compressioni sono inutili: l'opzione di mysqldump comprime i dati nel processo del server e li decomprime immediatamente (se mysqldump viene eseguito sul server DB stesso). L'opzione -C di ssh attiva la compressione gzip che sprecherà ulteriori cicli della CPU perché i dati sono già compressi in quel punto.
MattW.

5

Usa pve controlla la frequenza!

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

Oppure, se conosci le dimensioni (3 GB), ottieni una stima accurata:

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

4

Prova questo:

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

Per favore, non sono affatto bravo in queste cose, ho solo combinato 2 opzioni sul web in una sola.

Potrebbe anche essere meglio in qualche altro modo, ma questa è una linea che funziona per me.

Tuttavia, ssh.keysdeve essere installato e accettato se si desidera utilizzarlo in script crontabo simili.


1
Benvenuti in ServerFault. Mi sembra perfettamente ragionevole.
pulcini

2

Puoi fare come:

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

per esempio

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


1

Ho lavorato su questo script bash di seguito che cerca di mettere insieme tutti i buoni consigli che ho visto quando si tratta di scaricare / ripristinare con mysql. È destinato alle operazioni remote.

Basta riconfigurare var e provarlo. :)

Le caratteristiche sono:

  • puoi passare un elenco di tabelle da scaricare (dump selettivo)
  • è possibile che vengano richieste password (MySQL / SSH) o impostarle in variabili
  • la trasmissione di rete è gzip
  • puoi scegliere di salvare il dump gzipped sul server remoto
  • puoi reimportare il dump sul server remoto al volo (nessun file temporaneo sul server locale / remoto)
  • hai un feedback visivo di ciò che sta accadendo (grazie a echo e pv)
  • è possibile impostare le variabili mysql prima e dopo il processo di dump

Cosa necessita di miglioramenti:

  • è necessario passare un elenco di tabelle (non è possibile scaricare tutte le tabelle)
  • La password di MySQL è la stessa per sorgente e destinazione
  • devi concedere i privilegi manualmente (sembra che MySQL non lo lasci fare remotamente)
  • devi aver installato sshpass
  • alcune enormi tabelle compresse innodb sono lente da scaricare (potrebbe essere colpa di mysqldump)

Condivido questo script qui sperando che possa essere migliorato dalla community. (meglio visualizzato con nano o altri editor che colorano il codice)

--------------------------------- tagliare qui --------------- -------------------

#!/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

0

Puoi anche memorizzare la tua password in un file di configurazione e usare questa opzione --defaults-extra-file:

mysqldump --defaults-extra-file=mysqldump.cnf DataBaseName | gzip -c > DBOutputName.sql.gz

Il file di configurazione può essere simile al seguente:

[mysqldump]
host = localhost
user = username
password = "password"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.