2011-09-29 17 views
52

मैं डेटाबेस में किसी तालिका (main_table) पर "स्थान" नामक कॉलम जोड़ने का प्रयास कर रहा था। मैं चला गया आदेशवैकल्पिक तालिका जोड़ें कॉलम में बहुत समय लगता है

ALTER TABLE main_table ADD COLUMN location varchar (256); 

मुख्य_टेबल में> 2,000,000 पंक्तियां हैं। यह 2 घंटे से अधिक समय तक चल रहा है और अभी भी पूरा नहीं हुआ है।

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

+0

यह एक लो ले जाएगा ड्रॉप एनजी समय, सूचकांक और तालिका में मौजूद पंक्तियों की मात्रा के कारण। नोट: वर्कर (255) – Jauzsika

+0

मुझे लगता है कि आपको इसके लिए एक डिफ़ॉल्ट मान निर्दिष्ट करना चाहिए। हो सकता है कि यही समय ले रहा है? – Nilesh

+1

यह इस मामले में 'NULL' के लिए डिफ़ॉल्ट है, निश्चित रूप से क्यों नहीं कि यह एक लंबा समय ले रहा है। 'LIKE' वाक्यविन्यास के लिए – Romain

उत्तर

137

आपका ALTER TABLE कथन का अर्थ है कि mysql को नए कॉलम सहित तालिका की प्रत्येक पंक्ति को दोबारा लिखना होगा। चूंकि आपके पास 2 मिलियन से अधिक पंक्तियां हैं, इसलिए मुझे निश्चित रूप से उम्मीद है कि इसमें काफी समय लगेगा, जिसके दौरान आपका सर्वर अधिकतर आईओ-बाउंड होगा।

CREATE TABLE main_table_new LIKE main_table; 
ALTER TABLE main_table_new ADD COLUMN location varchar(256); 
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; 
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; 
DROP TABLE main_table_old; 

इस तरह आप खाली मेज पर स्तंभ जोड़ने के लिए, और मूल रूप से है कि नई तालिका में डेटा क्या आप वाकई कोई और नहीं एक हो जाएगा हैं कि लिखने: आप आम तौर पर यह निम्न करने के लिए अधिक performant है पाते हैं अधिक संसाधन लॉक किए बिना देख रहे हैं।

+48

+1, जिसे मैंने पहले कभी नहीं देखा था। – Malvolio

+0

@ माल्वोलियो ध्यान देने योग्य मूल्य: मुझे लगता है कि यह एक MySQL- मालिकाना एसक्यूएल एक्सटेंशन है ... हालांकि इसके बारे में 100% निश्चित नहीं है। – Romain

+4

भले ही यह है, पिछली बार जब किसी ने गैर-MySQL SQL RDBMS का उपयोग किया था? दोस्त दोस्तों को ओरेकल खरीदने नहीं देते हैं। – Malvolio

9

मुझे लगता है कि इसके लिए उपयुक्त उत्तर pt-online-schema-change या gh-ost जैसी सुविधा का उपयोग कर रहा है।

हमने इसके साथ 4 अरब से अधिक पंक्तियों का प्रवासन किया है, हालांकि इसमें 10 मिनट तक डाउनटाइम से भी कम समय लग सकता है।

Percona के रूप में ऊपर

  • एक अस्थायी तालिका बनाएं
  • (, आवेषण, अद्यतन के लिए हटा देता है) बनाता है पहले मेज पर चलाता है, ताकि वे अस्थायी तालिका
  • को दोहराया जाता है एक बहुत ही इसी तरह से काम करता है
  • छोटे बैच में, विस्थापित डेटा
  • पूर्ण होने पर, नई तालिका के लिए तालिका का नाम बदलने के लिए, और अन्य तालिका
+1

यह इस तरह का सवाल है कि सबूत है कि कम मतदान या स्वीकार्य समाधान कभी-कभी सर्वोत्तम या केवल सही समाधान होते हैं। ओएमजी गलत समाधान के लिए कितने लोग मतदान करते हैं। –

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