mysqldump to tar.gz


88

आमतौर पर MySQL डेटाबेस को mysqldumpकमांड के साथ डंप करने के बाद मैं तुरंत परिणामी फाइल को टार्गेट / gzip कर देता हूं। मैं एक कमांड में ऐसा करने का तरीका ढूंढ रहा हूं:

तो इस से:

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

कुछ इस तरह से:

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

या इससे भी बेहतर (क्योंकि मैं आमतौर पर डंप फ़ाइल को किसी अन्य सर्वर पर भेज रहा हूं):

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

मैं डेबियन पर बैश चला रहा हूं।

जवाबों:


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

आप इस तरह से एक पाइप में टार का उपयोग नहीं कर सकते हैं, और आपको इसकी आवश्यकता नहीं है, क्योंकि आप केवल एक फ़ाइल का उत्पादन कर रहे हैं। यदि आपके पास एकाधिक फ़ाइलें हैं, तो टार केवल उपयोगी है।


6
आपको टार की ज़रूरत नहीं है, लेकिन आप इसे पाइप लाइन में इस्तेमाल कर सकते हैं अगर आपने किया है,mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz'
डेरेन चैंबरलेन

क्या यह वास्तव में काम करता है? मुझे पूरा यकीन है कि टार को काम करने के लिए फ़ाइलनामों की एक सूची की आवश्यकता है।
जेम्स

2
मैंने इसे स्थानीय रूप से काम करने के लिए अद्यतन किया (दूरस्थ ssh सर्वर पर नहीं) ओह, और मैं मूल पोस्टर और उत्तर के लिए धन्यवाद, तारीख के आधार पर एक गतिशील नाम का उपयोग करता हूं! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
इलेक्ट्रब्लॉक

4
@ इलेब्लेक: यदि आप स्थानीय हैं तो आपको 'बिल्ली' का उपयोग करने की आवश्यकता नहीं है। बसgzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz
जेम्स

बस मज़े के लिए, आप netcatssh को पाइप करने के बजाय इस्तेमाल कर सकते हैं । यदि आप इसे किसी सुरक्षित नेटवर्क पर स्थानांतरित कर रहे हैं (या आप सुरक्षा की परवाह नहीं करते हैं), तो आप ssh के एन्क्रिप्शन ओवरहेड पर थोड़ी बचत करते हैं। आजकल आप xzइसके बजाय उपयोग करने पर विचार कर सकते हैं gzip
जेम्स

45

यदि आप इसे स्थानीय रूप से चला रहे हैं, तो बस अपने डेटाबेस का बैकअप लेने के लिए निम्न आदेश का उपयोग करें और इसे gzip का उपयोग करके ज़िप करें:

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

(संपादित करें: फिक्स्ड -सी कुंजी)


2
हां, यह सबसे सरल उपाय है। मैं भी इसका इस्तेमाल करता हूं।
रोमन स्नित्को

2
यह शायद होना चाहिए gzip -c, है ना?
pilsetnieks

अच्छा ... लेकिन मैं इस कमांड में स्ट्रीडर को कैसे रीडायरेक्ट करूं? अगर मैं 2> / देव / अशक्त हूं तो यह अब काम नहीं करता है। और 2> / dev / null इससे पहले कि पाइप काम नहीं करता है।
नेल्सन Teixeira

mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / डंप-त्रुटियों | gzip -v> output.gz
undefine

im mysqldump -u root -p databasename --routines की तरह उपयोग कर रहा है gzip -v> myfile.sql.gz ... मुझे एक भाग .gz फ़ाइल मिलती है जो डाउनलोड करने में सक्षम नहीं है
सुशीवम

18

एक नामित पाइप का उपयोग करें।

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

मैं इसे हर समय उपयोग करता हूं, यह बहुत बढ़िया है।

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


6
जेम्स 1 लाइन में एक ही काम करता है।
जॉन हदद

15
..लेकिन नामित पाइपों के बारे में सीखना इसके लायक है :-)
टॉमस ज़ीलिस्की

mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipeवहाँ, एक पंक्ति। बेशक मैं पाइप को इधर-उधर रखता और हर बार उसका इस्तेमाल करता।
d34dh0r53

15

मैंने एक दूरस्थ mysql डेटाबेस को चूसने के लिए एक त्वरित स्क्रिप्ट लिखी। यह mysql संपीड़न, gzip और ssh संपीड़न का उपयोग करता है। एक अविश्वसनीय दर पर एक मल्टी जीबी डेटाबेस नीचे चूस लिया।

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

एक साइड बेनिफिट यह है कि इसके लिए सोर्स डेटाबेस सर्वर पर कोई खाली जगह की आवश्यकता नहीं होती है, इसलिए आप अपने डेटा को प्रून करने से पहले शून्य फ्री डिस्क स्पेस वाले सर्वर पर डेटाबेस का बैकअप लेने के लिए इसका उपयोग कर सकते हैं।

आशा है कि यह किसी की मदद करता है।


