Soru tar.gz için mysqldump


Genellikle MySQL veritabanını döktükten sonra mysqldump Komut Ben sonuçta dosya / hemen dosya tarı / gzip. Bunu tek bir komutta 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

Böyle bir şeye:

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

Ya da daha da iyisi (genellikle dökümü başka bir sunucuya çizdiğim için):

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

Debian’da bash koşuyorum.


80
2018-01-26 23:15


Menşei




Cevaplar:


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

Böyle bir boruda katranı kullanamazsınız, ve sadece tek bir dosya çıkardığınız için buna ihtiyacınız yoktur. katran sadece birden fazla dosya varsa yararlıdır.


98
2018-01-26 23:24



Katrana ihtiyaç duymamanız konusunda haklısınız, ama eğer varsa, bunu boru hattında kullanabilirsiniz. mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
Bu gerçekten çalışıyor mu? Eminim katranın üzerinde çalışılması gereken dosya isimleri listesi gerekiyor. - James
Yerel olarak çalışmak için bunu güncelledim (uzak 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
@electblake: eğer yerelse 'kedi' kullanmanız gerekmiyor. Sadece gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
Sadece eğlenmek için kullanabilirsin netcat ssh için boru yerine. Güvenli bir ağ üzerinden aktarılıyorsa (veya güvenliği umursamıyorsanız), ssh'in şifreleme yüküne biraz tasarruf edin. Bugünlerde kullanmayı da düşünebilirsiniz xz yerine gzip. - James


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

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

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


37
2018-02-29 10:28



Evet, bu en basit çözümdür. Ben de kullanıyorum. - Roman Snitko
Basit ve kullanımı kolay! Teşekkürler! - SPRBRN
Muhtemelen olmalı gzip -c, sağ? - pilsetnieks
güzel ... ama bu komutta stderr'i nasıl yönlendiririm? 2> / dev / null eklerseniz artık işe yaramıyor. Ve borudan önce 2> / dev / null da çalışmıyor. - Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) SizinDatabaseName 2> / var / log / dump-errors | gzip -v> çıktı.gz - undefine


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 olur.

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


18
2018-02-03 17:27



James aynı şeyi 1 satırda yapar. - Jon Haddad
..but adlandırılmış boruları öğrenmeye değer :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe Orada bir çizgi. Tabii ki boruyu etrafta tutar ve her seferinde kullanırdım. - d34dh0r53


Uzak bir mysql veritabanını emmek için hızlı bir senaryo yazdım. Bu mysql sıkıştırma, gzip ve ssh sıkıştırma kullanır. Bir çoklu GB veritabanını inanılmaz bir oranda emdi.

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

Bir yan yararı bir veri budama içinde gitmeden önce sıfır boş disk alanı olan bir sunucuda yedekleme için bir veritabanı kullanabilirsiniz yüzden, kaynak veritabanı sunucusu üzerinde hiçbir boş alan gerektirir olmasıdır.

Umarım birilerine yardım eder.


15
2018-06-18 15:52



Basit bir kabuk betiği oluşturdum: #! / Bin / bash [-z "$ 1"]; sonra echo "Kullanım: $ {0} [host] [kullanıcı] [veritabanı] [outputFile]" exit else HOST = $ 1 fi eğer [-z "$ 2"]; sonra echo "Kullanım: $ {0} $ {1} [kullanıcı] [veritabanı] [outputFile]" çıkış çıkışı USER = $ 2 fi eğer [-z "$ 3"]; sonra echo "Kullanım: $ {0} $ {1} $ {2} [veritabanı] [outputFile]" çıkış başka DB = $ 3 fi eğer [-z "$ 4"]; 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ırmalardan ikisi işe yaramaz: mysqldump seçeneği sunucu işlemindeki verileri sıkıştırır ve hemen yeniden açılır (eğer mysqldump DB sunucusunun kendisinde çalıştırılırsa). Ssh için -C seçeneği, daha fazla CPU döngüsünü boşa harcayacak olan gzip sıkıştırmasını etkinleştirir, çünkü veriler zaten bu noktada gziplidir. - MattW.


kullanım pv ve 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 yapın:

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

5
2017-08-20 23:08





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ı değil, sadece web üzerindeki 2 seçeneği bir araya getirdim.

Başka bir şekilde çok daha iyi olabilir ama bu benim için çalışan bir tek liner.

Ancak gerektirir ssh.keys komut dosyalarında kullanmak istiyorsanız veya crontab ya da benzer.


3
2018-04-15 21:08



ServerFault'a hoş geldiniz. Bana mantıklı görünüyor. - chicks


Şunları 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


2
2018-03-10 08:45





Bunun üzerinde çalışıyorum bash betiği Bu mysql ile dökümü / geri yükleme geldiğinde gördüğüm tüm iyi tavsiyeleri bir araya getirmek için çalışır. Uzaktan operasyonlarda hedeflenmektedir.

Sadece reconfig vars ve bir deneyin. :)

Özellikleri:

  • dökmek için bir tablo listesi (seçici dökümü) geçirebilirsiniz
  • şifreler istenebilir (MySQL / SSH) veya değişkenlere
  • ağ iletimi gzipli
  • Uzak sunucuya gzipli dökümü kaydetmeyi tercih edebilirsiniz
  • çöpü uzaktaki sunucuya anında geri gönderebilirsiniz (yerel / uzak sunucuda geçici dosya yok)
  • Olanlar hakkında görsel geri bildiriminiz var (echo ve pv'ye teşekkürler)
  • mysql değişkenlerini döküm işleminden önce ve sonra ayarlayabilirsiniz

İyileştirme ihtiyacı: 

  • tabloların bir listesini geçmeniz gerekir (tüm tabloları alamazsınız)
  • 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 görünüyor)
  • sshpass yüklemiş olmanız gerekir
  • bazı innodb büyük sıkıştırılmış tablolar dökümü yavaş (mysqldump'ın hatası olabilir)

Bu senaryoyu, topluluk tarafından geliştirilebileceğini umarak paylaşıyorum. (en iyi nano veya kodu renklendiren diğer editör ile görüntülenir)

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

1
2018-04-03 01:33