MyISAM से Innodb तक बड़ी तालिका में परिवर्तित


10

मेरे पास MyISAM प्रारूप में लगभग 300M पंक्तियों वाली एक तालिका है जिसे मैं Innodb में बदलना चाहता हूं

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

क्या मैं केवल मानक सारणी ... इंजन = INNODB कर सकता हूं? क्या कुछ विशेष है जो मुझे इस तरह की एक विशाल तालिका के बारे में पता होना चाहिए?

डेटा आयात ऑपरेशन में लगभग 12 घंटे लग रहे हैं - मैं फिर से ऐसा करने के लिए तैयार हूं। इसलिए मैं इसे सिर्फ रूपांतरित करना चाहता हूं।


300M पंक्तियों के साथ, MyISAM शायद वैसे भी उस आकार की तालिका के लिए अधिक तेज़ और बेहतर है!
मार्क हेंडरसन

जवाबों:


14

निम्नलिखित उद्धरण " उच्च प्रदर्शन MySQL, दूसरा संस्करण " पुस्तक से निकला ।

यह एक उत्कृष्ट पुस्तक है और मैं इसे किसी को भी सुझाऊंगा।

संक्षिप्त उत्तर है:

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


टेबल बातचीत

एक टेबल को एक भंडारण इंजन से दूसरे में बदलने के कई तरीके हैं, प्रत्येक फायदे और नुकसान के साथ।

तालिका में परिवर्तन

mysql> ALTER TABLE mytable ENGINE = Falcon;

यह सिंटैक्स सभी स्टोरेज इंजन के लिए काम करता है, लेकिन इसमें एक पकड़ है: इसमें बहुत समय लग सकता है। MySQL आपकी पुरानी तालिका की पंक्ति-दर-पंक्ति एक नई तालिका में प्रदर्शन करेगा। उस समय के दौरान, आप संभवतः सर्वर के सभी डिस्क I / O क्षमता का उपयोग कर रहे होंगे, और रूपांतरण चलाते समय मूल तालिका को पढ़ा-अवरोधित किया जाएगा।

डंप और आयात

रूपांतरण प्रक्रिया पर अधिक नियंत्रण पाने के लिए, आप mysqldump उपयोगिता का उपयोग करते हुए पहली बार तालिका को टेक्स्ट फ़ाइल में डंप कर सकते हैं। एक बार जब आप टेबल को डंप कर लेते हैं, तो आप केवल उस डब फाइल को संपादित कर सकते हैं जिसमें क्रिएट टेबल स्टेटमेंट होता है। तालिका नाम के साथ-साथ इसके प्रकार को भी बदलना सुनिश्चित करें, क्योंकि आपके पास एक ही डेटाबेस में एक ही नाम के साथ दो तालिकाएँ नहीं हो सकती हैं, भले ही वे अलग-अलग प्रकार के हों और mysqldump डिफ़ॉल्ट तालिका लिखने से पहले DROP टेबल कमांड लिखने के लिए डिफॉल्ट करता हो। , तो अगर आप सावधान नहीं हैं तो आप अपना डेटा खो सकते हैं!

बनाएँ और चुनें

तीसरा रूपांतरण तकनीक पहले तंत्र की गति और दूसरे की सुरक्षा के बीच एक समझौता है। संपूर्ण तालिका को डंप करने या एक ही बार में सभी को रूपांतरित करने के बजाय, नई तालिका बनाएं और MySQL के INSERT का उपयोग करें ... इसे पॉप्युलेट करने के लिए सिंटैक्स का चयन करें, निम्नानुसार:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

यदि आपके पास बहुत अधिक डेटा नहीं है, तो यह अच्छी तरह से काम करता है, लेकिन यदि आप करते हैं, तो यह अक्सर तालिका को पर्याप्त रूप से पॉप्युलेट करने के लिए अधिक कुशल होता है, जिससे प्रत्येक चंक के बीच लेनदेन होता है, जिससे पूर्ववत लॉग बड़ा नहीं होता है। मान लें कि आईडी प्राथमिक कुंजी है, तो इस क्वेरी को बार-बार (हर बार x और y के बड़े मानों का उपयोग करके) तब तक चलाएं जब तक कि आप सभी डेटा को नई तालिका में कॉपी न कर दें:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

ऐसा करने के बाद, आपको मूल तालिका के साथ छोड़ दिया जाएगा, जिसे आप ड्रॉप कर सकते हैं जब आप इसके साथ कर रहे हैं, और नई तालिका, जो अब बहुत लोकप्रिय है। डेटा की असंगत प्रतिलिपि प्राप्त करने से रोकने के लिए यदि आवश्यक हो तो मूल तालिका को लॉक करने के लिए सावधान रहें!


2

अलर्ट टेबल स्टेटमेंट अनिवार्य रूप से एक ही काम करता है: सर्वर एक अस्थायी तालिका बनाता है जहां यह सभी पंक्तियों को कॉपी करता है और फिर एक RENAME करता है। इनओडीबी और म्य्सैम के बीच ऑन-डिस्क प्रारूप बेहद अलग हैं, इसलिए मैं आपसे इस बारे में कोई शॉर्टकट खोजने की उम्मीद नहीं करता।

एक अन्य टिप्पणी (जिसके बारे में आप शायद जानते हों, लेकिन यह दूसरों को इसे पढ़ने में मदद करेगी): इनोबीडी के लिए ऑन-डिस्क प्रारूप प्राथमिक कुंजी पर अत्यधिक निर्भर है, क्योंकि यह इसके आधार पर रिकॉर्ड को क्लस्ट करता है। इसलिए जब बड़ी InnoDB तालिकाओं के साथ काम करते हैं, तो प्राथमिक कुंजी चुनने से पहले दो बार सोचें, क्योंकि इसे बदलने से पूरी तालिका का पुनर्निर्माण होता है, बहुत कुछ हाथ में समस्या की तरह।

वैसे भी, मैं पहले थोड़े-थोड़े आकार की मेज और समय पर कुछ परीक्षण करने की सलाह देता हूँ।


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