मैं बड़ी .sql फ़ाइल के आयात की प्रगति की निगरानी कैसे कर सकता हूं?


204

मैं foobar.sqlस्थानीय डेटाबेस में एक तालिका को पुनर्स्थापित करने के लिए 7 जीबी आयात कर रहा हूं ।

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

मैं इसकी प्रगति की निगरानी कैसे कर सकता हूं?


1
इस सवाल के जवाब से पता चलता है कि यह mysql क्लाइंट की स्पष्ट कमी है
विलियम एंट्रीकेन

जवाबों:


267

यदि आप सिर्फ * nix, जैसे CLI से डंप फ़ाइल से आयात कर रहे हैं

mysql -uxxx -pxxx dbname < /sqlfile.sql

फिर पहले अपने ओएस पर पाइप दर्शक स्थापित करें फिर कुछ इस तरह से प्रयास करें:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

जो प्रोग्राम के चलते ही प्रगति पट्टी दिखाएगा।

यह बहुत उपयोगी है और आप mysqldump प्रगति के लिए अनुमान प्राप्त करने के लिए भी इसका उपयोग कर सकते हैं।

pv डंप करता है sqlfile.sqlऔर उन्हें mysql (पाइप ऑपरेटर की वजह से) पास करता है। जबकि यह डंपिंग है, यह प्रगति को दर्शाता है। अच्छी बात यह है कि mysql डेटा को केवल उतनी ही तेजी से लेता है जितना वह इसे आगे बढ़ा सकता है, इसलिए pv आयात की प्रगति दिखा सकता है। मेरे पास कोई सबूत नहीं है। लेकिन ऐसा लगता है। मुझे लगता है कि कुछ बफर का उपयोग किया गया है, लेकिन कुछ बिंदु पर मुझे लगता mysqlहै कि जब यह अभी भी व्यस्त है तो कोई और डेटा नहीं पढ़ता है।

पाइप दर्शक स्क्रीनशॉट


1
मुझे लगता है कि mysql में एक बफर हो सकता है, जिसमें कुछ डेटा को पूरी तरह से "संसाधित" होने के बिना, पाइप किया जा सकता है (यानी यदि यह त्रुटियां हैं, तो पीवी थोड़ा अधिक सूचना दे सकता है कि वास्तव में क्या मिलता है)। लेकिन सामान्य तौर पर, यह कैसे पाइप काम करता है। यह वही कारण है जो आप कर सकते हैं sudo hd /dev/sda1 | lessऔर आपके पूरे सिस्टम का मेमोरी में विभाजन नहीं है।
Snapfractalpop

