मैं सभी डेटाबेसों को डंप किए बिना innodb फ़ाइल ibdata1 को कैसे सिकोड़ूं?


24

InnoDB एक बड़ी फ़ाइल में सभी तालिकाओं को संग्रहीत करता है ibdata1

एक बड़ी तालिका को छोड़ने के बाद, फ़ाइल अपने आकार को बनाए रख रही है, चाहे तालिका कितनी बड़ी हो। मैं पूरे डेटाबेस को डंप और फिर से आयात किए बिना उस फ़ाइल को कैसे सिकोड़ सकता हूं (जिसमें कुल कई सौ जीबी हैं)?

मुझे लगता है कि इसका कारण यह है कि आप अभी भी ड्रापबैक को रोलबैक करने में सक्षम हैं। मेरे मामले में मुझे इसकी आवश्यकता नहीं है।

जवाबों:


30

यह उन सबसे विवादास्पद विषयों में से एक है जो मैंने कभी-कभी एक 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 तालिका के लिए टेबलस्पेस फ़ाइल सिकुड़ जाएगा ।


1
मामूली सुधार: MSSQL और PostgreSQL DDL को वापस ला सकते हैं। ओरेकल नहीं कर सकता। वास्तव में ओरेकल जब डीडीएल को देखता है तो यह एक अंतर्निहित प्रतिबद्धता जारी करता है!
क्रिस ट्रैवर्स

1
@RolandoMySQLDBA MySQL के किस संस्करण के बाद से स्वचालित सिकुड़ने वाले कार्यों की यह "अच्छी खबर" है?
गवरील

@ गैरीवेल - मुझे लगता है कि आप गलत समझते हैं। आपको अभी भी डंप करना है; ibdata1 निकालें; पुनः आरंभ करें; और पुनः लोड करें। Ibdata1 का नो-ऑटोशरिंक। (Iblog * बदलना अब सरल हो गया है।)
रिक जेम्स

2

यदि आप अपने my.cnf डिफॉल्ट फ़ाइल में निम्न सेटिंग का उपयोग नहीं करते हैं, तो InnoDB केवल ibdata1 में आपके सभी InnoDB तालिकाओं को संग्रहीत करता है:

innodb_file_per_table = 1

DROP TABLE (और DROP DATABASE) को वापस नहीं लाया जा सकता है।

यही कारण है कि आप ibdata1 को छोटा नहीं कर सकते।

यह एक संक्षिप्त विवरण है, लेकिन ibdata1 में आपके टेबल डेटा के अलावा इनोबीडी इंटर्न शामिल हैं। मेरी समझ से, इसे सिकोड़ने के लिए इसे डीफ़्रैग्मेन्ट करने की आवश्यकता होगी, जो एक समर्थित ऑपरेशन नहीं है।

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