यह उन सबसे विवादास्पद विषयों में से एक है जो मैंने कभी-कभी एक MySQL DBA के रूप में और DBA StackExchange में निपटाए हैं।
इसे हल्के से लगाने के लिए, ibdata1 को सिकोड़ने का कोई दूसरा तरीका नहीं है । साथ innodb_file_per_table विकलांग, हर बार जब आप चलाने के OPTIMIZE TABLE
एक InnoDB मेज पर, ibdata1 तेजी से बढ़ता है। डेटा का उपयोग करना छोड़ दिया जाता है DROP TABLE
और DROP DATABASE
उन्हें वापस नहीं लाया जा सकता क्योंकि वे डीडीएल हैं, डीएमएल नहीं। मेरा मानना है कि Oracle और MSSQL DDL को रोलबैक कर सकता है। MySQL ऐसा नहीं कर सकता।
जानकारी के कई वर्ग हैं जो ibdata1 में रहते हैं
- तालिका डेटा
- टेबल इंडेक्स
- तालिका मेटाडेटा
- MVCC नियंत्रण डेटा
- डबल लिखें बफर (ओएस कैशिंग पर निर्भरता को रोकने के लिए पृष्ठभूमि लिखें)
- बफ़र सम्मिलित करें (गैर-विशिष्ट द्वितीयक अनुक्रमिकाओं में परिवर्तन का प्रबंधन)
उपयोग innodb_file_per_table=1
करने से आप ibdata1 के बाहर बनाए जा रहे टेबल डेटा और टेबल इंडेक्स के साथ नए टेबल बना सकेंगे। आप ibdata1 के अंदर किसी भी तालिकाओं को अभी भी निकाल सकते हैं ALTER TABLE ... ENGINE=InnoDB;
या इसका उपयोग कर सकते हैं, OPTIMIZE TABLE
लेकिन यह ibdata1 में उस बड़े अंतराल वाले अप्रयुक्त स्थान को छोड़ देगा।
इसके बावजूद, आपको InnoDB बुनियादी ढांचे को साफ करना चाहिए। मैंने पहले से ही StackExchange पोस्ट कैसे और क्यों ऐसा करने के लिए लिखा है:
खुशखबरी
आपको केवल डेटा को डंप करना होगा, एक बार फिर से लोड करना होगा और इस मुद्दे को फिर से नहीं बदलना होगा । OPTIMIZE TABLE
बाद में चल रहा है वास्तव में .ibd
किसी भी InnoDB तालिका के लिए टेबलस्पेस फ़ाइल सिकुड़ जाएगा ।