Pertanyaan mysqldump ke tar.gz


Biasanya setelah membuang database MySQL dengan mysqldump perintah saya langsung tar / gzip file yang dihasilkan. Saya mencari cara untuk melakukan ini dalam satu perintah:

Jadi dari ini:

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

Untuk sesuatu seperti ini:

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

Atau bahkan lebih baik (karena saya biasanya scp'ing file dump ke server lain):

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

Saya menjalankan bash pada debian.


80
2018-01-26 23:15






Jawaban:


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

Anda tidak dapat menggunakan tar dalam pipa seperti ini, dan Anda tidak memerlukannya, karena Anda hanya mengeluarkan satu file. tar hanya berguna jika Anda memiliki banyak file.


97
2018-01-26 23:24



Anda benar tidak membutuhkan tar, tetapi Anda dapat menggunakannya di dalam pipa jika Anda melakukannya, dengan mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
Apakah itu benar-benar berfungsi? Saya cukup yakin tar membutuhkan daftar nama file untuk dikerjakan. - James
Saya memperbarui ini untuk bekerja secara lokal (bukan pada server ssh jauh) oh, dan saya menggunakan nama dinamis berdasarkan tanggal, berkat poster & penjawab asli! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake: Anda tidak perlu menggunakan 'kucing' jika itu lokal. Hanya gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
Hanya untuk bersenang-senang, Anda bisa menggunakannya netcat bukannya perpipaan ke ssh. Anda akan menghemat sedikit biaya overhead enkripsi dari ssh, jika itu ditransfer melalui jaringan aman (atau Anda tidak peduli dengan keamanan). Saat ini Anda mungkin juga mempertimbangkan untuk menggunakannya xz dari pada gzip. - James


Jika Anda menjalankan ini secara lokal, gunakan saja perintah berikut untuk mem-backup database Anda & meng-zip-nya menggunakan gzip:

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

(Edit: kunci -c tetap)


37
2018-02-29 10:28



Ya, ini adalah solusi paling sederhana. Saya menggunakannya juga. - Roman Snitko
Sederhana dan mudah digunakan! Terima kasih! - SPRBRN
Mungkin seharusnya gzip -cbenar? - pilsetnieks
bagus ... tapi bagaimana cara mengalihkan stderr dalam perintah ini? Jika saya menambahkan 2> / dev / null itu tidak berfungsi lagi. Dan 2> / dev / null sebelum pipa tidak berfungsi. - Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz - undefine


Gunakan pipa bernama.

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

Saya menggunakannya sepanjang waktu, itu luar biasa.

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


18
2018-02-03 17:27



James melakukan hal yang sama dalam 1 baris. - Jon Haddad
..tapi belajar tentang pipa bernama sangat berharga :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe di sana, satu baris. Tentu saja saya akan menyimpan pipa dan menggunakannya setiap saat. - d34dh0r53


Saya menulis skrip cepat untuk menyedot basis data mysql yang jauh. Ini menggunakan kompresi mysql, kompresi gzip dan ssh. Menghisap database multi GB dengan kecepatan luar biasa.

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

Manfaat sampingan adalah bahwa ia tidak memerlukan ruang kosong pada server basis data sumber, sehingga Anda dapat menggunakannya untuk membuat cadangan basis data di server dengan nol ruang kosong sebelum memangkas data Anda.

Semoga itu membantu seseorang.


15
2018-06-18 15:52



Saya telah membuat skrip shell sederhana: #! / Bin / bash if [-z "$ 1"]; kemudian gema "Penggunaan: $ {0} [host] [pengguna] [database] [outputFile]" keluar lagi HOST = $ 1 fi jika [-z "$ 2"]; kemudian gema "Penggunaan: $ {0} $ {1} [pengguna] [database] [outputFile]" keluar lagi USER = $ 2 fi jika [-z "$ 3"]; kemudian gema "Penggunaan: $ {0} $ {1} $ {2} [database] [outputFile]" keluar lagi DB = $ 3 fi jika [-z "$ 4"]; lalu 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
Dua dari kompresi tersebut tidak berguna: Opsi untuk mysqldump memadatkan data dalam proses server dan segera melakukan dekompresi lagi (jika mysqldump dijalankan pada server DB itu sendiri). Opsi -C untuk ssh mengaktifkan kompresi gzip yang akan membuang lebih banyak CPU-cycle karena data sudah di-gzip pada titik tersebut. - MattW.


Menggunakan pv dan pantau rate!

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

Atau, jika Anda tahu ukurannya (3GB), dapatkan perkiraan akurat:

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

5
2017-08-20 23:08





Coba ini:

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

Tolong jangan saya tidak baik dalam hal ini, saya hanya menggabungkan 2 opsi di web menjadi satu.

Ini mungkin lebih baik dengan beberapa cara lain tetapi ini adalah satu-garis yang bekerja untuk saya.

Namun perlu ssh.keys untuk diinstal dan diterima jika Anda ingin menggunakannya dalam skrip atau crontab atau sejenisnya.


3
2018-04-15 21:08



Selamat datang di ServerFault. Ini terlihat masuk akal bagi saya. - chicks


Anda dapat melakukan seperti:

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

misalnya

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


2
2018-03-10 08:45





Saya telah mengerjakan ini skrip bash di bawah ini yang mencoba untuk mengumpulkan semua saran yang baik yang pernah saya lihat ketika datang untuk membuang / memulihkan dengan mysql. Ini ditargetkan pada operasi jarak jauh.

Hanya mengkonfigurasi ulang var dan mencobanya. :)

Fitur adalah:

  • Anda dapat melewati daftar tabel untuk dibuang (dump selektif)
  • Anda dapat diminta untuk memasukkan kata sandi (MySQL / SSH) atau mengaturnya dalam variabel
  • transmisi jaringan adalah gzip
  • Anda dapat memilih untuk menyimpan dump gzip ke server jauh
  • Anda dapat melakukan reimport dump ke server jarak jauh on-the-fly (tidak ada file temp di server lokal / jauh)
  • Anda memiliki umpan balik visual tentang apa yang terjadi (terima kasih kepada gema dan pv)
  • Anda dapat mengatur variabel mysql sebelum dan sesudah proses pembuangan

Apa yang perlu ditingkatkan: 

  • Anda harus melewati daftar tabel (cant dump all tables)
  • Kata sandi MySQL sama untuk sumber dan target
  • Anda perlu GRANT PRIVILEGES secara manual (terlihat seperti MySQL jangan biarkan melakukannya dari jarak jauh)
  • Anda harus menginstal sshpass
  • beberapa tabel kompresi besar di dalam rumah lambat untuk dibuang (mungkin kesalahan mysqldump)

Saya membagikan skrip ini di sini berharap itu dapat ditingkatkan oleh komunitas. (terbaik dilihat dengan nano atau editor lain yang mewarnai kode)

--------------------------------- potong disini --------------- -------------------

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