Howto: एक mysql InnoDB भंडारण इंजन को साफ करें?


133

क्या mysql innodb स्टोरेज इंजन को साफ करना संभव है इसलिए यह डिलीट टेबल से डेटा स्टोर नहीं कर रहा है?

या क्या मुझे हर बार एक नए डेटाबेस का पुनर्निर्माण करना पड़ता है?


आपको क्या लगता है कि MySQL हटाई गई तालिकाओं से डेटा संग्रहीत कर रहा है?
रॉबर्ट मंटीनू

1
यदि मैं विशाल तालिकाओं का एक पूरा गुच्छा गिराता हूं, तो मेरी InnoDB भंडारण फाइलें सिकुड़ती नहीं हैं
ब्रायन फील्ड

जवाबों:


351

यहाँ InnoDB के संबंध में अधिक संपूर्ण उत्तर दिया गया है। यह एक लंबी प्रक्रिया का एक सा है, लेकिन प्रयास के लायक हो सकता है।

ध्यान रखें कि /var/lib/mysql/ibdata1InnoDB बुनियादी ढांचे में सबसे व्यस्त फ़ाइल है। यह आम तौर पर छह प्रकार की जानकारी रखता है:

  • तालिका डेटा
  • टेबल इंडेक्स
  • MVCC (मल्टीवेरिंग कंसीडर कंट्रोल) डेटा
    • रोलबैक सेगमेंट
    • अंतरिक्ष को पूर्ववत करें
  • तालिका मेटाडेटा (डेटा शब्दकोश)
  • डबल लिखें बफर (ओएस कैशिंग पर निर्भरता को रोकने के लिए पृष्ठभूमि लेखन)
  • बफर डालें (गैर-विशिष्ट माध्यमिक अनुक्रमित में परिवर्तन का प्रबंधन)
  • देखें Pictorial Representation of ibdata1

InnoDB वास्तुकला

InnoDB वास्तुकला

कई लोग ibdataबेहतर डिस्क-स्पेस प्रबंधन और प्रदर्शन की उम्मीद में कई फाइलें बनाते हैं , हालांकि यह विश्वास गलत है।

क्या मैं चला सकता हूँ OPTIMIZE TABLE?

दुर्भाग्य से, OPTIMIZE TABLEसाझा तालिका-स्थान फ़ाइल में संग्रहीत एक InnoDB तालिका के विरुद्ध चलने से ibdata1दो काम होते हैं:

  • तालिका का डेटा बनाता है और अंदर सन्निहित अनुक्रमित करता है ibdata1
  • बनाता ibdata1है क्योंकि सन्निहित डेटा और सूचकांक पृष्ठों से जुड़े हैंibdata1

हालाँकि, आप टेबल डेटा और टेबल इंडेक्स को अलग कर सकते हैं ibdata1और उन्हें स्वतंत्र रूप से प्रबंधित कर सकते हैं।

क्या मैं OPTIMIZE TABLEसाथ चल सकता हूं innodb_file_per_table?

मान लीजिए आप को जोड़ना innodb_file_per_tableथा /etc/my.cnf (my.ini)। क्या आप तब OPTIMIZE TABLEसभी InnoDB टेबल्स पर दौड़ सकते हैं ?

अच्छी खबर : जब आप सक्षम के OPTIMIZE TABLEसाथ दौड़ते हैं innodb_file_per_table, तो यह .ibdउस तालिका के लिए एक फ़ाइल का उत्पादन करेगा । उदाहरण के लिए, यदि आपके पास टेबल mydb.mytableविट्टा डेटादिर है /var/lib/mysql, तो यह निम्नलिखित उत्पादन करेगा:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

.ibdउस तालिका के लिए डेटा पेज और सूचकांक पृष्ठ शामिल होंगे। महान।

