MySQL में ibdata1 फ़ाइल को संक्षिप्त/शुद्ध कैसे करें




database innodb (6)

जॉन पी के जवाब में जोड़ना,

लिनक्स सिस्टम के लिए, इन आदेशों के साथ चरण 1-6 को पूरा किया जा सकता है:

  1. mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
  2. DROP DATABASE database_name
  3. sudo /etc/init.d/mysqld stop
  4. sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile (और किसी अन्य ib_logfile को हटाएं जिसे ib_logfile0 , ib_logfile1 आदि नाम दिया जा सकता है ...)
  5. sudo /etc/init.d/mysqld start
  6. create database [database_name]
  7. mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

चेतावनी: यदि आपके पास इस mysql उदाहरण पर अन्य डेटाबेस हैं तो ये निर्देश आपको अन्य डेटाबेस खोने का कारण बनेंगे। सुनिश्चित करें कि उन सभी डेटाबेस को कवर करने के लिए चरण 1,2 और 6,7 संशोधित किए गए हैं जिन्हें आप रखना चाहते हैं।

मैं स्थानीय स्तर पर MySQL का उपयोग आर में आंकड़े करने के लिए "क्वेरी टूल" के रूप में कर रहा हूं, यानी, जब भी मैं एक आर स्क्रिप्ट चलाता हूं, तो मैं एक नया डेटाबेस (ए) बनाता हूं, एक नई टेबल (बी) बनाता हूं, डेटा को बी में आयात करता हूं , मुझे जो चाहिए उसे प्राप्त करने के लिए एक प्रश्न सबमिट करें, और फिर मैं बी ड्रॉप और ए ड्रॉप

यह मेरे लिए ठीक काम कर रहा है, लेकिन मुझे एहसास है कि ibdata फ़ाइल का आकार तेजी से बढ़ रहा है, मैंने MySQL में कुछ भी संग्रहीत नहीं किया है, लेकिन ibdata1 फ़ाइल पहले से ही 100 एमबी से अधिक हो गई है।

मैं सेटअप के लिए कम या कम डिफ़ॉल्ट MySQL सेटिंग का उपयोग कर रहा हूं, क्या कोई निश्चित तरीका है कि मैं निश्चित अवधि के बाद ibdata1 फ़ाइल को स्वचालित रूप से संक्षिप्त / शुद्ध कर सकता हूं?


जैसा कि पहले से ही नोट किया गया है कि आप ibdata1 को कम नहीं कर सकते हैं (ऐसा करने के लिए आपको डंप और पुनर्निर्माण करने की आवश्यकता है), लेकिन अक्सर इसकी वास्तविक आवश्यकता भी नहीं होती है।

Autoextend (संभवतः सबसे आम आकार सेटिंग) का उपयोग करना ibdata1 भंडारण को रोकता है, हर बार बढ़ने पर यह लगभग पूर्ण होता है। यह तेजी से लिखता है क्योंकि अंतरिक्ष पहले ही आवंटित है।

जब आप डेटा हटाते हैं तो यह कम नहीं होता है लेकिन फ़ाइल के अंदर की जगह को अप्रयुक्त के रूप में चिह्नित किया जाता है। अब जब आप नया डेटा डालते हैं तो फ़ाइल को आगे बढ़ाने से पहले फ़ाइल में रिक्त स्थान का पुन: उपयोग किया जाएगा।

इसलिए यदि आप वास्तव में उस डेटा की आवश्यकता कर रहे हैं तो यह केवल बढ़ता जा रहा है। जब तक आपको वास्तव में किसी अन्य एप्लिकेशन के लिए जगह की आवश्यकता न हो, तब तक इसे कम करने का कोई कारण नहीं है।


उपरोक्त mysql-server व्यंजनों के एक नए संस्करण में "mysql" डेटाबेस क्रश करेगा। पुराने संस्करण में यह काम करता है। नए कुछ टेबल में टेबल प्रकार INNODB पर स्विच किया जाता है, और ऐसा करके आप उन्हें नुकसान पहुंचाएंगे। सबसे आसान तरीका है कि आप सभी डेटाबेस को डंप करें, mysql-server अनइंस्टॉल करें, my.cnf में बने रहें:

[mysqld]
innodb_file_per_table=1


erase all in /var/lib/mysql
install mysql-server
restore users and databases

वह ibdata1 कम नहीं हो रहा है MySQL की एक विशेष रूप से कष्टप्रद विशेषता है। ibdata1 फ़ाइल वास्तव में संकुचित नहीं हो सकती है जब तक आप सभी डेटाबेस हटाते हैं, फ़ाइलों को हटाते हैं और डंप को पुनः लोड करते हैं।

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

