Frage mysqldump zu einem tar.gz


In der Regel nach dem Dumping einer MySQL-Datenbank mit mysqldump Befehl tar tar / gzip die resultierende Datei. Ich suche nach einer Möglichkeit, dies in einem Befehl zu tun:

Also von diesem:

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

Zu so etwas:

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

Oder noch besser (da ich die Dump-Datei normalerweise auf einen anderen Server hänge):

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

Ich laufe Bash auf Debian.


80
2018-01-26 23:15


Ursprung




Antworten:


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

Sie können tar nicht in einer solchen Pipe verwenden, und Sie brauchen sie sowieso nicht, da Sie nur eine einzige Datei ausgeben. tar ist nur nützlich, wenn Sie mehrere Dateien haben.


97
2018-01-26 23:24



Du hast recht, wenn du keinen Teer brauchst, aber du könntest ihn in der Pipeline verwenden, wenn du es tust mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
Funktioniert das tatsächlich? Ich bin mir ziemlich sicher, dass tar eine Liste von Dateinamen benötigt, um daran zu arbeiten. - James
Ich habe dies aktualisiert, um lokal zu arbeiten (nicht auf einem Remote-SSH-Server) oh, und ich benutze einen dynamischen Namen basierend auf dem Datum, dank der ursprünglichen Poster & Beantworter! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake: Sie müssen nicht "Katze" verwenden, wenn es lokal ist. Gerade gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
Nur zum Spaß, könnten Sie verwenden netcat anstatt nach ssh zu leiten. Sie sollten etwas über den Verschlüsselungsaufwand von ssh sparen, wenn er über ein sicheres Netzwerk übertragen wird (oder Sie kümmern sich nicht um die Sicherheit). Heutzutage könnte man es auch in Betracht ziehen xz anstatt gzip. - James


Wenn Sie dies lokal ausführen, verwenden Sie einfach den folgenden Befehl, um Ihre Datenbank zu sichern und sie mit gzip zu komprimieren:

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

(Bearbeiten: feste -c Taste)


37
2018-02-29 10:28



Ja, das ist die einfachste Lösung. Ich benutze es auch. - Roman Snitko
Einfach und einfach zu bedienen! Vielen Dank! - SPRBRN
Es sollte wahrscheinlich sein gzip -c, Recht? - pilsetnieks
schön ... aber wie leite ich stderr in diesem Befehl um? Wenn ich 2> / dev / null angehängt habe, funktioniert es nicht mehr. Und 2> / dev / null before pipe funktioniert auch nicht. - Nelson Teixeira
mysqldump -u benutzername -p (passwortPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> ausgabe.gz - undefine


Verwenden Sie eine Named Pipe.

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

Ich benutze es die ganze Zeit, es ist großartig.

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


18
2018-02-03 17:27



James macht das gleiche in einer Zeile. - Jon Haddad
..aber das Lernen über Named Pipes lohnt sich :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe da, eine Linie. Natürlich würde ich das Rohr behalten und es jedes Mal benutzen. - d34dh0r53


Ich schrieb ein schnelles Skript, um eine entfernte MySQL-Datenbank zu durchsuchen. Es verwendet mysql-Komprimierung, gzip und ssh-Komprimierung. In unglaublicher Geschwindigkeit eine Multi-GB-Datenbank durchsucht.

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

Ein weiterer Vorteil besteht darin, dass kein freier Speicherplatz auf dem Quellendatenbankserver erforderlich ist. Sie können damit eine Datenbank auf einem Server mit freiem Speicherplatz vor dem Bereinigen Ihrer Daten sichern.

Hoffe es hilft jemandem.


15
2018-06-18 15:52



Ich habe ein einfaches Shell-Skript erstellt: #! / Bin / bash if [-z "$ 1"]; dann echo "Verwendung: $ {0} [Host] [Benutzer] [Datenbank] [Ausgabedatei]" exit else HOST = $ 1 fi if [-z "$ 2"]; dann echo "Verwendung: $ {0} $ {1} [Benutzer] [Datenbank] [Ausgabedatei]" exit else USER = $ 2 fi if [-z "$ 3"]; dann echo "Verwendung: $ {0} $ {1} $ {2} [Datenbank] [Ausgabedatei]" exit else DB = $ 3 fi if [-z "$ 4"]; dann OUTFILE = "$ {DB} .sql.gz" sonst 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
Zwei dieser Komprimierungen sind nutzlos: Die Option zu mysqldump komprimiert die Daten im Serverprozess und dekomprimiert sofort wieder (wenn mysqldump auf dem DB-Server selbst ausgeführt wird). Die -C-Option für ssh aktiviert die gzip-Komprimierung, die weitere CPU-Zyklen verschwendet, da die Daten bereits an diesem Punkt gezippt werden. - MattW.


Benutzen pv und überwachen Rate!

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

Oder, wenn Sie die Größe (3GB) kennen, erhalten Sie eine genaue Schätzung:

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

5
2017-08-20 23:08





Versuche dies:

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

Bitte nicht, dass ich in diesen Dingen in keiner Weise gut bin, ich habe nur 2 Optionen im Web zu einer kombiniert.

Es kann sehr gut auf eine andere Weise besser sein, aber das ist ein One-Liner, der für mich funktioniert.

Es erfordert jedoch ssh.keys installiert werden und akzeptiert werden, wenn Sie es in Skripten oder verwenden möchten crontab oder gleich.


3
2018-04-15 21:08



Willkommen bei ServerFault. Es sieht für mich vollkommen vernünftig aus. - chicks


Sie können Folgendes tun:

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

z.B.

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


2
2018-03-10 08:45





Ich habe daran gearbeitet Bash-Skript Darunter versucht, alle guten Ratschläge, die ich gesehen habe, wenn es um Dump / Restore mit mysql geht, zusammenzustellen. Es ist auf Remote-Operationen ausgerichtet.

Einfach vars neu konfigurieren und ausprobieren. :)

Eigenschaften sind:

  • Sie können eine Liste von zu übertragenden Tabellen übergeben (selective dump)
  • Sie können nach Passwörtern (MySQL / SSH) gefragt werden oder sie in Variablen setzen
  • Netzwerkübertragung wird gezippt
  • Sie können entscheiden, Gziped Dump auf Remote-Server zu speichern
  • Sie können den Dump direkt auf den Remote-Server importieren (keine temporären Dateien auf dem lokalen / Remote-Server)
  • Sie haben ein visuelles Feedback von dem, was passiert (dank Echo und PV)
  • Sie können mysql-Variablen vor und nach dem Speicherauszug setzen

Was muss verbessert werden: 

  • Sie müssen eine Liste von Tabellen übergeben (kann alle Tabellen nicht ablegen)
  • MySQL-Passwort ist für Quelle und Ziel gleich
  • Sie müssen PRIVILEGES manuell erteilen (sieht so aus, als würde MySQL es remotely nicht machen)
  • Sie müssen sshpass installiert haben
  • einige innodb riesige komprimierte Tabellen sind langsam zu dumpen (kann mysqldumps Fehler sein)

Ich teile dieses Skript hier in der Hoffnung, dass es von der Community verbessert werden kann. (am besten mit Nano oder anderen Editor, der den Code färbt)

--------------------------------- schneiden Sie hier --------------- -------------------

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