Mysql में ibdata के आकार को कम करने का सबसे अच्छा तरीका क्या है?


63

मेरे पास कुछ उत्पादन सर्वर हैं जिनकी ibdataफाइलें दिन-प्रतिदिन आकार में बढ़ती जाती हैं।

इसने पहले ही 290GB जगह का उपभोग किया है।

सर्वर में टेबल ज्यादातर InnoDB हैं और उच्च पढ़ने और लिखने के अनुरोध हैं।

लॉग फ़ाइल का आकार भी बढ़ रहा है। टेबल्स में बड़ी मात्रा में डेटा है।

मैं दोनों के बढ़ते आकार को कैसे नियंत्रित कर सकता हूं?

मैं उपयोग नहीं कर रहा हूं innodb_file_per_table

जवाबों:


104

ध्यान रखें कि 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;

यहां तक ​​कि my.cnf (जो कि मेरे पास पहले से है) के लिए सुझाए गए सेटिंग्स के साथ, ib_logfile0 और 1 को हटाना और फिर mysql शुरू करना, नई फाइलें बनाई जाती हैं और सेकंड के भीतर वे डेटाबेस के आकार के बराबर बढ़ जाती हैं जैसा कि आपके उपरोक्त क्वेरी द्वारा प्रदर्शित होता है। सुनिश्चित नहीं है कि अगर mysql सभी तालिकाओं और अनुक्रमित को इन फ़ाइलों में कॉपी कर रहा है, जबकि प्रत्येक तालिका को एक अलग फ़ाइल में बनाए रखना भी है।
एलन किंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.