कुछ समय पहले मैंने ऐसा किया था। हालांकि, प्रत्येक सर्वर के लिए अलग-अलग फ़ाइलों का उपयोग करने के लिए अपने सर्वर को सेटअप करने के लिए आपको इसे सक्षम करने के लिए my.cnf को बदलने की आवश्यकता है:

[mysqld]
innodb_file_per_table=1

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

जैसे ही आप ibdata1 से स्पेस पुनः प्राप्त करना चाहते हैं, आपको वास्तव में फ़ाइल को हटाना होगा:

  1. mysql और performance_schema डेटाबेस को छोड़कर सभी डेटाबेस, प्रक्रियाओं, ट्रिगर आदि का एक mysqldump करें
  2. उपरोक्त 2 डेटाबेस को छोड़कर सभी डेटाबेस ड्रॉप करें
  3. MySQL बंद करो
  4. ibdata1 और ib_log फ़ाइलों को हटाएं
  5. MySQL शुरू करें
  6. डंप से बहाल करें

जब आप चरण 5 में MySQL प्रारंभ करते हैं तो ibdata1 और ib_log फ़ाइलों को पुनर्निर्मित किया जाएगा।

अब आप जाने के लिए उपयुक्त हैं। जब आप विश्लेषण के लिए एक नया डेटाबेस बनाते हैं, तो टेबल अलग-अलग ibd* फ़ाइलों में स्थित होंगे, न कि ibdata1 । जैसे ही आप आमतौर पर डेटाबेस को छोड़ देते हैं, ibd* फ़ाइलें हटा दी जाएंगी।

http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

आपने शायद यह देखा है:
http://bugs.mysql.com/bug.php?id=1341

ALTER TABLE <tablename> ENGINE=innodb का उपयोग करके ALTER TABLE <tablename> ENGINE=innodb या OPTIMIZE TABLE <tablename> कोई भी फ़ाइलों को अलग करने के लिए ibdata1 से डेटा और अनुक्रमणिका पृष्ठों को निकाल सकता है। हालांकि, जब तक आप ऊपर दिए गए कदम नहीं करते हैं, तब तक ibdata1 कम नहीं होगा।

Info_schema के बारे में, यह आवश्यक नहीं है और न ही ड्रॉप करना संभव है। यह वास्तव में केवल पढ़ने के विचारों का एक समूह है, टेबल नहीं। और उनके साथ जुड़े कोई भी फाइल नहीं हैं, यहां तक ​​कि डेटाबेस निर्देशिका भी नहीं। Informations_schema मेमोरी डीबी-इंजन का उपयोग कर रहा है और mysqld के स्टॉप / रीस्टार्ट पर गिरा दिया गया है और पुन: उत्पन्न किया गया है। https://dev.mysql.com/doc/refman/5.7/en/information-schema.html देखें।


जब आप innodb टेबल हटाते हैं, MySQL आईबडाटा फ़ाइल के अंदर की जगह को मुक्त नहीं करता है, यही कारण है कि यह बढ़ता रहता है। ये फ़ाइलें शायद ही कभी सिकुड़ती हैं।

मौजूदा ibdata फ़ाइल को कैसे संक्षिप्त करें:

http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html

आप इसे स्क्रिप्ट कर सकते हैं और स्क्रिप्ट को निश्चित अवधि के बाद चलाने के लिए शेड्यूल कर सकते हैं, लेकिन ऊपर वर्णित सेटअप के लिए ऐसा लगता है कि एकाधिक टेबलस्पेस एक आसान समाधान हैं।

यदि आप कॉन्फ़िगरेशन विकल्प innodb_file_per_table उपयोग करते हैं, तो आप एकाधिक टेबलस्पेस बनाते हैं। यही है, MySQL एक साझा फ़ाइल की बजाय प्रत्येक तालिका के लिए अलग-अलग फाइलें बनाता है। ये अलग फ़ाइलों को डेटाबेस की निर्देशिका में संग्रहीत किया जाता है, और जब आप इस डेटाबेस को हटाते हैं तो वे हटा दिए जाते हैं। यह आपके मामले में ibdata फ़ाइलों को संक्षिप्त / शुद्ध करने की आवश्यकता को हटा देना चाहिए।

एकाधिक टेबलस्पेस के बारे में अधिक जानकारी:

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html


यदि आपका लक्ष्य MySQL मुक्त स्थान की निगरानी करना है और आप MySQL को अपनी ibdata फ़ाइल को कम करने के लिए नहीं रोक सकते हैं, तो उसे तालिका स्थिति आदेशों के माध्यम से प्राप्त करें। उदाहरण:

MySQL> 5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'

MySQL <5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'

फिर इस मान की तुलना अपनी ibdata फ़ाइल से करें:

du -b ibdata1

स्रोत: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html





innodb