बुरी खबर : आपके द्वारा किए गए सभी डेटा पेजों और इंडेक्स पेजों में mydb.mytableरहने से हैं ibdata। प्रत्येक तालिका के लिए डेटा शब्दकोश प्रविष्टि, सहित mydb.mytable, अभी भी डेटा शब्दकोश में बनी हुई है (देखें ibdata1 का सचित्र प्रतिनिधित्व )। आप ibdata1इस बिंदु पर सिर्फ आवेदन प्राप्त नहीं कर सकते हैं !!! कृपया ध्यान दें कि ibdata1बिल्कुल सिकुड़ा नहीं है।

InnoDB इन्फ्रास्ट्रक्चर क्लीनअप

हटना ibdata1एक बार और सभी के लिए आप निम्न कार्य करना होगा:

  1. डंप (जैसे, mysqldumpसभी डेटाबेस) एक .sqlपाठ फ़ाइल में ( SQLData.sqlनीचे प्रयोग किया जाता है)

  2. सभी डेटाबेस को छोड़ें (के लिए mysqlऔर छोड़कर information_schema) CATAT : एहतियात के तौर पर, कृपया यह सुनिश्चित करने के लिए इस स्क्रिप्ट को चलाएं कि आपके पास सभी उपयोगकर्ता अनुदान हैं:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
  3. Mysql में लॉग इन करें और चलाएं SET GLOBAL innodb_fast_shutdown = 0;(यह पूरी तरह से शेष सभी परिवर्तन ib_logfile0और ib_logfile1)

  4. शटडाउन MySQL

  5. निम्न पंक्तियों को /etc/my.cnf(या my.iniविंडोज पर) जोड़ें

    [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

    इसके अलावा: innodb_flush_method=O_DIRECTविंडोज पर उपलब्ध नहीं है)

  6. हटाएं ibdata*और ib_logfile*, वैकल्पिक रूप से, आप सभी फ़ोल्डर को /var/lib/mysqlछोड़कर, हटा सकते हैं /var/lib/mysql/mysql

  7. प्रारंभ MySQL (यह पुन: होगा ibdata1[डिफ़ॉल्ट रूप से 10 एमबी] और ib_logfile0और ib_logfile11G पर प्रत्येक)।

  8. आयात SQLData.sql

अब, ibdata1अभी भी बढ़ेगा, लेकिन केवल तालिका मेटाडेटा होगा क्योंकि प्रत्येक InnoDB तालिका के बाहर मौजूद होगा ibdata1ibdata1अब अन्य तालिकाओं के लिए InnoDB डेटा और अनुक्रमित नहीं होंगे।

उदाहरण के लिए, मान लें कि आपके पास एक InnoDB तालिका है जिसका नाम है mydb.mytable। यदि आप देखते हैं /var/lib/mysql/mydb, तो आपको तालिका का प्रतिनिधित्व करने वाली दो फाइलें दिखाई देंगी:

  • mytable.frm (भंडारण इंजन हैडर)
  • mytable.ibd (टेबल डेटा और इंडेक्स)

में innodb_file_per_tableविकल्प के साथ /etc/my.cnf, आप चला सकते हैं OPTIMIZE TABLE mydb.mytableऔर फ़ाइल /var/lib/mysql/mydb/mytable.ibdवास्तव में सिकुड़ जाएगी।

मैंने अपने करियर में कई बार MySQL DBA के रूप में ऐसा किया है। वास्तव में, पहली बार जब मैंने ऐसा किया, तो मैंने केवल ५०० एमबी में ५० जीबी की ibdata1 फ़ाइल को नीचे कर दिया!

कोशिश करो। यदि आपके पास इस पर और प्रश्न हैं, तो बस पूछें। मुझ पर विश्वास करो; यह छोटी अवधि के साथ-साथ लंबी दौड़ में काम करेगा।

चेतावनी

चरण 6 पर, यदि mysqlस्कीमा के शुरू होने के कारण mysql पुनः आरंभ नहीं हो सकता है, तो चरण 2 को देखें। आपने mysqlस्कीमा की भौतिक प्रतिलिपि बनाई है । आप इसे इस प्रकार पुनर्स्थापित कर सकते हैं:

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

चरण 6 पर वापस जाएं और जारी रखें

UPDATE 2013-06-04 11:13 EDT

