2012-12-02 18 views
6

के दौरान एक बड़ी MySQL तालिका में एक कॉलम जोड़ें, मुझे MySQL DB (MyISAM तालिका) में एक तालिका में एक नया कॉलम जोड़ने की आवश्यकता है जिसमें 20 मिलियन से अधिक पंक्तियां हों।ऑनलाइन

कॉलम जोड़ने की प्रक्रिया रन-टाइम में होनी चाहिए, मेरा मतलब है कि ऐप अभी भी चल रहा है और पंक्तियों को बदलने के दौरान पंक्तियां अभी भी डाली जाएंगी और चुनी जाएंगी।

  • यह चल रहे ऐप को कैसे प्रभावित करेगा?
  • इस परिवर्तन को करने में कितना समय लग सकता है?

मैं इस प्रक्रिया को सुरक्षित रूप से और चल रहे ऐप को नुकसान पहुंचाए बिना कैसे कर सकता हूं?

+3

क्लोन, बेंचमार्क, योजना, तैनाती। – soulseekah

+0

आप किस डेटाबेस इंजन का उपयोग कर रहे हैं? – Barmar

+0

@ बाड़ार मुझे लगता है कि आपका मतलब मायिसम है। डीबी MySQL है। – SimonW

उत्तर

4

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

MySQL 5.5 (तेज इंडेक्स निर्माण, innodb) पर, 8-कोर CPU, चिप डिस्क, कई इंडेक्स के साथ 5 मिल पंक्ति पंक्ति तालिका को बदलने से हमारे मामले में लगभग 15-20 मिनट लगते हैं।

मैं एक प्रतिलिपि बनाने और प्रतिलिपि बदलने का सुझाव देता हूं। आपके द्वारा किए जाने के बाद आपको डेटा डेल्टा को फिर से चलाने की आवश्यकता होगी।

: फेसबुक एक तरह से उच्च स्तर पर इस का सामना करना पड़ा, इस की जाँच

http://m.facebook.com/note.php?note_id=430801045932

यद्यपि, मैं इस होगा सब काम सुरक्षित रूप से MyISAM इंजन

संपादित करें पर वादा नहीं कर सकता

http://www.mysqlperformanceblog.com/2012/04/05/percona-toolkit-2-1-with-new-online-schema-change-tool/

:

Percona एक टूलकिट जो जाहिरा तौर पर सभी भंडारण इंजन पर काम करता है बनाया

इस रिलीज के साथ

हम pt-ऑनलाइन-स्कीमा परिवर्तन का एक नया संस्करण, एक उपकरण आप कोई अवरुद्ध या डाउनटाइम के साथ बड़े तालिकाओं में परिवर्तन करने के लिए सक्षम बनाता है कि परिचय। जैसा कि आप जानते हैं, MySQL अधिकांश ALTER संचालन के लिए लॉक करता है, लेकिन pt-online- स्कीमा-परिवर्तन बिना लॉकिंग के ALTER निष्पादित करता है। क्लाइंट अनुप्रयोग बिना किसी रुकावट वाले तालिका को पढ़ और लिख सकते हैं।

+0

धन्यवाद, मैं इसे देख लूंगा! – SimonW

2

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

यह कहना मुश्किल है कि यह कितना समय लगेगा, यह इस बात पर निर्भर करता है कि डेटाबेस पहले से कितना बड़ा है, क्योंकि इसे बहुत से डेटा प्रतिलिपि और आपके सर्वर की गति करना होगा। जैसा कि ऊपर बताया गया है, इसे खोजने का तरीका तालिका की एक प्रति बनाना है और प्रतिलिपि में बदलाव करना है।

+1

का उपयोग कर रहे थे "* तालिका का उपयोग करने का प्रयास करने वाले किसी भी एप्लिकेशन को लटका दिया जाएगा * - कम से कम, जब तक तालिका अनलॉक नहीं हो जाती है या वे टाइमआउट (और मानते हैं कि वे डेटाबेस ड्राइवर को अवरुद्ध कॉल करते हैं)। – eggyal

+0

थानक्स @ बाड़ार! – SimonW

संबंधित मुद्दे