mysqldump bir tar.gz için


88

Genellikle bir MySQL veri tabanını mysqldumpkomut ile doldurduktan sonra hemen ortaya çıkan dosyayı tar / gzip olarak alırım. Bunu tek komutla yapmanın bir yolunu arıyorum:

Yani bundan:

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

Bunun gibi bir şeye:

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

Veya daha da iyisi (genellikle döküm dosyasını başka bir sunucuya kopyaladığım için):

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

Debian'da bash kullanıyorum.

Yanıtlar:


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

Tar gibi bir boru içinde kullanamazsınız ve yine de tek bir dosyayı çıktıracağınız için ihtiyacınız yoktur. tar, sadece birden fazla dosyanız varsa kullanışlıdır.


6
Katran istememe konusunda haklısın, ama eğer istersen boru hattında kullanabilirsin,mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
Darren Chamberlain,

Bu gerçekten işe yarıyor mu? Tar'in üzerinde çalışacak bir dosya listesi olması gerektiğine eminim.
James

2
Bunu yerel olarak çalışacak şekilde güncelledik (uzaktaki bir ssh sunucusunda değil) oh, ve orijinal poster ve cevaplayıcı sayesinde tarihe göre dinamik bir ad kullanıyorum! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
electblake

4
@ electblake: Eğer yerel ise 'cat' kullanmanıza gerek yoktur. Sadecegzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
James

Sadece eğlence için, netcatssh'a pipo yapmak yerine kullanabilirsiniz . Güvenli bir ağ üzerinden aktarılıyorsa ssh'nin şifrelemesinden biraz tasarruf edersiniz (ya da güvenliği umursamıyorsunuz). Günümüzde xzbunun yerine kullanmayı da düşünebilirsiniz gzip.
James

45

Bunu yerel olarak çalıştırıyorsanız, veritabanınızı yedeklemek ve gzip kullanarak sıkıştırmak için aşağıdaki komutu kullanmanız yeterlidir:

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

(Düzen: sabit -c tuşu)


2
Evet, bu en basit çözümdür. Ben de kullanırım.
Roman Snitko

2
Muhtemelen olmalı gzip -c, değil mi?
pilsetnieks,

nice ... ama stderr'i bu komutta nasıl yönlendirebilirim? 2> / dev / null eklerseniz, artık çalışmaz. Ve 2> / dev / null borusu da işe yaramadı ya.
Nelson Teixeira

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

mysqldump -u root -p gibi veritabanı kullanarak im veritabanidir - rutinleri | gzip -v> myfile.sql.gz ... indiremeyen bir parçası .gz dosyası
alıyorum

18

Adlandırılmış bir boru kullanın.

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

Her zaman kullanırım, harika.

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


6
James de aynı şeyi 1 satırda yapıyor.
Jon Haddad

15
..Ama isimli boruları öğrenmeye değer :-) buna değer
Tomasz Zieliński

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipeorada, bir satır. Tabii ki boruyu her zaman etrafımda tutar ve kullanırdım.
d34dh0r53

15

Uzak bir mysql veritabanını emmek için hızlı bir komut dosyası yazdım. MySQL sıkıştırma, gzip ve ssh sıkıştırma kullanır. Çok hızlı bir veritabanını inanılmaz bir hızla düşürdü.

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

Bunun bir yararı, kaynak veritabanı sunucusunda boş alan gerektirmemesidir; bu nedenle, verilerinizi budamaya başlamadan önce bir veritabanındaki sıfır boş disk alanına sahip bir veritabanını yedeklemek için kullanabilirsiniz.

Umarım birine yardım eder.


Basit bir kabuk betiği yarattım: #! / Bin / bash if [-z "$ 1"]; sonra yankılandı "Kullanım: $ {0} [ana bilgisayar] [kullanıcı] [veritabanı] [outputFile]" çıkın HOST = $ 1 fi ise [-z "$ 2"]; sonra yankı "Kullanım: $ {0} $ {1} [kullanıcı] [veritabanı] [outputFile]" ifadesinden çıkın USER = [$ 2 "eğer $ 2 fi; sonra yankı "Kullanım: $ {0} $ {1} $ {2} [veritabanı] [outputFile]" dır, aksi takdirde [= z "$ 4"] DB = $ fi fi; sonra 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

Bu sıkıştırmaların ikisi işe yaramaz: mysqldump seçeneği sunucu işlemindeki verileri sıkıştırır ve derhal tekrar açar (mysqldump DB sunucusunda çalışıyorsa). Ssh seçeneği -C seçeneği, daha önce CPU çevrimlerini boşa harcayan gzip sıkıştırmasını etkinleştirir, çünkü veriler zaten bu noktada gziplenir.
MattW.

5

Kullanımı pvve oranı izleyin!

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

Veya boyutu (3 GB) biliyorsanız, doğru bir tahmin alın:

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

4

Bunu dene:

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

Lütfen, bu konularda hiçbir şekilde iyi olmadığımı, web'deki 2 seçeneği bir araya getirdim.

Başka bir şekilde çok daha iyi olabilir, ancak bu benim için çalışan bir astar.

Bununla birlikte ssh.keys, komut dosyalarında crontabveya benzer şekilde kullanmak istiyorsanız kurulmasını ve kabul edilmesini gerektirir .


1
ServerFault'a hoş geldiniz. Bana çok mantıklı geliyor.
civciv

2

Gibi yapabilirsiniz:

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

Örneğin

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


1

Aşağıdaki bash betiği üzerinde çalışıyorum, mysql ile boşaltmak / geri yüklemek konusunda gördüğüm tüm iyi önerileri bir araya getirmeye çalışıyor. Uzak işlemlerde hedeflenir.

Vars'ı yeniden yapılandırın ve deneyin. :)

Özellikler:

  • dökümü yapılacak tablo listesini (seçici dökümü) geçirebilirsiniz
  • parola girmeniz istenebilir (MySQL / SSH) veya bunları değişkenlere
  • ağ iletimi gzipli
  • gzipli dökümü uzak sunucuya kaydetmeyi seçebilirsiniz
  • dökümü anında uzaktaki sunucuya yeniden gönderebilirsiniz (yerel / uzaktaki sunucuda geçici dosyalar yoktur)
  • ne olduğuna dair görsel geri bildiriminiz var (echo ve pv sayesinde)
  • Döküm işleminden önce ve sonra mysql değişkenlerini ayarlayabilirsiniz.

Geliştirilmesi gerekenler:

  • bir tablo listesini iletmeniz gerekir (tüm tabloları dökemezsiniz)
  • MySQL şifresi kaynak ve hedef için aynıdır
  • Manuel olarak GRANT PRIVILEGES'e ihtiyacınız var (MySQL'in uzaktan yapmasına izin vermiyor gibi)
  • sshpass kurmuş olmanız gerekir
  • bazı innodb büyük sıkıştırılmış tabloları dökümü yavaş (mysqldump'ın hatası olabilir)

Topluluk tarafından geliştirilebileceğini umarak bu senaryoyu burada paylaşıyorum. (en iyi nano veya kodu renklendiren başka bir editör ile görüntülenebilir)

--------------------------------- Burayı kes --------------- -------------------

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

Ayrıca şifrenizi bir config dosyasında saklayabilir ve bu seçeneği kullanabilirsiniz --defaults-extra-file:

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

Config dosyası şöyle görünebilir:

[mysqldump]
host = localhost
user = username
password = "password"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.