ध्यान रखें कि InnoDB इन्फ्रास्ट्रक्चर में व्यस्ततम फ़ाइल / var / lib / mysql / ibdata1 है
यह फ़ाइल सामान्य रूप से कई वर्गों की जानकारी रखती है (जब innodb_file_per_table 0 है)
- तालिका डेटा
- टेबल इंडेक्स
- MVCC (मल्टीवेरिंग कंसीडर कंट्रोल) डेटा
- रोलबैक सेगमेंट
- टेबल्स को पूर्ववत करें
- टेबल मेटाडेटा
- देखें चित्रात्मक प्रतिनिधित्व
कई लोग बेहतर डिस्स्पेस प्रबंधन और प्रदर्शन की उम्मीद में कई ibdata फाइलें बनाते हैं। यह मदद नहीं करता है।
दुर्भाग्य से, ibdata1 में संग्रहीत एक InnoDB टेबल के खिलाफ OPTIMIZE टेबल दो काम करता है:
- तालिका का डेटा बनाता है और ibdata1 के अंदर सन्निहित अनुक्रमित करता है
- यह ibdata1 को विकसित करता है क्योंकि सन्निहित डेटा को ibdata1 से जोड़ा जाता है
आप ibdata1 से टेबल डेटा और टेबल इंडेक्स को अलग कर सकते हैं और उन्हें स्वतंत्र रूप से innodb_file_per_table का उपयोग करके प्रबंधित कर सकते हैं । Ibdata1 को एक बार और सभी के लिए सिकोड़ने के लिए आपको निम्नलिखित कार्य करने चाहिए
चरण 01) MySQLDump को सभी डेटाबेसों को SQL टेक्स्ट फ़ाइल (इसे SQLData.sql कहें) ( अधिक विवरण यहाँ )
चरण 02) (छोड़कर सभी डेटाबेस ड्रॉप mysql
, performance_schema
और information_schema
)
चरण 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_buffer_pool_size के लिए है, सुनिश्चित करें कि innodb_log_file_size 25% innodb_buffer_pool_size है।
चरण 05) ibdata1, ib_logfile0 और ib_logfile1 हटाएं
इस बिंदु पर, केवल / var / lib / mysql में mysql स्कीमा होना चाहिए
चरण 06) mysql को पुनरारंभ करें
यह ibdata1 को 10MB, ib_logfile0 पर और ib_logfile1 को 1G पर पुनः बनाएगा
चरण ० Rel ) SQLData.sql को mysql में पुनः लोड करें
ibdata1 बढ़ेगा लेकिन इसमें केवल टेबल मेटाडेटा होगा
प्रत्येक InnoDB तालिका ibdata1 के बाहर मौजूद होगी
मान लीजिए कि आपके पास mydb.mytable नाम की एक InnoDB तालिका है। यदि आप / var / lib / mysql / mydb में जाते हैं, तो आपको तालिका का प्रतिनिधित्व करने वाली दो फाइलें दिखाई देंगी
- mytable.frm (स्टोरेज इंजन हैडर)
- mytable.ibd (mydb.mytable के लिए टेबल डेटा और टेबल इंडेक्स का घर)
ibdata1 में अब InnoDB डेटा और इंडेक्स शामिल नहीं होंगे।
/Etc/my.cnf में innodb_file_per_table विकल्प के साथ, आप चला सकते हैं OPTIMIZE TABLE mydb.mytable
और फ़ाइल /var/lib/mysql/mydb/mytable.ibd
वास्तव में सिकुड़ जाएगी।
मैंने अपने करियर में कई बार MySQL DBA के रूप में ऐसा किया है
वास्तव में, पहली बार मैंने ऐसा किया, मैंने ५० जीबी ibdata1 फ़ाइल को ५०० एमबी में ढहा दिया।
कोशिश करो। यदि आपके पास इस पर और प्रश्न हैं, तो मुझे ईमेल करें। मुझ पर विश्वास करो। यह छोटी अवधि में और लंबी दौड़ में काम करेगा। !!!
यदि आप यह देखना चाहते हैं कि MyISAM और InnoDB में कितना वास्तविक डेटा संग्रहीत है, तो कृपया यह क्वेरी चलाएँ:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;