2
@ snapfractalpop pvकई मामलों में अधिक सटीक नहीं होगा क्योंकि SQL के कुछ अंश दूसरों की तुलना में प्रोसेस होने में अधिक समय लेंगे। एक पंक्ति जो एक साधारण आवेषण का निर्माण करती है, वह एक से अधिक तेज़ी से चलेगी जो कि एक तालिका पर अनुक्रमणिका बनाता है जिसमें पहले से ही कई पंक्तियाँ हैं, उदाहरण के लिए। लेकिन आउटपुट की प्रगति का एक मोटा विचार तब तक मददगार होना चाहिए जब तक कि इस्तेमाल किया गया बफ़र mysqlविशेष रूप से बड़ा न हो (7Gb इनपुट के लिए बफ़र को बड़े पैमाने पर pvआउटपुट देने के लिए बहुत उपयोगी होने की आवश्यकता होगी ।
डेविड स्पिललेट

1
@DavidSpillett वास्तव में। आपकी टिप्पणी मेरी भावना को प्रदर्शित करती है। मूल रूप से, पीवी क्रूड है, लेकिन प्रभावी है। मुझे यह सबसे ज्यादा पसंद है कि यह कितना सामान्य है। यह यूनिक्स पाइप की सुंदरता है (धन्यवाद मैक्लेरॉय)।
Snapfractalpop

1
@rob यह भयानक दोस्त है, क्या आप इसके साथ एक उदाहरण भी दे सकते हैं mysqldump?
जोस अलेक्जेंडर इबर्रा

बहुत अच्छा समाधान! यदि पासवर्ड मैनुअल है, तो pv इसके प्रगति को प्रदर्शित करने के लिए इंतजार नहीं करता है
पियरे डे लेसपिन

26

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

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

इसका श्रेय: http://forums.mysql.com/read.php?108,201578,201578


MySQL 8.0 संदर्भ राज्यों सटीकता के बारे में निम्नलिखित:

DATA_LENGTH

MyISAM के लिए, DATA_LENGTH बाइट्स में डेटा फ़ाइल की लंबाई है।

InnoDB के लिए, DATA_LENGTH बाइट्स में क्लस्टर इंडेक्स के लिए आवंटित स्मृति की अनुमानित राशि है। विशेष रूप से, यह संकुल सूचकांक आकार है, पृष्ठों में, InnoDB पृष्ठ आकार से गुणा किया जाता है।

 

INDEX_LENGTH

MyISAM के लिए, INDEX_LENGTH बाइट में इंडेक्स फ़ाइल की लंबाई है।

InnoDB के लिए, INDEX_LENGTH गैर-संकुल इंडेक्स के लिए आवंटित मेमोरी की अनुमानित मात्रा है, बाइट्स में। विशेष रूप से, यह गैर-संकुल सूचकांक आकारों का योग है, पृष्ठों में, InnoDB पृष्ठ आकार से गुणा किया जाता है।


मेरी तालिका अब इस उत्तर से आज्ञाओं के अनुसार 12 GiB पर है, और अभी भी आयात कर रही है। मेरी sqldump फ़ाइल केवल 5 GiB है। मुझे इस विसंगति के लिए स्पष्टीकरण में दिलचस्पी होगी
lucidbrot

17

जब आप किसी एकल डेटाबेस के mysqldump को निष्पादित करते हैं, तो सभी तालिकाओं को वर्णानुक्रम में डंप किया जाता है।

स्वाभाविक रूप से, एक डेटाबेस में mysqldump का पुनः लोड भी वर्णमाला क्रम में होगा।

तुम सिर्फ एक शोकेस कर सकते हो; और mysqldump को चलाने वाले DB कनेक्शन का पता लगाएं। जब डंप पुन: लोड किया जाता है, तो DB कनेक्शन गायब हो जाएगा।

यदि आप यह जानना चाहते हैं कि डंपफाइल में कौन सी टेबल हैं, तो इसे foobar.sql के विरुद्ध चलाएं

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

UPDATE 2012-05-02 13:53 EDT

यह देखने के लिए क्षमा करें कि केवल एक तालिका है।

यदि तालिका MyISAM है, तो निगरानी करने का एकमात्र तरीका OS बिंदु से है। कारण? तालिका को पुनः लोड करने के दौरान लिखा गया है। तुम क्या ढूँढ़ते हो? फ़ाइलों .MYDऔर .MYIफ़ाइलों का आकार । बेशक, आपको यह तुलना करने की आवश्यकता है कि आपके द्वारा आयात किए गए अन्य DB सर्वर पर टेबल का आकार पहले क्या था।

यदि तालिका InnoDB है और आपके पास innodb_file_per_table सक्षम है, तो मॉनिटर करने का एकमात्र तरीका OS दृष्टिकोण से है। कारण? तालिका को पुनः लोड करने के दौरान लिखा गया है। तुम क्या ढूँढ़ते हो? .ibdफ़ाइल का आकार । बेशक, आपको यह तुलना करने की आवश्यकता है कि आपके द्वारा आयात किए गए अन्य DB सर्वर पर टेबल का आकार पहले क्या था।

यदि तालिका InnoDB है और आपके पास innodb_file_per_table अक्षम है, तो ओएस बिंदु भी मदद नहीं कर सकता है।

UPDATE 2012-05-02 13:56 EDT

मैंने पिछले साल कुछ इस तरह से संबोधित किया: मुझे "db.sql | mysql" के लिए% प्रगति कैसे मिलेगी

अद्यतन 2012-05-02 14:09 EDT

चूंकि एक मानक mysqldump इस तरह से तालिका को लिखता है:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

तब, मेज लॉक जारी होने तक mysql के साथ प्रगति प्राप्त करने का कोई तरीका नहीं है।

यदि आप डंपफाइल से बाहर निकल सकते हैं LOCK TABLESऔर UNLOCK TABLESटिप्पणी कर सकते हैं ...

  • यदि तालिका MyISAM है, तो SELECT COUNT (*) काम करेगा
  • यदि तालिका InnoDB है, तो SELECT COUNT (*) संभवतया लोड को धीमा / रोक देगा जब तक कि गणना नहीं की जाती है

वह काम किया। धन्यवाद। एक आखिरी सवाल यह है कि अनुभव से, क्या आपको पता है कि आयात समय फ़ाइल और फ़ाइल आकार के संबंध में लगभग रैखिक है ? .MYD.MYI
२१:१२

1
टेबल रीलोड रैखिक है। इंडेक्स रीबर्ड्स रैखिक होते हैं। वर्षों पहले, ऐसा नहीं था कि मैंने इसे MySQL ( lists.mysql.com/mysql/202489 ) के लिए एक प्रश्न के रूप में लिया था और मैंने इसका उल्लेख DBA StackExchange ( dba.stackexchange -a/ 2697/ 877 ) में किया
RolandoMySQLDBA

8

हर 2 सेकंड में आप प्रक्रियाओं को चालू देखेंगे।

watch 'echo "show processlist;" | mysql -uuser -ppassword';

यदि आप चाहते हैं यह लगातार कम तो जोड़ने -n xजहां एक्स सेकंड की संख्या है। 5 सेकंड होगा:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

क्या आप एक उदाहरण आउटपुट पोस्ट कर सकते हैं? इसके अलावा, क्या यह सिर्फ प्रक्रिया दिखाता है या क्या यह वास्तव में आयात की प्रगति को दर्शाता है, जो वास्तव में मैं पूछ रहा था?
qazwsx

यह एक ऐसा मददगार कोड है। ठनक यू
नारायण

6

यदि आप जांचना चाहते हैं कि क्या यह रुका हुआ है तो आप प्रश्न कर सकते हैं

show processlist; 

और देखें कि क्या निष्पादित किया जा रहा है।


5

किसी ऐसे व्यक्ति के समाधान के रूप में जिसे काम करने के लिए pv नहीं मिल सकता है या जिसके लिए pv झूठ कहता है। आप ibdata1 फ़ाइल का आकार / var / lib / mysql में देख सकते हैं जिसमें डेटा सम्‍मिलित है। यह आपके स्रोत सर्वर में फ़ाइलों के आकार (या उपचार) को समाप्त कर देगा।

अगर कई टेबल हैं, तो आप उन्हें एक-एक करके / var / lib / mysql / <database name> में भी देख सकते हैं।

मैं हाल ही में इस तथ्य का उपयोग करने के लिए हुआ था जब एक लंबी अवधि के डेटाबेस ने तीन या चार वर्षों की अवधि में लगभग 20 जी की लॉग फ़ाइल बनाई थी। मैंने देखा कि स्थानांतरण उम्र ले रहा था और प्रगति की निगरानी के लिए इस तकनीक का उपयोग किया।

मुझे लगता है कि यह बहुत कम संभावना है कि वह दिन सुबह हो जाएगा जब एक डेटाबेस में कहीं या किसी फ़ाइल को शामिल नहीं किया जाता है। इस बीच, आप फाइल को देख सकते हैं कि ट्रांसफर कैसे हो रहा है। मैंने जिस विधि का सुझाव दिया है वह कुछ ऐसा है जिसे आप पहले sql डेटाबेस में लिखे जाने के बाद से एक या दूसरे रूप में कर सकते हैं। मुझे यह सुझाव देने का कभी इरादा नहीं था कि यह किसी भी तरह की "आधिकारिक" तकनीक है, जो एक मैनुअल जॉकी पर गिर सकती है। यह सामान्य रूप से कंप्यूटर के साथ प्रवीणता के एक सामान्य स्तर को मानता है और विशेष रूप से यूनिक्स में।


2

यदि आपका DB अन्यथा शांत है (अर्थात अन्य उपयोगकर्ता सक्रिय नहीं हैं) और आप बस पढ़ना / लिखना गतिविधि देखना चाहते हैं तो बस कुछ ऐसा क्यों न करें:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

आपको रीड / इन्सर्ट / इन्सर्ट / वेट / अपडेट की संख्या दिखाई देगी।

यदि आप उदाहरण के लिए सम्मिलित कर रहे हैं तो आपको कुछ दिखाई देगा:

Innodb_rows_inserted                          | 28958 

जहां 28958 आपके अंतराल के लिए डाली गई पंक्तियों की संख्या है (मेरे मामले में 10 सेकंड)।


1

जो mysqldumpआप का उपयोग कर पाइप दर्शक उदाहरण के लिए देख रहा है किसी के लिए बस इस तरह से कुछ करना होगा:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

-Wझंडा सिर्फ पीवी बताता पहली बाइट के लिए प्रगति (शीघ्र बाद) दिखाने से पहले आने के लिए प्रतीक्षा करने के लिए


0

आप फ़ोल्डर \ Msql \ Data [DB नाम] में एक आयात की निगरानी कर सकते हैं


0

ठीक है, चारों ओर एक और काम। लेकिन यह सबसे खराब और गलत विकल्प हो सकता है।

उस ने कहा, यहाँ विंडोज के लिए मेरा समाधान है:

टास्क मैनेजर दबाकर खोलें

CTRL + SHIFT + ESC

"Mysqld.exe" डिस्क मान की गति की प्रतिलिपि बनाएँ

e.g. 11mb/s

इसे इस तरह से एक कैलकुलेटर में रखें: https://techinternets.com/copy_calc?do

ईटीए का अनुमान लगाएं। मेरा मामला था:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

परिणाम:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

मैं बहुत हैरान हूं कि किसी ने भी 'mysql -v' को एक विकल्प के रूप में पोस्ट नहीं किया। यदि यह अटक जाता है, तो उत्पादन बंद हो जाएगा।


3
"मॉनिटरिंग प्रोग्रेस" का अर्थ आमतौर पर यह अनुमान लगाने की कोशिश करना है कि प्रक्रिया कितनी आगे बढ़ गई है या कब पूरी mysql -vहोगी , जो पेश नहीं करेगी। इसके अलावा, टर्मिनल के लिए 7 जीबी डेटा को कम करने से पुनर्स्थापना में काफी कमी आएगी ।
मस्टेको

मैं देख रहा हूँ, स्पष्टीकरण के लिए धन्यवाद। यह सच है, 7 जीबी का आउटपुट टर्मिनल में आउटपुट के लिए अच्छा नहीं होगा। मुझे लगता है कि मैं -v का उपयोग सिर्फ एक छोटे से स्थानीय परीक्षण मामले के लिए कर रहा हूं, जहां मेरा डीबी बस अटक जाएगा।
dtc

2
इस सुझाव ने मुझे एक समस्या को इंगित करने में मदद की, हालांकि बड़ी फ़ाइलों के साथ उपयोग करने के लिए यह अव्यावहारिक हो सकता है। (मेरा छोटा था)।
केसी पर्किन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.