2008-09-29 13 views
11

mysql5.0 डेटाबेस की एक जोड़ी "ए" और "बी", दोनों बड़े innodb तालिकाओं के साथ। "डेटाबेस ए ड्रॉप करें;" कुछ मिनट के लिए डेटाबेस "बी" जमा करता है। उस बिंदु पर "ए" का उपयोग नहीं कर रहा है, तो यह इतना गहन ऑपरेशन क्यों है?mysql "ड्रॉप डेटाबेस" समय लगता है - क्यों?

बोनस अंक: यह देखते हुए कि हम "ए" का उपयोग करते हैं, "बी" में डेटा अपलोड करते हैं, और फिर "बी" का उपयोग करने के लिए स्विच करते हैं, हम इसे तेजी से कैसे कर सकते हैं? ड्रॉप-डाउन डेटाबेस ऐसी चीज नहीं है जो आम तौर पर हर समय करना पड़ता है, इसलिए यह चार्ट से थोड़ी दूर है।

+0

मेरे पास एक समान समस्या है, लेकिन अन्य डेटाबेस परिचालन में थे। समाधान इस डेटाबेस का उपयोग कर अन्य सभी प्रक्रियाओं को मारना था क्योंकि वे इसे लॉक कर रहे थे (संभवतः उस डेटाबेस को चुनकर, जिसे वे सो रहे थे)। – GDR

उत्तर

13

तो मुझे यकीन नहीं है कि Matt Rogish's answer 100% की सहायता करने जा रहा है।

समस्या

कि MySQL *, एक म्युटेक्स (परस्पर अनन्य ताला) के आसपास उद्घाटन और समापन टेबल है ताकि मूल रूप से मतलब है कि अगर एक मेज बंद कर दिया/नष्ट कर दिया जा रहा है की प्रक्रिया में है, कोई अन्य तालिकाओं खोला जा सकता है है ।

यह मेरा एक सहयोगी यहाँ द्वारा वर्णित है: http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/

एक उत्कृष्ट प्रभाव में कमी रणनीति XFS की तरह एक फाइल सिस्टम का प्रयोग है।

कामकाज बदसूरत है। उन्हें अनिवार्य रूप से उन्हें छोड़ने से पहले तालिकाओं में सभी डेटा को दूर करना होगा (ऊपर दिए गए लिंक पर टिप्पणी # 11 देखें)।

+0

तो आपने लॉकिंग तंत्र की व्याख्या की है और यह सब समझ में आता है ... लेकिन 'क्यों' अभी भी उत्तर नहीं दिया गया है। लिनक्स में फ़ाइलों का एक गुच्छा हटाने में बहुत लंबा समय नहीं लगता है। तो मुझे लगता है कि हुड के नीचे कुछ और जटिल चल रहा है। यदि ऐसा है, तो ऐसा क्यों करता है कि यह कुछ सेकंड में अपनी फ़ाइलों को हटाने और 'बिंगो' को हटाने का विरोध करता है ... सभी तालिकाएं गिरा दी गईं? – Jeach

+1

एफएस धीमी हटाने के अलावा एक और कारण है - यदि कोई बहुत बड़ा बफर पूल है, तो तालिका के सभी पृष्ठों को बेदखल करने के लिए एक फ्रीज हो सकता है। यह "आलसी" मुक्त विधि के साथ शायद 5.5/5.6 में सुधार हुआ था। –

6

डिफ़ॉल्ट रूप से, किसी दिए गए mysql सर्वर स्थापना में सभी innodb डेटाबेस डेटा फ़ाइलों के समान भौतिक पूल का उपयोग करते हैं, इसलिए अनुमानित रूप से "डेटाबेस ए ड्रॉप करें" डेटाबेस बी को प्रभावित कर सकता है। चूंकि "ड्रॉप डेटाबेस" में भारी पुनर्वितरण शामिल होने की संभावना है innodb डेटा फ़ाइलों, यह कल्पना की जा सकती है कि यह एक अवरुद्ध ऑपरेशन है, या तो ऑपरेशन की तीव्रता, या डिजाइन द्वारा।

हालांकि, मुझे लगता है कि आप प्रत्येक डेटाबेस को विभिन्न भौतिक फाइलों का उपयोग कर सकते हैं, हालांकि मैंने स्वयं को यह कोशिश नहीं की है, इसलिए आपको अपने लिए विशिष्टताओं को समझना होगा। उसमें विफल होने के बाद, आपको एक ही मशीन पर दो अलग-अलग mysql इंस्टॉल्स को साइड-बाय-साइड का उपयोग करने की आवश्यकता हो सकती है, जो पूरी तरह से करने योग्य है।

11

skaffman के बंद के बाद:

बदलें अपनी my.cnf (और MySQL पुनः आरंभ) शामिल करने के लिए:

innodb_file_per_table = 1 

(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)

यह अपने डेटाबेस समर्पित फ़ाइल भंडारण देने के लिए और ले जाएगा यह साझा पूल से बाहर है। इसके बाद यह आपको मजेदार चीजें करने की सुविधा देगा जैसे अलग-अलग भौतिक डिस्क पर टेबल/इंडेक्स को स्थानांतरित करने के लिए I/O को आगे बढ़ाएं और प्रदर्शन में सुधार करें।

ध्यान दें कि यह मौजूदा तालिकाओं को नहीं बदलता है; आपको अपनी फ़ाइल में प्राप्त करने के लिए काम करना होगा (http://capttofu.livejournal.com/11791.html)।

+1

मुझे लगता है कि I/O विभाजित करने के लिए innodb_file_per_table = 1 का उपयोग करने की उपयोगिता को ओवरस्टेट करें - RAID एक बेहतर विकल्प है। क्यों: डेटा डायरेक्ट्री नामक क्रिएट टेबल विकल्प इनो डीबी द्वारा समर्थित नहीं है। मैं एक अलग मेज को दूसरे विभाजन में ले जाना चाहता हूं, मुझे मूल स्थान पर सिम्लिंक का उपयोग करना होगा। जैसे ही आप एक अल्टर टेबल कमांड चलाते हैं, सिल्लिंक नष्ट हो जाता है और तालिका को वापस मूल स्थान पर ले जाया जाता है। –

+0

मुझे आश्चर्य है कि यह एकल विकल्प इतना बड़ा अंतर बनाता है। आप एक जीवन बचतकर्ता हैं! –

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

  • कोई संबंधित समस्या नहीं^_^