मैंने एक साधारण शेल स्क्रिप्ट बनाई है: #! / Bin / bash अगर [-z "$ 1"]; फिर गूंज "उपयोग: $ {0} [मेजबान] [उपयोगकर्ता] [डेटाबेस] [उत्पादन]]" बाहर निकलें HOST = $ 1 फाई अगर [-z "$ 2"]; फिर गूंज "उपयोग: $ {0} $ {1} [उपयोगकर्ता] [डेटाबेस] [outputFile]" बाहर निकलें USER = $ 2 फाई अगर [-z "$ 3"]; तब गूंज "उपयोग: $ {0} $ {1} $ {2} [डेटाबेस] [outputFile]" बाहर निकलें DB = $ 3 फाई अगर [-z "$ 4"]; तब OUTFILE = "$ {DB} .sql.gz" और OUTFILE = $ 4 Fi COMMAND = "ssh -C $ {USER} @ $ {HOST} \" mysqldump --opt $ "DB DB" | gzip -9 -c \ "> $ {OUTFILE}" ssh -C $ {USER} @ $ {HOST} "mysqldump --opt $ {DB} | gzip -9 -c"> $ "OUTFILE"
टोनी डिलन

उन कंप्रेशन्स में से दो बेकार हैं: mysqldump का विकल्प सर्वर प्रक्रिया में डेटा को संपीड़ित करता है और तुरंत फिर से decompresses (यदि mysqldump DB सर्वर पर ही चलाया जाता है)। S-s का विकल्प gzip कम्प्रेशन को सक्रिय करता है जो आगे CPU-साइकिल को बर्बाद करेगा क्योंकि उस बिंदु पर पहले से ही डेटा gzipped है।
मटका।

5

उपयोग pvऔर निगरानी दर!

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

या, यदि आप आकार (3 जीबी) जानते हैं, तो एक सटीक अनुमान प्राप्त करें:

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

4

इसे इस्तेमाल करे:

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

कृपया यह न समझें कि मैं इन चीजों में किसी भी तरह से अच्छा नहीं हूं, मैंने सिर्फ वेब पर 2 विकल्पों को एक में जोड़ दिया।

यह किसी अन्य तरीके से बहुत अच्छा हो सकता है लेकिन यह एक लाइनर है जो मेरे लिए काम करता है।

हालाँकि इसे ssh.keysस्थापित करने और स्वीकार करने की आवश्यकता होती है यदि आप इसे स्क्रिप्ट crontabया एक जैसे में उपयोग करना चाहते हैं ।


1
ServerFault में आपका स्वागत है। यह मुझे पूरी तरह से उचित लगता है।
चूजों

2

आप ऐसा कर सकते हैं:

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

जैसे

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


1

मैं नीचे इस बैश स्क्रिप्ट पर काम कर रहा हूं जो उन सभी अच्छी सलाहों को एक साथ रखने की कोशिश करता है जो मैंने देखा है जब यह myqql के साथ डंप / रीस्टोर करने की बात आती है। यह सुदूर संचालन पर लक्षित है।

बस varf reconfig और यह एक कोशिश दे। :)

विशेषताएं हैं:

  • आप डंप करने के लिए तालिकाओं की एक सूची पारित कर सकते हैं (चयनात्मक डंप)
  • आपको पासवर्ड (MySQL / SSH) के लिए संकेत दिया जा सकता है या उन्हें चर में सेट किया जा सकता है
  • नेटवर्क ट्रांसमिशन gzipped है
  • आप रिमोट सर्वर पर gzipped डंप को बचाने का विकल्प चुन सकते हैं
  • आप दूरस्थ-ऑन-द-फ्लाई (स्थानीय / दूरस्थ सर्वर पर कोई अस्थायी फ़ाइलों को डंप कर सकते हैं)
  • आपके पास क्या हो रहा है की दृश्य प्रतिक्रिया है (प्रतिध्वनि और धन्यवाद के लिए)
  • आप डंप प्रक्रिया से पहले और बाद में mysql वैरिएबल सेट कर सकते हैं

क्या सुधार की जरूरत है:

  • आपको तालिकाओं की एक सूची पारित करने की आवश्यकता है (सभी तालिकाएँ डंप नहीं कर सकते)
  • MySQL पासवर्ड स्रोत और लक्ष्य के लिए समान हैं
  • आपको मैन्युअल रूप से PRIVILEGES की आवश्यकता है (ऐसा लगता है कि MySQL इसे दूरस्थ रूप से न करें)
  • आपको sshpass इंस्टॉल करना होगा
  • कुछ निर्दोष विशाल संकुचित तालिकाओं को डंप करने के लिए धीमा है (mysqldump की गलती हो सकती है)

मैं इस स्क्रिप्ट को यहाँ साझा कर रहा हूँ उम्मीद है कि इसे समुदाय द्वारा बेहतर बनाया जा सकता है। (नैनो या अन्य संपादक के साथ सबसे अच्छा देखा गया जो कोड को रंग देता है)

--------------------------------- यहाँ काटें --------------- -------------------

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

आप अपने पासवर्ड को एक कॉन्फ़िगर फ़ाइल में संग्रहीत कर सकते हैं और इस विकल्प का उपयोग कर सकते हैं - अतिरिक्त-अतिरिक्त-फ़ाइल:

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

कॉन्फ़िगरेशन फ़ाइल इस तरह दिख सकती है:

[mysqldump]
host = localhost
user = username
password = "password"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.