MySQL डेटाबेस आयात करते समय एक प्रगति संकेतक प्राप्त करें


21

मैं अक्सर MySQL डेटाबेस आयात करता हूं, और इसमें कुछ समय लग सकता है। कोई प्रगति संकेतक नहीं है। क्या किसी को दिखाया जा सकता है? या तो आयात किए गए रिकॉर्ड, एमबी आयात, या आयात किए गए टेबल ... कुछ भी बस इंतजार करने से बेहतर है। किसी को कोई विचार?

मैं इस कमांड का उपयोग करता हूं:

mysql -uuser -p -hhost database < largefile.sql

फाइलें 40-300 एमबी के बीच हैं, और होस्ट स्थानीय नेटवर्क के भीतर है।



@sr_ मुझे लगता pvहै कि प्रश्नकर्ता वास्तव में क्या खोजता है। मैं बस rpmforge के माध्यम से CentOS पर स्थापित किया। यदि आकार- पैरामीटर दिया जाता है, तो यह एक ईटीए भी दिखाएगा।
निल्स

pvचाल वास्तव में किया! अगर कोई इसे उत्तर दे सकता है, तो मैं इसे स्वीकार कर सकता हूं!
मोनिका

जवाबों:


31

वहाँ अच्छा उपकरण कहा जाता है pv

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

तब जैसे आप इसे इस तरह से उपयोग कर सकते हैं

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

कृपया मेरे नवीनतम संस्करण के लिए UPDATE 2 की जाँच करें

ps: इस ब्लॉग की जाँच करें http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

अद्यतन: ऐसा लगता है कि उपरोक्त लिंक टूट गया है, लेकिन मुझे यहाँ एक ही लेख मिला है http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

अद्यतन 2: पूर्ण प्रगति पट्टी के साथ भी बेहतर समाधान। ऐसा करने के लिए आपको 2 बिल्ड pvऑप्शन का उपयोग करने की आवश्यकता है । एक --progressप्रगति पट्टी को इंगित करना है और दूसरा यह --sizeबताना है pvकि समग्र फ़ाइल कितनी बड़ी है।

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

.. समस्या .gzमूल फ़ाइल आकार के साथ है। आपको किसी भी तरह से बिना किसी स्वनिर्धारित मूल फ़ाइल आकार की जानकारी प्राप्त करने की आवश्यकता है, अन्यथा आप इस फाइल को दो बार अनपैक करने के लिए कीमती समय खो देंगे (पहली बार pvऔर दूसरी बार zcat)। लेकिन सौभाग्य से आपके पास gzip -lविकल्प है कि हमारी gziped फ़ाइल के बारे में असंपीड़ित जानकारी है। दुर्भाग्य से आपके पास यह तालिका प्रारूप में है, इसलिए आपको इसका उपयोग करने से पहले इसे निकालने की आवश्यकता है। सभी को एक साथ नीचे देखा जा सकता है:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

उफ़्फ़ .. तो आखिरी चीज़ जो आपको करने की ज़रूरत है वह बस एक साथ सभी को मिलाएं।

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

इसे और भी अच्छा बनाने के लिए आप इस तरह से प्रोग्रेस NAME जोड़ सकते हैं

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

अंतिम परिणाम:

Importing.. : [===========================================>] 100%

अद्यतन 3: त्वरित उपयोग के लिए कस्टम फ़ंक्शन बनाएं।

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

उपयोग:

mysql_import dbname /path/to/our/database.sql.gz

यदि आप नहीं जानते कि इसे कहां रखा जाए, तो इस उत्तर को पढ़ें: /unix//a/106606-1756

आप उपनामों के बीच फ़ंक्शंस जोड़ सकते हैं। इसलिए आप उदा ~/.bash_aliasesफ़ाइल का उपयोग कर सकते हैं ।


यह कमाल का है।
डेव

1
एक बेहतर परिणाम के साथ एक लाइनर यह हो सकता है:pv --progress --name 'DB Import in progress' -tea /path/to/our/database.sql.gz | zcat | mysql -h db_host -u db_user -pdb_password db_name
डेनिस पित्ज़ालिस

16

इतना जटिल क्यों?

यह ठीक काम करता है:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database

बहुत सरल और साफ!
दान

7

मैं हमेशा MySql शेल से डेटाबेस आयात करता हूं। यह एक प्रगति संकेतक प्रदान नहीं करता है, लेकिन यह उन कार्यों को स्क्रॉल (जल्दी) करता है जो यह प्रदर्शन कर रहा है इसलिए मुझे पता है कि यह काम कर रहा है।

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.