MyISAM से InnoDB तक ऑनलाइन रूपांतरण के बाद गायब होने वाली पंक्तियाँ


16

हमारे पास एक बहुत छोटा डेटाबेस है जिसे हम MyISAM से InnoDB में बदलना चाहते थे। डेटाबेस नॉब्स होने के नाते, हमने साइट को डाउन किए बिना भी (केवल परिवर्तन तालिका का उपयोग करके) परिवर्तित किया है।

अब जब रूपांतरण किया जाता है, तो बहुत-सी रुक-रुक कर पंक्तियाँ गायब होने लगती हैं। क्या यह संभवतः रूपांतरण के दौरान संचालन के कारण है? या मुद्दा कहीं और है?


कौन सी तालिकाएँ पंक्तियाँ याद कर रही हैं? जिन्हें आपने कनवर्ट किया है या अन्य टेबल?
लॉन्गनेक

जवाबों:


20

स्टोरेज इंजन को बदलने के लिए ALTER करने से पंक्तियाँ गायब नहीं होंगी। हालाँकि, मुझे कुछ सलाह देने के बाद से आपने कहा था कि आप अपने प्रश्न में 'डेटाबेस नॉब्स' हैं।

मौजूदा स्कीमा को संशोधित करने या ऐसा कुछ भी करने से जो डेटा को प्रभावित कर सकता है, यहाँ कुछ बुनियादी सलाह दी गई है:

  1. पहले एक बैकअप बनाओ।
  2. एक परिवर्तन योजना है।
  3. ऑफ़लाइन होस्ट पर अपनी योजना का परीक्षण करें।
  4. डेटा से पहले और बाद की तुलना करने के लिए एक परीक्षण योजना है।
  5. शेड्यूल करें और डाउनटाइम लें।
  6. आपके डाउनटाइम के प्रभावी होने के तुरंत बाद बैकअप और स्नैपशॉट लें और आप सत्यापित करें कि ट्रैफ़िक बंद हो गया है।
  7. यदि आप MYISAM चला रहे हैं, तो आप पहले आपके साथ क्या व्यवहार कर रहे हैं, इसका मूल्यांकन करने के लिए 'चेक टेबल' का उपयोग करें।
  8. अपने बैकअप के अतिरिक्त, स्थानीय रूप से तालिका को कॉपी करें।
  9. सावधानी के साथ आगे बढ़ें, "--show चेतावनियाँ" और अन्य आउटपुट सक्षम करें ताकि आपके पास पूरी तस्वीर हो जैसा कि आप अपने बदलाव करते हैं।
  10. यदि डेटा आपके लिए महत्वपूर्ण है, तो DBA को किराए पर लें, भले ही प्रवास के दौरान परामर्श करें ताकि आपके पास एक अनुभवी अनुभवी व्यक्ति हो।

वहाँ शायद एक बहुत अधिक मैं में मिल सकता है, लेकिन ऊपर कुछ गलत हो जाता है जब आप विकल्पों के साथ प्रदान करेगा।

जहां तक ​​आपके लापता डेटा / पंक्तियों की तुलना करने के लिए "स्नैपशॉट" से पहले / बाद में w / oa "जानने का कोई तरीका नहीं है। आप कम से कम इतना सत्यापित करने के लिए अपने नवीनतम बैकअप के खिलाफ तुलना कर सकते हैं।


मैंने इसे पढ़ा। अच्छी डीआर योजना। आपके उत्तर को प्रश्न के प्रति अधिक संवेदनशील होने के लिए +1 मिलता है, जो कि एक आगे जाने वाली योजना के अलावा था।
रोलैंडमाइसीडीडीबीए

1
@ कैंडी ने आपके अच्छे उत्तर के कारण इसे पसंदीदा प्रश्न के रूप में चिह्नित किया
TechExplorer

8

MyISAM को InnoDB में बदलने के लिए सर्वोत्तम तरीकों में से एक बिना डाउनटाइम के केवल एक पूर्वापेक्षा है: एक प्रतिकृति दास का उपयोग करें।

यहां योजना का एक विहंगम दृश्य है

  1. प्रतिकृति मास्टर / दास सेटअप बनाएँ
  2. प्रत्येक MyISAM तालिका को दास में InnoDB में बदलें
  3. अपने ऐप को स्लेव की ओर इंगित करें

सरल लगता है? इसके पीछे बहुत सारी जानकारियां हैं।

प्रतिकृति मास्टर / दास सेटअप बनाएँ

मास्टर को बहुत परेशान करने के बिना एक दास बनाने का एक चालाक तरीका है। मैंने दो पोस्ट लिखी हैं:

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}

अपने ऐप को स्लेव की ओर इंगित करें

स्लेव से सेलेक्ट क्वेश्चन करें। यदि आप दास पर डेटा सामग्री से संतुष्ट हैं, तो अपने ऐप को निम्नानुसार इंगित करने के लिए स्वतंत्र महसूस करें:

  1. दास पर, चलाएं SHOW SLAVE STATUS\Gऔर सुनिश्चित करें कि Seconds_Behind_Master 0 है
  2. स्लेव पर, mysqldump -h (स्लेव का IP) -u ... -p ... --single-transaction --routines --triggers --all-डेटाबेस> MySQLBackup.sql (अरे, एक बैकअप अच्छा होगा अब के बारे में)
  3. मास्टर पर, रन service mysql stop(डाउनटाइम शुरू होता है)
  4. दोहराएँ चरण 1
  5. अपने ऐप को स्लेव पर इंगित करें (डाउनटाइम ऐप के पहले कनेक्शन पर समाप्त होता है)

यदि आप इस बिंदु पर पहुंच से बाहर हैं, तो बधाई हो !!!

एडेड बोनस : यदि आप मास्टर / स्लेव के बजाय मास्टर / मास्टर प्रतिकृति (उर्फ परिपत्र प्रतिकृति) सेटअप करते हैं, तो आप इसके बजाय यह कर सकते हैं:

  1. दास पर, चलाएं SHOW SLAVE STATUS\Gऔर सुनिश्चित करें कि Seconds_Behind_Master 0 है
  2. स्लेव पर, mysqldump -h (स्लेव का IP) -u ... -p ... --single-transaction --routines --triggers --all-डेटाबेस> MySQLBackup.sql (अरे, एक बैकअप अच्छा होगा अब के बारे में)
  3. अपने ऐप को स्लेव पर रखें (डाउनटाइम शुरू होता है और ऐप के पहले कनेक्शन पर समाप्त होता है)
  4. नए मास्टर पर, भागो STOP SLAVE;
  5. नए मास्टर पर, भागो 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 पर इंगित कर रहा है)

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

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