mysqldump ke tar.gz

88

Biasanya setelah membuang database MySQL dengan mysqldumpperintah saya segera 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 di debian.

pygorex1
sumber

Jawaban:

102
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 menghasilkan satu file. tar hanya berguna jika Anda memiliki banyak file.

James
sumber
6
Anda benar tentang tidak membutuhkan tar, tetapi Anda bisa menggunakannya dalam pipa jika Anda melakukannya, denganmysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
Darren Chamberlain
Apakah itu berhasil? Saya cukup yakin tar perlu daftar nama file untuk dikerjakan.
James
2
Saya memperbarui ini untuk bekerja secara lokal (bukan pada server ssh jarak jauh) oh, dan saya menggunakan nama dinamis berdasarkan tanggal, terima kasih kepada poster & penjawab asli! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
electblake
4
@electblake: Anda tidak perlu menggunakan 'cat' jika itu lokal. Barugzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
James
Hanya untuk bersenang-senang, Anda bisa menggunakan netcatbukannya perpipaan ke ssh. Anda akan menghemat sedikit pada overhead enkripsi ssh, jika sedang ditransfer melalui jaringan aman (atau Anda tidak peduli dengan keamanan). Saat ini Anda mungkin juga mempertimbangkan untuk menggunakan xzbukan gzip.
James
45

Jika Anda menjalankan ini secara lokal, gunakan saja perintah berikut untuk mencadangkan basis data Anda & zip menggunakan gzip:

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

(Edit: kunci -c diperbaiki)

Dax
sumber
2
Ya, ini solusi paling sederhana. Saya juga menggunakannya.
Roman Snitko
2
Mungkin seharusnya begitu gzip -c, bukan?
pilsetnieks
bagus ... tapi bagaimana cara mengarahkan stderr dalam perintah ini? Jika saya menambahkan 2> / dev / null itu tidak berfungsi lagi. Dan 2> / dev / null sebelum pipa juga tidak berfungsi.
Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-errors | gzip -v> output.gz
undefine
Saya menggunakan seperti mysqldump -u root -p databasename --routines | gzip -v> myfile.sql.gz ... saya mendapatkan sebagian file .gz yang tidak dapat saya unduh
Sushivam
18

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, ini luar biasa.

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

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

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

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

Manfaat sampingannya adalah tidak memerlukan ruang kosong di server basis data sumber, jadi Anda dapat menggunakannya untuk membuat cadangan basis data di server dengan nol ruang kosong sebelum melakukan pemangkasan data Anda.

Semoga ini bisa membantu seseorang.

Tony Dillon
sumber
Saya telah membuat skrip shell sederhana: #! / Bin / bash if [-z "$ 1"]; lalu echo "Usage: $ {0} [host] [user] [database] [outputFile]" keluar lagi HOST = $ 1 fi jika [-z "$ 2"]; kemudian echo "Penggunaan: $ {0} $ {1} [pengguna] [database] [outputFile]" keluar lagi USER = $ 2 fi jika [-z "$ 3"]; lalu echo "Penggunaan: $ {0} $ {1} $ {2} [database] [outputFile]" keluar dari yang lain DB = $ 3 fi jika [-z "$ 4"]; lalu OUTFILE = "$ {DB} .sql.gz" else OUTFILE = $ 4 fi PERINTAH = "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: Pilihan untuk mysqldump memampatkan data dalam proses server dan segera melakukan dekompresi kembali (jika mysqldump dijalankan pada server DB itu sendiri). Opsi -C untuk ssh mengaktifkan kompresi gzip yang akan membuang siklus CPU lebih lanjut karena data sudah di-gzip pada saat itu.
MattW.
5

Gunakan pvdan monitor rate!

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

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

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

Coba ini:

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

Tolong bukan karena saya tidak pandai hal-hal ini, saya hanya menggabungkan 2 opsi di web menjadi satu.

Mungkin lebih baik dalam beberapa hal lain tetapi ini adalah satu-liner yang bekerja untuk saya.

Namun itu perlu ssh.keysdiinstal dan diterima jika Anda ingin menggunakannya dalam skrip atau crontabatau sama.

Charlie Candergart
sumber
1
Selamat datang di ServerFault. Ini terlihat masuk akal bagi saya.
anak ayam
2

Anda dapat melakukannya 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

Min He
sumber
1

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

Konfigurasikan ulang vars dan cobalah. :)

Fitur-fiturnya adalah:

  • Anda dapat melewati daftar tabel untuk dibuang (selective dump)
  • Anda bisa dimintai kata sandi (MySQL / SSH) atau atur dalam variabel
  • transmisi jaringan di-gzip
  • Anda dapat memilih untuk menyimpan dump yang di-gzip ke server jarak jauh
  • Anda dapat mengimpor kembali dump ke server jauh on-the-fly (tidak ada file temp pada 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 dump

Apa yang perlu diperbaiki:

  • Anda harus melewati daftar tabel (tidak dapat membuang semua tabel)
  • Kata sandi MySQL sama untuk sumber dan target
  • Anda perlu MENYEDIAKAN PRIVILEGES secara manual (sepertinya MySQL jangan biarkan melakukannya dari jarak jauh)
  • Anda harus menginstal sshpass
  • beberapa innodb tabel terkompresi besar lambat untuk dibuang (mungkin kesalahan mysqldump)

Saya membagikan skrip ini di sini dengan harapan dapat ditingkatkan oleh komunitas. (paling baik 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
Fernando Fabreti
sumber
0

Anda juga dapat menyimpan kata sandi Anda dalam file konfigurasi dan menggunakan opsi ini --defaults-extra-file:

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

File config dapat terlihat seperti ini:

[mysqldump]
host = localhost
user = username
password = "password"
linstar
sumber