Innodb_log_file_size को 25% innodb_buffer_pool_size में सेट करने के संबंध में, चरण 5 में, यह कंबल नियम नहीं बल्कि पुराना स्कूल है।

पर वापस July 03, 2006, Percona एक अच्छा लेख क्यों एक उचित innodb_log_file_size चुनने के लिए था । बाद में, Nov 21, 2008पेरकोना ने एक और लेख के साथ पालन किया कि कैसे एक घंटे के बदलाव को ध्यान में रखते हुए चोटी के कार्यभार के आधार पर उचित आकार की गणना की जाए

मेरे पास DBA StackExchange में लॉग आकार की गणना करने के बारे में लिखित पोस्ट हैं और जहां मैंने उन दो पेरकोना लेखों का संदर्भ दिया है।

व्यक्तिगत रूप से, मैं अभी भी प्रारंभिक सेटअप के लिए 25% नियम के साथ जाऊंगा। फिर, जैसा कि काम का बोझ अधिक सटीक हो सकता है उत्पादन में समय के साथ निर्धारित किया जाता है, आप कुछ ही मिनटों में रखरखाव चक्र के दौरान लॉग का आकार बदल सकते हैं


9
मैंने भी बहुत प्रभाव के लिए innodb_file_per_table विकल्प का उपयोग किया है, एक सर्वर पर 200 तालिकाओं के साथ 200 डेटाबेस होने पर, मैं अलग-अलग विभाजनों पर अंतर डेटाबेस को सहानुभूति देने में सक्षम था, इसलिए अधिक आईओ बफ़र और स्पिंडल का उपयोग करना जो अन्यथा उपलब्ध होता है :)
डेव रिक्स

2
innodb_open_tablesयदि आवश्यक हो तो @SDDowney BTW को याद रखें । डिफ़ॉल्ट 300 है।
रोलैंडमाइसीडीडीबीए

2
@ giorgio79 आपको अपने बल्क इंसर्ट को बड़े मूल्य पर सेट करना होगा। यह लाभप्रद है। मैं आपके प्रश्न का सार मेरे उत्तर में जोड़ दूंगा।
रोलैंडम्यूसीडीडीबीए

3
32 बिट सिस्टम में innodb_buffer_pool_size के लिए एक 4Gb मान की अनुमति नहीं है। मैसकल चुपचाप निर्दोष विकलांगों के साथ शुरू होगा और बहाल की गई मेजों को मायसम में बदल दिया जाएगा। इसे ठीक करने के लिए थोड़े छोटे मूल्य का उपयोग करें।
डेविड

5
अच्छे भगवान। मैं सिर्फ यह कहना चाहता हूं कि यह शायद सबसे अच्छा जवाबों में से एक है जो मैंने एसओ डेमन फाइन जॉब पर देखा है। जब मुझे 154g db आयात करने पर ERROR 2013 (HY000) मिल रहा था, तब मैंने अपनी समस्या का हल निकालने में मदद की। उत्कृष्ट उत्तर के लिए धन्यवाद!
जोश ब्राउन

4

InnoDB इंजन हटाए गए डेटा को संग्रहीत नहीं करता है। जब आप पंक्तियाँ डालते और हटाते हैं, तो अप्रयुक्त स्थान को InnoDB संग्रहण फ़ाइलों के भीतर आवंटित किया जाता है। समय के साथ, समग्र स्थान कम नहीं होगा, लेकिन समय के साथ 'हटाए गए और मुक्त' किए गए स्थान का DB सर्वर द्वारा स्वचालित रूप से पुन: उपयोग किया जाएगा।

आप तालिकाओं के मैन्युअल री-ऑर्ग के माध्यम से इंजन द्वारा उपयोग किए जाने वाले स्थान को ट्यून और आगे बढ़ा सकते हैं। ऐसा करने के लिए, mysqldump का उपयोग करके प्रभावित तालिकाओं में डेटा डंप करें, तालिकाओं को छोड़ें, mysql सेवा को पुनरारंभ करें, और फिर डंप फ़ाइलों से तालिकाओं को फिर से बनाएँ।

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