मेरे पास इसके लिए पूरा उत्तर है।
एक बार innodb_file_per_table को डाल दिया जाता है, और नई InnoDB तालिकाओं ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
को सिकोड़ कर उपयोग किया जा सकता है। यह नई .ibd
फाइलों को सिकोड़ देगी ।
यदि आप ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
innodb_file_per_table का उपयोग करने से पहले बनाई गई एक InnoDB तालिका पर चलते हैं, तो यह उस तालिका के लिए डेटा और अनुक्रमित को ibdata1 फ़ाइल से बाहर निकाल देगा और इसे एक .ibd
फ़ाइल में संग्रहीत करेगा, यह ibdata1 में एक स्थायी कबूतर छोड़ देगा जिसे कभी भी उपयोग नहीं किया जा सकता है ।
ibdata1
फ़ाइल सामान्य रूप से जानकारी के चार प्रकार घरों
यहाँ ibdata1 फ़ाइल को बहुत अधिक हमेशा के लिए सिकोड़ने का गारंटीकृत तरीका है ...
STEP 01) MySQLDump को सभी डेटाबेसों को SQL टेक्स्ट फाइल (SQLData.sql पर कॉल करें)
चरण 02) सभी डेटाबेस (mysql, info_schema और performance_schema स्कीमा को छोड़कर)
STEP 03) शटडाउन mysql
चरण 04) निम्नलिखित पंक्तियों को /etc/my.cnf में जोड़ें
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
सिडेनोट: आपका जो भी सेट innodb_buffer_pool_size के लिए है, सुनिश्चित करें कि innodb_log_file_size 25% innodb_buffer_pool_size है।
- चरण 05) ibdata1, ib_logfile0 और ib_logfile1 हटाएं ( हटाने से पहले अद्यतन देखें! )
इस बिंदु पर, केवल / var / lib / mysql में mysql स्कीमा होना चाहिए
- STEP 06) mysql को पुनरारंभ करें
यह 10 एमबी पर ibdata1 को फिर से बनाएगा (विकल्प को कॉन्फ़िगर न करें), ib_logfile0 और ib_logfile1 प्रत्येक 1G पर
- STEP 07) SQLData.sql को mysql में पुनः लोड करें
ibdata1
बढ़ेगा, लेकिन केवल टेबल मेटाडेटा और आंतरायिक MVCC डेटा होगा।
प्रत्येक InnoDB टेबल के बाहर मौजूद होगा ibdata1
मान लीजिए कि आपके पास mydb.mytable नाम की एक InnoDB तालिका है। यदि आप अंदर जाते हैं /var/lib/mysql/mydb
, तो आपको तालिका का प्रतिनिधित्व करने वाली दो फाइलें दिखाई देंगी
mytable.frm
(भंडारण इंजन हैडर)
mytable.ibd
(घर के लिए टेबल डेटा और टेबल इंडेक्स का mydb.mytable
)
ibdata1
अब कभी भी InnoDB डेटा और इंडेक्स शामिल नहीं होंगे।
में innodb_file_per_table विकल्प के साथ /etc/my.cnf
, आप OPTIMIZE TABLE mydb.mytable
OR को चला सकते हैं ALTER TABLE mydb.mytable ENGINE=InnoDB;
और फ़ाइल /var/lib/mysql/mydb/mytable.ibd
वास्तव में सिकुड़ जाएगी।
मैंने अपने करियर में कई बार MySQL DBA के बिना एक ही समस्या के बिना ऐसा किया है। वास्तव में, पहली बार मैंने ऐसा किया था, मैंने 50 एमबी में 50 जीबी ibdata1 फ़ाइल को ढहा दिया।
कोशिश तो करो। यदि आपके पास इस पर और प्रश्न हैं, तो मुझे ईमेल करें। मुझ पर विश्वास करो। यह छोटी अवधि में और लंबी दौड़ में काम करेगा।
अद्यतन 2013-07-02 15:08 EDT
इस संबंध में मेरे पास एक चेतावनी है जिसे मैंने अपने अन्य पदों में अपडेट किया है, लेकिन मैं इससे चूक गया: मैं अपने उत्तर को innodb_fast_shutdown के साथ थोड़ा और अपडेट कर रहा हूं क्योंकि मैं mysql को पुनरारंभ करता था और ऐसा करने के लिए mysql को रोकता था। अब, यह एक-कदम महत्वपूर्ण है क्योंकि प्रत्येक लेनदेन में जो भी लेनदेन हो सकता है, उसके अंदर और बाहर चलने वाले अन्य भाग हो सकते हैं, जो कि InnoDB लेनदेन लॉग्स ( InnoDB इन्फ्रास्ट्रक्चर देखें ) के बाहर हैं।
कृपया ध्यान दें कि innodb_fast_shutdown को 2 पर सेट करने से लॉग साफ़ हो जाते हैं, लेकिन अधिक चलने वाले हिस्से अभी भी मौजूद हैं और mysqld के स्टार्टअप के दौरान क्रैश रिकवरी पर उठाया गया है। 0 की सेटिंग सबसे अच्छी है।