it-swarm.com.de

mysqldump zu einem tar.gz

Normalerweise tariere ich die resultierende Datei sofort, nachdem ich eine MySQL-Datenbank mit dem Befehl mysqldump gesichert habe. Ich suche nach einer Möglichkeit, dies in einem Befehl zu tun:

Also daraus:

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 normalerweise die Dump-Datei auf einen anderen Server scp'ing):

mysqldump dbname -u root -p > send dbname.sql.tgz to [email protected]

Ich starte Bash auf Debian.

92
pygorex1
mysqldump --opt <database> | gzip -c | ssh [email protected] 'cat > /tmp/yourfile.sql.gz'

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

106
James

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: fester -c Schlüssel)

46
Dax

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
Jon Haddad

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

    ssh -C [email protected] "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz

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

Hoffe es hilft jemandem.

17
Tony Dillon

Verwenden Sie pv und überwachen Sie die Rate!

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
5
New Alexandria

Versuche dies:

mysqldump --all-databases --password=dbpassword | gzip -c | ssh [email protected] "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 mag es sehr gut besser sein, aber dies ist ein Einzeiler, der für mich funktioniert.

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

4

Sie können wie folgt 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
Min He

Ich habe an diesem Bash-Skript unten gearbeitet, das versucht, alle guten Ratschläge zusammenzustellen, die ich beim Dump/Restore mit MySQL gesehen habe. Es ist auf Remote-Operationen ausgerichtet.

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

Funktionen sind :

  • sie können eine Liste von Tabellen an Dump übergeben (selektiver Dump)
  • sie können aufgefordert werden, Kennwörter einzugeben (MySQL/SSH) oder diese in Variablen festzulegen
  • die Netzwerkübertragung wird komprimiert
  • sie können den komprimierten Speicherauszug auf dem Remote-Server speichern
  • sie können den Speicherauszug im laufenden Betrieb erneut auf den Remote-Server importieren (keine temporären Dateien auf dem lokalen/Remote-Server).
  • sie haben visuelles Feedback darüber, was passiert (dank Echo und PV).
  • sie können MySQL-Variablen vor und nach dem Dump-Prozess festlegen

Was verbessert werden muss :

  • sie müssen eine Liste von Tabellen übergeben (kann nicht alle Tabellen sichern)
  • Das MySQL-Passwort ist für Quelle und Ziel gleich
  • sie müssen PRIVILEGES manuell GEWÄHREN (es sieht so aus, als würde MySQL dies nicht remote tun lassen).
  • sie müssen sshpass installiert haben
  • einige innodb riesige komprimierte Tabellen sind langsam zu entleeren (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 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

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"
0
linstar