क्यों सभी MySQL InnoDB टेबल खंडित हैं?


10

जब मैं mysqltuner चलाते हैं, तो किसी कारण से, MySQL सर्वर में सभी InnoDB टेबल को खंडित किया जा रहा है। मैंने केवल कुछ घंटों पहले (ओएसएक्स लायन पर) सर्वर स्थापित किया था, और इसमें बैच फ़ाइलों से आयातित ताजा डेटा का एक गुच्छा है।

मैंने एक डेटाबेस में सभी तालिकाओं को MYISAM में बदलने की कोशिश की, और निश्चित रूप से खंडित तालिकाओं की संख्या काफी कम हो गई। अजीब बात है, हालांकि, जैसे ही मैंने उन तालिकाओं को वापस InnoDB में बदल दिया, खंडित तालिका गणना ने फिर से वापस गोली मार दी। यह अब तक के मेरे शोध के विपरीत है जो बताता है कि रनिंग ALTER TABLE table_name ENGINE=INNODB;को विखंडन को ठीक करना चाहिए।

थोड़ी सी गुग्लिंग के बाद मैं भागा:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

जो कथित रूप से सभी खंडित तालिकाओं को सूचीबद्ध करता है (यह वास्तव में खंडित तालिका के लिए mysqltuner आउटपुट के समान परिणाम लौटाता है)। प्रत्येक एकल प्रविष्टि के data_free_MBस्तंभ में ठीक उसी संख्या है (वर्तमान में 7.00000000)।

यह वास्तव में एक वास्तविक समस्या है या कुछ mysqltuner गलत कर रहा है? यदि यह एक समस्या है, तो मैं इसे कैसे ठीक करूं?

संपादित करें

मुझे अधिक से अधिक संदेह हो रहा है कि मैं एक बेवकूफ हूं और यह कि 7MB का विखंडन पूरी फाइल के लिए है, प्रत्येक तालिका के लिए नहीं। क्या कोई पुष्टि कर सकता है कि मामला क्या होगा?


क्या आपको वास्तव में लगता है कि 7 मुफ्त एमबी एक समस्या है?
डेविड श्वार्ट्ज

@DavidSchwartz कोई सुराग नहीं, इसीलिए मैंने पूछा;) 2314 टेबलें हैं, जिनमें से प्रत्येक में 7MB मुफ्त है, और मुझे नहीं पता कि इसका क्या मतलब है। मुझे यकीन नहीं है कि क्यों mysqltuner मुझे वह आंकड़ा दिखाएगा यदि यह चिंता का संभावित कारण नहीं था। मैं उम्मीद कर रहा था कि कोई व्यक्ति मुझे यह बताने में सक्षम हो सकता है कि नंबर देने के लिए कितना चिंतित है, और समस्या को कम करने के लिए मैं क्या कर सकता हूं क्योंकि 'मानक' तरीके काम नहीं करते हैं
क्लाइव

एक झंडे में उपयोगकर्ता के अनुरोध के अनुसार इस प्रश्न को माइग्रेट करना।
डैनियल बेक

अधिकांश विवरण mysqltuner शो केवल जानकारी के लिए है। सब कुछ एक समस्या नहीं है। यदि यह एक समस्या है तो यह स्पष्ट रूप से ऐसा कहेगा। क्या यह एक समस्या के रूप में इंगित किया गया था?
जॉन गार्डनियर्स

@ जॉनगार्डियर्स मेरा मानना ​​है कि, यह संदेश है: [!!] Total fragmented tables: 2314जो कि मुझे पूरा यकीन है कि एक समस्या को इंगित करता है (दोहरे लाल विस्मयादिबोधक चिह्न के साथ)
क्लाइव

जवाबों:


5

ऊपर मेरी टिप्पणियों के अनुसार, sqltuner से सभी आउटपुट त्रुटियों को इंगित नहीं करते हैं। जब तक स्क्रिप्ट बहुत स्पष्ट रूप से नहीं बताती है कि यह एक समस्या है, आमतौर पर अगली पंक्ति में, इसके बाद उपशमन के लिए सुझाव दिए जाते हैं, तो यह केवल एक सूचना आइटम है।


3

जब आप innodb_file_per_table को सक्षम करते हैं , तो आपने जो भी किया था, वह एक प्रोटोकॉल था जो किसी भी नई InnoDB टेबल को बाहरी .ibdफ़ाइल में बनाने के लिए तैयार किया गया था । इससे पहले आपके द्वारा बनाए गए सभी InnoDB टेबल अभी भी ibdata1 में imbedded हैं।

Innodb_file_per_table अक्षम होने के साथ, किसी भी समय आप चलाते हैं

ALTER TABLE table_name ENGINE=INNODB;

यह सब करता है तालिका के डेटा और सूचकांक पृष्ठों को ibdata1 में जोड़ देता है। यह तालिका को सन्निहित पृष्ठों में मौजूद कर देगा और विखंडन को हटा देगा, नकारात्मक पक्ष यह है कि ibdata1 जल्दी से बढ़ता है।

सिफ़ारिश करना

आपको ibdata1, ib_logfile0, ib_logfile1, और पुनः लोड करने के लिए सभी डेटा निर्यात करने की आवश्यकता होगी।

मैंने लिखा कि यह कैसे और क्यों करना है

UPDATE 2012-08-15 12:05 EDT

आप स्वयं mysqltuner.pl स्क्रिप्ट को देखना चाह सकते हैं। IMHO मुझे लगता है कि यह विखंडन को मापने के लिए एक पुराने सूत्र का उपयोग कर रहा है। सुनिश्चित करें कि आपके पास mysqltuner का नवीनतम संस्करण है।

बाह्य रूप से संग्रहीत InnoDB तालिकाओं के विखंडन को मापने के लिए, मैंने 11 अप्रैल, 2012 को उस पोस्ट के बारे में एक पोस्ट लिखी थी (19 अप्रैल, 2012 के तल पर अपडेट देखें)


1
आह, ठीक है, अब बहुत कुछ समझ में आता है, धन्यवाद। मैंने डेटा निर्यात करना पूरी तरह से समाप्त कर दिया, फिर MySQL को पूरी तरह से मिटा दिया, फिर रीइंस्टॉल कर रहा था (लेकिन innodb_file_per_tableसर्वर को शुरू करने से पहले और फिर से आयात कर रहा है)। इससे पहले मुझे हर तरह की इनोबीडी त्रुटियां मिल रही थीं (वास्तव में बुरे प्रकार की ... जिनका मतलब था कि मुझे innodb_force_recovery6 स्तर पर सिर्फ डेटा प्राप्त करने के लिए दौड़ना होगा!), और सभी प्रकार की 'लॉग फाइल तिथि' में है! भविष्य!' त्रुटियों। वे अब बंद कर दिया है लगता है, लेकिन मैं अभी भी एक निष्पक्ष कुछ खंडित टेबल मिल गया है। मैं बस इस पर अपनी नज़र रखूंगा, इनपुट के लिए फिर से धन्यवाद
क्लाइव

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