एक इंडेक्स को बहुत धीमी गति से जोड़ना ... क्या ETA पाने या प्रगति दिखाने के लिए mysql cmd है?


13

मैं वर्तमान में अपनी तालिका (20M प्रविष्टियों) पर एक अनुक्रमणिका जोड़ने के लिए एक परिवर्तन क्वेरी चला रहा हूं। यह 3 दिन से अधिक समय से चल रहा है ('tmp तालिका में प्रतिलिपि' पर अटक गया है)।

क्या कोई तरीका है जिससे मैं क्वेरी की प्रगति देख सकता हूं या दूसरे शब्द में एक तरीका है जिससे मुझे पूरा होने का अनुमान प्राप्त हो सकता है?

धन्यवाद।


4
MyISAM? InnoDB? यदि InnoDB, क्या फ़ाइल-प्रति-तालिका चालू है?
चार्ल्स

महान सवाल - सबसे अच्छी बात जो मैं तुरंत सोच सकता हूं कि कच्चे अस्थायी और वास्तविक फ़ाइलों के आकार का उपयोग करके एक मोटा अनुमान लगाना है

कृपया SHOW CREATE TABLE tblname\Gटेबल पर जाएं और हमें वह इंडेक्स बताएं जिसे आप बनाना चाहते हैं।
रोलैंडमाइसीडीडीबीए

जवाबों:


3

जब mysql एक तालिका को बदल देता है, तो यह अनिवार्य रूप से इसकी एक प्रतिलिपि बनाता है और फिर प्रतिलिपि को अंदर स्वैप करता है। इस तरह से यदि आप बीच में अपडेट रद्द करते हैं, तो तालिका अभी भी एक स्थिर स्थिति में है। तो आप mysql डेटा डायरेक्टरी (/ var / lib / mysql /?) में देख सकते हैं कि नई फ़ाइल कितनी बड़ी है, जो आपको बताएगी कि यह कितनी दूर है। यह इनोडब के साथ थोड़ा अधिक कठिन है, लेकिन कहीं न कहीं एक tmp तालिका बनाई जा रही है।

आपके सॉर्ट बफर वैरिएबल (myisam_sort_buffer_size, Sort_buffer_size) को बढ़ाकर एक इंडेक्स की मात्रा को आप काफी कम कर सकते हैं। उन लोगों को उतना बड़ा बनाइए जितने आपके पास स्मृति के साथ हो सकते हैं। आप संशोधन के समय से कुछ दिनों की कटौती कर सकते हैं, यहां तक ​​कि यह कुछ घंटों के लिए नीचे भी मिलता है कि आपके पास कितनी मेमोरी है। मैंने लगभग ३ घंटे में १५० एम की रिकॉर्ड टेबल बनाई है।


दुर्भाग्य से मुझे कोई tmp तालिका नहीं मिली। मैं innob का उपयोग करता हूं, बंद करने के लिए innodb_file_per_table के साथ।

2

चूंकि innodb_fle_per_table बंद है, आप तालिका नहीं देख सकते हैं और इसे प्रगति को माप सकते हैं।

मैंने MyISAM के लिए यह करने के बारे में एक पुरानी पोस्ट बनाई । यदि आप केवल और अगर innodb_file_per_table को सक्षम किया गया था और आप InnoDB अवसंरचना की खोज करते हैं, तो आप InnoDB के लिए ऐसा कर सकते हैं । यह अभी भी विचाराधीन फाइलों के आकार में ऑपरेटिंग सिस्टम को देखने की आवश्यकता है।

एक बार जब आप पूरी तरह से इनओबीडी क्लीनअप लागू कर लेते हैं और आपने innodb_file_per_table को सक्षम कर लिया है, तो आप निम्नानुसार इंडेक्स अपडेट करना चाहते हैं:

आपके पास निम्नलिखित हैं

  • MySQL Instance with / var / lib / mysql datadir के रूप में
  • db.lotsofdata20 मिलियन नामों के साथ बुलाया InnoDB तालिका :

तालिका इस तरह दिखती है:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

मान लीजिए आप एक नाम सूचकांक बनाना चाहते हैं। तुम यह केर सकते हो:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

जबकि INSERT चल रहा है, आप ऑपरेटिंग सिस्टम में जाते हैं और इसे चलाते हैं:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

यह आपको वर्तमान आकार की एक सूची देगा lotsofdata_new.ibd। जब यह इससे बड़ा हो जाता है lotsofdata.ibd, तो आप जानते हैं कि आप पूरा होने के करीब हैं।

BTW MariaDB में आंतरिक रूप से कार्यान्वित एक प्रगति स्थिति है


आपकी प्रतिक्रिया के लिए धन्यवाद। अभी के लिए, मैंने क्वेरी को मारने और अंतिम mysql संस्करण में अपग्रेड करने के बाद फिर से प्रयास करने का निर्णय लिया। उम्मीद है कि यह इस तरह से अधिक सुचारू रूप से चलेगा।
अताई वोल्तेयर

1

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

ऐसा लगता है कि आप MySQL के एक संस्करण का उपयोग कर रहे हैं, जिसमें बिना InnoDB प्लगइन इंस्टॉल किया गया है। InnoDB प्लगइन में तेज़ इंडेक्स क्रिएशन होता है जिसे इंडेक्स अतिरिक्त और विलोपन के लिए तालिका के पूर्ण पुनर्निर्माण की आवश्यकता नहीं होती है। InnoDB प्लगइन MySQL 5.5 में डिफ़ॉल्ट रूप से सक्षम है और 5.1.38 और बाद में कॉन्फ़िगरेशन सेटिंग के साथ उपलब्ध है।

  • MySQL के किस संस्करण का आप उपयोग कर रहे हैं?

Percona सर्वर वापस काफी तरीके (पूर्व 5.5) में InnoDB प्लगइन डिफ़ॉल्ट रूप से सक्षम है।


0

पीरकोना द्वारा पीटी-ऑनलाइन-स्कीमा-परिवर्तन शेष समय अनुमान दिखाता है। डिफ़ॉल्ट रूप से यह शेष समय के अनुमान और प्रगति के प्रतिशत को हर 30 सेकंड में प्रिंट करता है।

इसमें केवल ALTER कमांड चलाने की तुलना में अतिरिक्त कार्य भी हैं।

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

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