MyISAM को InnoDB में बदलने के लिए सर्वोत्तम तरीकों में से एक बिना डाउनटाइम के केवल एक पूर्वापेक्षा है: एक प्रतिकृति दास का उपयोग करें।
यहां योजना का एक विहंगम दृश्य है
- प्रतिकृति मास्टर / दास सेटअप बनाएँ
- प्रत्येक MyISAM तालिका को दास में InnoDB में बदलें
- अपने ऐप को स्लेव की ओर इंगित करें
सरल लगता है? इसके पीछे बहुत सारी जानकारियां हैं।
प्रतिकृति मास्टर / दास सेटअप बनाएँ
मास्टर को बहुत परेशान करने के बिना एक दास बनाने का एक चालाक तरीका है। मैंने दो पोस्ट लिखी हैं:
Rsync का उपयोग कैसे करें, इसके बजाए कृपया उन दो पोस्टों को पढ़ें।
प्रत्येक MyISAM तालिका को दास में InnoDB में बदलें
DB दास पर, आप निम्नलिखित एसक्यूएल स्टेटमेंट कर सकते हैं:
MySQL 5.5 के लिए:
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema');
MySQL 5.5 के लिए MySQL से पहले का संस्करण
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql');
क्वेरी से आउटपुट का उपयोग करते हुए, आपके पास दास के लिए रूपांतरण स्क्रिप्ट है।
आपको इन दो पंक्तियों को स्क्रिप्ट के शीर्ष पर रखना होगा:
SET SQL_LOG_BIN = 0;
STOP SLAVE;
स्क्रिप्ट पहले बाइनरी लॉगिंग को अक्षम करेगी (यदि आपने दास को बाइनरी लॉग्स को कॉन्फ़िगर किया है), प्रतिकृति को रोकें और प्रत्येक MyISAM तालिका को InnoDB में कनवर्ट करें।
यहाँ उस स्क्रिप्ट को बनाने और इसे निष्पादित करने का तरीका बताया गया है:
SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema')"
INNODB_CONV_SCRIPT=MassConvertMyISAMTablesToInnoDB.sql
echo "SET SQL_LOG_BIN = 0;" > ${INNODB_CONV_SCRIPT}
echo "STOP SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Master) -u... -p... --skip-column-names -A -e"${SQL}" >> ${INNODB_CONV_SCRIPT}
echo "START SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Slave) -u... -p... --skip-column-names -A < ${INNODB_CONV_SCRIPT}
अपने ऐप को स्लेव की ओर इंगित करें
स्लेव से सेलेक्ट क्वेश्चन करें। यदि आप दास पर डेटा सामग्री से संतुष्ट हैं, तो अपने ऐप को निम्नानुसार इंगित करने के लिए स्वतंत्र महसूस करें:
- दास पर, चलाएं
SHOW SLAVE STATUS\G
और सुनिश्चित करें कि Seconds_Behind_Master 0 है
- स्लेव पर, mysqldump -h (स्लेव का IP) -u ... -p ... --single-transaction --routines --triggers --all-डेटाबेस> MySQLBackup.sql (अरे, एक बैकअप अच्छा होगा अब के बारे में)
- मास्टर पर, रन
service mysql stop
(डाउनटाइम शुरू होता है)
- दोहराएँ चरण 1
- अपने ऐप को स्लेव पर इंगित करें (डाउनटाइम ऐप के पहले कनेक्शन पर समाप्त होता है)
यदि आप इस बिंदु पर पहुंच से बाहर हैं, तो बधाई हो !!!
एडेड बोनस : यदि आप मास्टर / स्लेव के बजाय मास्टर / मास्टर प्रतिकृति (उर्फ परिपत्र प्रतिकृति) सेटअप करते हैं, तो आप इसके बजाय यह कर सकते हैं:
- दास पर, चलाएं
SHOW SLAVE STATUS\G
और सुनिश्चित करें कि Seconds_Behind_Master 0 है
- स्लेव पर, mysqldump -h (स्लेव का IP) -u ... -p ... --single-transaction --routines --triggers --all-डेटाबेस> MySQLBackup.sql (अरे, एक बैकअप अच्छा होगा अब के बारे में)
- अपने ऐप को स्लेव पर रखें (डाउनटाइम शुरू होता है और ऐप के पहले कनेक्शन पर समाप्त होता है)
- नए मास्टर पर, भागो
STOP SLAVE;
- नए मास्टर पर, भागो
CHANGE MASTER TO MASTER_HOST='';
अब आपके पास मास्टर / स्लेव रिवर्स में है। न्यू मास्टर के पास InnoDB डेटा है और पुराने मास्टर अब MyISAM डेटा के साथ गुलाम हैं। यदि आप पढ़ते हैं और लिखते हैं, तो स्लेव से पढ़ सकते हैं (इनसाइट MyoAM से InnoDB से तेज हैं) और लिखते हैं मास्टर (InnoDB के लिए लेन-देन का समर्थन) पर जाएं। हन्ना मोंटाना की तरह, आप दोनों दुनिया में सबसे अच्छे हैं (हाँ, मेरी दो बेटियाँ हैं जो इस शो से प्यार करती हैं) !!!
किसी अन्य व्यक्ति ने कहा : क्योंकि मास्टर अब InnoDB है, आप मास्टर से mysqldump बिना डाउनटाइम और लेनदेन के साथ हस्तक्षेप किए बिना कर सकते हैं। केवल दोष यह है कि CPU और डिस्क I / O में वृद्धि हुई है। इसलिए आप केवल मास्टर (InnoDB) पर तालिका संरचनाओं के mysqldump और केवल दास पर डेटा का mysqldump (इस तरह के डंप में InnoDB या MyISAM का कोई संदर्भ नहीं होगा। यह केवल डेटा होगा) प्लस mysqldump of। गुलाम के लिए टेबल संरचनाओं में माईसम लेआउट है।
इस नए सेटअप की वजह से संभावनाएं बढ़ सकती हैं ...
UPDATE 2011-08-27 19:50 EDT
मैं क्षमाप्रार्थी हूं। मैंने पूरी तरह से सवाल नहीं पढ़ा। आपने पहले ही दीक्षांत समारोह कर दिया ।
केवल अगर आपके पास पहले से ही बाइनरी लॉगिंग चालू थी , और आपके पास एक पूर्व बैकअप है, तो आप कर सकते हैं
- किसी अन्य स्थान पर / var / lib / mysql को पुनर्स्थापित करें, जैसे / var / lib / mysql2
- Daud
service mysql stop
- Daud
service mysql start --datadir=/var/lib/mysql2
- उस बैकअप से डेटाबेस को /root/olddata.sql पर mysqldump करें
- सभी बायनरी लॉग्स के खिलाफ / var / lib / mysql (not / var / lib / mysql2) के खिलाफ mysqlbinlog को पॉइंट-इन-टाइम से आखिरी बार /root/changes.sql में चलाएं
- लोड परिवर्तन। Myqql में एसक्यूएल (क्योंकि यह अभी भी / var / lib / mysql2 पर इंगित कर रहा है)
यह दर्ज की गई हर चीज को पकड़ना चाहिए और रूपांतरण को किक करना चाहिए। फिर से, यह सब आपके लिए पहले से ही बाइनरी लॉगिंग को अंतिम बैकअप से चालू होने पर सन्निहित है । नहीं तो मेरी संवेदना।