सवाल mysqldump को tar.gz पर


आमतौर पर एक MySQL डेटाबेस डंप करने के बाद mysqldump कमांड मैं तुरंत परिणाम फ़ाइल को tar / 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

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


80
2018-01-26 23:15


मूल




जवाब:


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

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


97
2018-01-26 23:24



आपको टैर की आवश्यकता नहीं है, लेकिन आप इसे पाइपलाइन में इस्तेमाल कर सकते हैं यदि आपने किया था mysqldump | tar cf - | gzip -c | ssh ... 'cat > file.tgz' - Darren Chamberlain
क्या वह वास्तव में काम करता है? मुझे यकीन है कि टैर पर काम करने के लिए फ़ाइल नामों की एक सूची की आवश्यकता है। - James
मैंने इसे स्थानीय रूप से काम करने के लिए अपडेट किया है (रिमोट एसएसएच सर्वर पर नहीं) ओह, और मैं तारीख के आधार पर गतिशील नाम का उपयोग करता हूं, मूल पोस्टर और उत्तर देने के लिए धन्यवाद! mysqldump --opt <database> | gzip -c | cat > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - electblake
@electblake: यदि यह स्थानीय है तो आपको 'बिल्ली' का उपयोग करने की आवश्यकता नहीं है। केवल gzip -c > $(date +%Y-%m-%d-%H.%M.%S).sql.gz - James
बस मज़ा के लिए, आप उपयोग कर सकते हैं netcat एसएसएच को पाइप करने के बजाए। यदि आप सुरक्षित नेटवर्क पर स्थानांतरित हो रहे हैं (या आपको सुरक्षा की परवाह नहीं है) तो आप एसएसएच के एन्क्रिप्शन ओवरहेड पर थोड़ी सी बचत करते हैं। आजकल आप भी उपयोग करने पर विचार कर सकते हैं xz के बजाय gzip। - James


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

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

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


37
2018-02-29 10:28



हां, यह सबसे आसान समाधान है। मैं भी इसका इस्तेमाल करता हूं। - Roman Snitko
उपयोग में सरल और आसान! धन्यवाद! - SPRBRN
यह शायद होना चाहिए gzip -c, सही? - pilsetnieks
अच्छा ... लेकिन मैं इस आदेश में stderr को कैसे रीडायरेक्ट कर सकता हूं? अगर मैं 2> / dev / null जोड़ता हूं तो यह अब काम नहीं करता है। और पाइप से पहले 2> / dev / null या तो काम नहीं करता है। - Nelson Teixeira
mysqldump -u userName -p (passwordPrompt) yourDatabaseName 2> / var / log / dump-error | gzip -v> output.gz - undefine


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

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


18
2018-02-03 17:27



जेम्स एक ही चीज़ 1 लाइन में करता है। - Jon Haddad
.. लेकिन नामित पाइप के बारे में सीखना इसके लायक है :-) - Tomasz Zieliński
mkfifo mysql_pipe; gzip -9 -c < mysql_pipe > name_of_dump.gz &; mysqldump database > mysql_pipe; rm mysql_pipe वहां, एक रेखा। बेशक मैं पाइप को चारों ओर रखूंगा और हर बार इसका इस्तेमाल करूंगा। - d34dh0r53


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

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

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

उम्मीद है कि यह किसी की मदद करता है।


15
2018-06-18 15:52



मैंने एक साधारण खोल स्क्रिप्ट बनाई है: #! / Bin / bash अगर [-z "$ 1"]; फिर "उपयोग करें: $ {0} [होस्ट] [उपयोगकर्ता] [डेटाबेस] [outputFile]" अन्यथा बाहर निकलें HOST = $ 1 fi अगर [-z "$ 2"]; फिर "उपयोग करें: $ {0} $ {1} [उपयोगकर्ता] [डेटाबेस] [outputFile]" अन्यथा बाहर निकलें USER = $ 2 fi अगर [-z "$ 3"]; फिर "उपयोग करें: $ {0} $ {1} $ {2} [डेटाबेस] [outputFile]" अन्यथा बाहर निकलें डीबी = $ 3 fi अगर [-z "$ 4"]; फिर आउटफाइल = "$ {डीबी} .sql.gz" अन्यथा आउटफाइल = $ 4 एफ 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
उन संपीड़न में से दो बेकार हैं: mysqldump का विकल्प सर्वर प्रक्रिया में डेटा को संपीड़ित करता है और तुरंत फिर से डिकंप्रेस करता है (यदि mysqldump डीबी सर्वर पर ही चलाया जाता है)। Ssh के लिए -C विकल्प gzip संपीड़न को सक्रिय करता है जो आगे CPU-चक्र को बर्बाद कर देगा क्योंकि डेटा उस बिंदु पर पहले से ही gzipped है। - MattW.


उपयोग 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

5
2017-08-20 23:08





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

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

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

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

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


3
2018-04-15 21:08



सर्वरफॉल्ट में आपका स्वागत है। यह मेरे लिए बिल्कुल उचित दिखता है। - chicks


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

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


2
2018-03-10 08:45





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

बस युद्धों को फिर से व्यवस्थित करें और इसे आज़माएं। :)

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

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

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

  • आपको तालिकाओं की एक सूची पारित करने की आवश्यकता है (सभी तालिकाओं को डंप नहीं कर सकते)
  • MySQL पासवर्ड स्रोत और लक्ष्य के लिए समान हैं
  • आपको मैन्युअल रूप से प्राइवेटेज की आवश्यकता है (ऐसा लगता है कि MySQL इसे दूरस्थ रूप से करने की अनुमति नहीं देता है)
  • आपको sshpass स्थापित करने की आवश्यकता है
  • कुछ innodb भारी संकुचित टेबल डंप करने के लिए धीमी हैं (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

1
2018-04-03 01:33