mysqldump zu einem tar.gz

88

Normalerweise habe mysqldumpich nach dem Dump einer MySQL-Datenbank mit dem Befehl sofort die resultierende Datei tar / gzip. Ich suche nach einer Möglichkeit, dies mit einem Befehl zu tun:

Also daraus:

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

Auf so etwas:

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

Oder noch besser (da ich normalerweise die Dump-Datei auf einen anderen Server scp'le):

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

Ich lasse Bash auf Debian laufen.

pygorex1
quelle

Antworten:

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

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

James
quelle
6
Sie haben Recht damit, dass Sie keinen Teer benötigen, aber Sie könnten ihn in der Pipeline verwenden, wenn Sie dies tun, mitmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
Darren Chamberlain
Funktioniert das eigentlich? Ich bin mir ziemlich sicher, dass tar eine Liste von Dateinamen benötigt, an denen gearbeitet werden kann.
James
2
Ich habe dies aktualisiert, um lokal zu arbeiten (nicht auf einem entfernten SSH-Server), oh, und ich verwende einen dynamischen Namen basierend auf dem Datum, dank Original-Poster und -Antworter! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
Electblake
4
@electblake: Sie müssen nicht 'cat' verwenden, wenn es lokal ist. Justgzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
James
Nur zum Spaß können Sie netcatanstelle von Piping zu ssh verwenden. Sie sparen ein wenig am Verschlüsselungsaufwand von ssh, wenn es über ein sicheres Netzwerk übertragen wird (oder Sie sich nicht um die Sicherheit kümmern). Heutzutage könnten Sie auch in Betracht ziehen, xzanstelle von gzip.
James
45

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

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

(Bearbeiten: Feste -c-Taste)

Dax
quelle
2
Ja, das ist die einfachste Lösung. Ich benutze es auch.
Roman Snitko
2
Es sollte wohl sein gzip -c, oder?
pilsetnieks
nett ... aber wie leite ich stderr in diesem Befehl um? Wenn ich 2> / dev / null anhänge, funktioniert es nicht mehr. Und 2> / dev / null vor der Pipe funktioniert auch nicht.
Nelson Teixeira
mysqldump -u Benutzername -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz
undefine
Ich benutze wie mysqldump -u root -p Datenbankname --routinen | gzip -v> myfile.sql.gz ... ich bekomme eine part .gz Datei, die ich nicht herunterladen kann
Sushivam
18

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

Jon Haddad
quelle
6
James macht dasselbe in einer Zeile.
Jon Haddad
15
..aber das Erlernen von 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_pipedort eine Zeile. Natürlich würde ich die Pfeife bei mir behalten und sie jedes Mal benutzen.
d34dh0r53
15

Ich habe ein schnelles Skript geschrieben, um eine entfernte MySQL-Datenbank abzusaugen. Es verwendet MySQL-Komprimierung, GZIP und SSH-Komprimierung. Eine Multi-GB-Datenbank mit einer unglaublichen Geschwindigkeit abgesaugt.

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

Ein Nebeneffekt ist, dass kein freier Speicherplatz auf dem Quelldatenbankserver erforderlich ist. Sie können ihn daher zum Sichern einer Datenbank auf einem Server mit null freiem Speicherplatz verwenden, bevor Sie Ihre Daten bereinigen.

Hoffe es hilft jemandem.

Tony Dillon
quelle
Ich habe ein einfaches Shell-Skript erstellt: #! / Bin / bash if [-z "$ 1"]; Geben Sie dann "Usage: $ {0} [host] [user] [database] [outputFile]" als Echo ein. exit else HOST = $ 1 fi if [-z "$ 2"]; Geben Sie dann "Usage: $ {0} $ {1} [user] [database] [outputFile]" als Echo ein. exit else USER = $ 2 fi if [-z "$ 3"]; Geben Sie dann "Usage: $ {0} $ {1} $ {2} [database] [outputFile]" als Echo ein. 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 mysqldump komprimiert die Daten im Serverprozess und dekomprimiert sie sofort erneut (wenn mysqldump auf dem DB-Server selbst ausgeführt wird). Die Option -C für ssh aktiviert die gzip-Komprimierung, wodurch weitere CPU-Zyklen verschwendet werden, da die Daten zu diesem Zeitpunkt bereits gzippt sind.
MattW.
5

Nutzen pvund Rate überwachen!

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

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

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

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.

Auf andere Weise ist es vielleicht besser, aber dies ist ein Einzeiler, der für mich funktioniert.

Es muss jedoch ssh.keysinstalliert und akzeptiert werden, wenn Sie es in Skripten crontaboder ähnlichem verwenden möchten .

Charlie Candergart
quelle
1
Willkommen bei ServerFault. Es sieht für mich vollkommen vernünftig aus.
Küken
2

Sie können tun, wie:

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

Min He
quelle
1

Ich habe an diesem Bash-Skript gearbeitet , das versucht, alle guten Ratschläge zusammenzustellen, die ich gesehen habe, wenn es um das Dump / Restore mit MySQL geht. Es richtet sich an Remote-Operationen.

Konfigurieren Sie vars einfach neu und probieren Sie es aus. :)

Eigenschaften sind:

  • Sie können eine Liste von Tabellen zum Sichern übergeben (selektives Sichern)
  • Sie können zur Eingabe von Passwörtern (MySQL / SSH) aufgefordert oder in Variablen festgelegt werden
  • Netzwerkübertragung ist gzippt
  • Sie können sich dafür entscheiden, einen gzip-Speicherauszug auf einem Remote-Server zu speichern
  • Sie können Dump on-the-fly wieder auf den Remote-Server importieren (keine temporären Dateien auf dem lokalen / Remote-Server)
  • Du hast eine visuelle Rückmeldung darüber, was gerade passiert (dank Echo und pv)
  • Sie können MySQL-Variablen vor und nach dem Speicherauszug festlegen

Was muss verbessert werden:

  • Sie müssen eine Liste von Tabellen übergeben (kann nicht alle Tabellen sichern)
  • Das MySQL-Passwort ist für Quelle und Ziel identisch
  • Sie müssen Privilegien manuell gewähren (sieht aus wie MySQL lassen Sie es nicht aus der Ferne tun)
  • Sie müssen sshpass installiert haben
  • Einige Innodb riesige komprimierte Tabellen sind langsam zu sichern (kann mysqldumps Schuld sein)

Ich teile dieses Skript hier in der Hoffnung, dass es von der Community verbessert werden kann. (am besten mit Nano oder einem anderen Editor, der den Code einfä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
Fernando Fabreti
quelle
0

Sie können Ihr Passwort auch in einer Konfigurationsdatei speichern und diese Option verwenden --defaults-extra-file:

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

Die Konfigurationsdatei kann folgendermaßen aussehen:

[mysqldump]
host = localhost
user = username
password = "password"
Linstar
quelle