मैं डंप फ़ाइल से MySQL को कैसे पुनर्स्थापित कर सकता हूं?


28

मैं एक mysqldump फ़ाइल से 30GB डेटाबेस को एक नए सर्वर पर एक खाली डेटाबेस में पुनर्स्थापित कर रहा हूं। डंप फ़ाइल से SQL चलाते समय, पुनर्स्थापना बहुत जल्दी शुरू होती है और फिर धीमी और धीमी गति से शुरू होती है। व्यक्तिगत आवेषण अब 15+ सेकंड ले रहे हैं। टेबल ज्यादातर एक छोटे से InnoDB के साथ MyISAM हैं। सर्वर में कोई अन्य सक्रिय कनेक्शन नहीं है। SHOW PROCESSLIST;केवल पुनर्स्थापना (और शो प्रक्रिया सूची से) डालने से पता चलता है।

क्या किसी के पास कोई विचार है जो नाटकीय मंदी का कारण हो सकता है?

क्या कोई MySQL वैरिएबल है जिसे मैं प्रगति करते समय पुनर्स्थापना की गति में बदल सकता हूं?


तालिका प्रकार को सही करने के लिए संपादित
डेव फोर्गैक

जवाबों:


26

एक चीज जो प्रक्रिया को धीमा कर सकती है वह है key_buffer_size , जो कि इंडेक्स ब्लॉक के लिए उपयोग किए जाने वाले बफर के आकार की है। अपने कम से कम 30% रैम या इस री-इंडेक्सिंग प्रक्रिया को ट्यून करें, शायद यह बहुत धीमा है।

संदर्भ के लिए, यदि आप InnoDB और विदेशी कुंजी का उपयोग कर रहे थे, तो आप भी अक्षम विदेशी कुंजी की जाँच करता है और यह अंत में पुन: सक्षम कर सकता है (का उपयोग करते हुए SET FOREIGN_KEY_CHECKS=0और SET FOREIGN_KEY_CHECKS=1)।


1
मुझे दो चीजें मिलीं: key_buffer_size को 8MB पर सेट किया गया था और विदेशी कुंजी के साथ मिश्रण में एक InnoDB तालिका थी। Key_buffer_size को 1GB तक बढ़ाया और अस्थायी रूप से विदेशी कुंजी चेक को बंद कर दिया। पुनर्स्थापना 5 मिनट में समाप्त हो गई। धन्यवाद!
डेव फॉर्गैक

वाह! खुशी है कि यह मदद मिली :)
मार्को रामोस

2
मैंने अभी देखा कि मैंने '5' मिनट टाइप किया। मुझे पूरा यकीन है कि यह 50 मिनट की तरह अधिक था, लेकिन अभी भी अधिक उचित है ;-)
डेव फोर्गैक 19'13

5
key_buffer_size MYISAM के लिए है।
फर्नांडो फेब्रेटी

@FernandoFabreti - यह कई पाठकों के लिए एक महत्वपूर्ण बिंदु है, लेकिन ओपी ने निर्दिष्ट किया कि उनके पास ज्यादातर MyISAM था
mc0e

22

यह लिंक दिखाता है कि पुनर्स्थापना प्रक्रिया को गति देने के लिए कोई क्या कर सकता है।

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

एक डंप फ़ाइल के शीर्ष पर कमांड डाल सकते हैं

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

और इन बयानों को डंप फ़ाइल के अंत में रखें

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

इसने मेरे लिए काम किया। खुश बहाल :-)


8
इससे काफी मदद मिली। फ़ाइल को संपादित करने के बजाय, मैंने ऊपर के स्निपेट्स से प्री.क्कल और पोस्ट.स्केल बनाया और डीबी को पुनर्स्थापित करने के लिए इसका इस्तेमाल किया:cat pre.sql dump.sql post.sql | mysql ...
जेसन आर। कोम्ब्स

1

एकमात्र कारण मैं छवि कर सकता हूं कि पुनर्स्थापना धीरे-धीरे धीमा क्यों हो जाएगी। अंत तक अनुक्रमण को बंद करने की जांच करें और फिर इसे एक ही बार में पूरा करने दें।


1

यदि आपके पास डंप फ़ाइल (DB निर्देशिका) की भौतिक प्रतिलिपि है, तो आप इसे नए सर्वर पर कॉपी कर सकते हैं यदि नए सर्वर में समान MySQL संस्करण है और यह ठीक काम करेगा। यह MyISAM के साथ ठीक काम करता है और मेरे लिए मुझे लगता है कि यह तार्किक SQL डंप फ़ाइल के आधार पर डेटा को पुनर्स्थापित करने से बेहतर है।


0

यदि आपके पास कई टेबल संभावनाएं हैं, तो आप एमके-समानांतर-पुनर्स्थापना से लाभ उठा सकते हैं ।


यह अब हटा दिया गया है और इसका उपयोग केवल परीक्षण डेटा को पुनर्स्थापित करने के लिए किया जाना चाहिए, वास्तविक बैकअप को पुनर्स्थापित करने के लिए नहीं।
svandragt

0

इससे चल जाएगा:

mysql --init-command = "SET SIONION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -यू रूट -p <Backup_Database.mysql


-1

मैंने आपको सुझाव दिया,

  1. अपनी तालिकाओं की जाँच करें: क्या यह ट्रिगर है? सभी ट्रिगर साफ़ करें
  2. सेट: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( और ROLLBACK इसे बदलता न भूलें )
  3. उपयोग कम लाइन पसंद है mysql -u root -pPasss requests < mydb.sql
  4. अपने डेटाबेस फ़ाइल आकार की जाँच करें

शुभ लाभ

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