क्या mysql innodb स्टोरेज इंजन को साफ करना संभव है इसलिए यह डिलीट टेबल से डेटा स्टोर नहीं कर रहा है?
या क्या मुझे हर बार एक नए डेटाबेस का पुनर्निर्माण करना पड़ता है?
क्या mysql innodb स्टोरेज इंजन को साफ करना संभव है इसलिए यह डिलीट टेबल से डेटा स्टोर नहीं कर रहा है?
या क्या मुझे हर बार एक नए डेटाबेस का पुनर्निर्माण करना पड़ता है?
जवाबों:
यहाँ InnoDB के संबंध में अधिक संपूर्ण उत्तर दिया गया है। यह एक लंबी प्रक्रिया का एक सा है, लेकिन प्रयास के लायक हो सकता है।
ध्यान रखें कि /var/lib/mysql/ibdata1InnoDB बुनियादी ढांचे में सबसे व्यस्त फ़ाइल है। यह आम तौर पर छह प्रकार की जानकारी रखता है:
Pictorial Representation of ibdata1
कई लोग ibdataबेहतर डिस्क-स्पेस प्रबंधन और प्रदर्शन की उम्मीद में कई फाइलें बनाते हैं , हालांकि यह विश्वास गलत है।
OPTIMIZE TABLE?दुर्भाग्य से, OPTIMIZE TABLEसाझा तालिका-स्थान फ़ाइल में संग्रहीत एक InnoDB तालिका के विरुद्ध चलने से ibdata1दो काम होते हैं:
ibdata1ibdata1है क्योंकि सन्निहित डेटा और सूचकांक पृष्ठों से जुड़े हैं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बिल्कुल सिकुड़ा नहीं है।
हटना ibdata1एक बार और सभी के लिए आप निम्न कार्य करना होगा:
डंप (जैसे, mysqldumpसभी डेटाबेस) एक .sqlपाठ फ़ाइल में ( SQLData.sqlनीचे प्रयोग किया जाता है)
सभी डेटाबेस को छोड़ें (के लिए 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_grantsMysql में लॉग इन करें और चलाएं SET GLOBAL innodb_fast_shutdown = 0;(यह पूरी तरह से शेष सभी परिवर्तन ib_logfile0और ib_logfile1)
शटडाउन MySQL
निम्न पंक्तियों को /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विंडोज पर उपलब्ध नहीं है)
हटाएं ibdata*और ib_logfile*, वैकल्पिक रूप से, आप सभी फ़ोल्डर को /var/lib/mysqlछोड़कर, हटा सकते हैं /var/lib/mysql/mysql।
प्रारंभ MySQL (यह पुन: होगा ibdata1[डिफ़ॉल्ट रूप से 10 एमबी] और ib_logfile0और ib_logfile11G पर प्रत्येक)।
आयात SQLData.sql
अब, ibdata1अभी भी बढ़ेगा, लेकिन केवल तालिका मेटाडेटा होगा क्योंकि प्रत्येक InnoDB तालिका के बाहर मौजूद होगा ibdata1। ibdata1अब अन्य तालिकाओं के लिए 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 पर वापस जाएं और जारी रखें
Innodb_log_file_size को 25% innodb_buffer_pool_size में सेट करने के संबंध में, चरण 5 में, यह कंबल नियम नहीं बल्कि पुराना स्कूल है।
पर वापस July 03, 2006, Percona एक अच्छा लेख क्यों एक उचित innodb_log_file_size चुनने के लिए था । बाद में, Nov 21, 2008पेरकोना ने एक और लेख के साथ पालन किया कि कैसे एक घंटे के बदलाव को ध्यान में रखते हुए चोटी के कार्यभार के आधार पर उचित आकार की गणना की जाए ।
मेरे पास DBA StackExchange में लॉग आकार की गणना करने के बारे में लिखित पोस्ट हैं और जहां मैंने उन दो पेरकोना लेखों का संदर्भ दिया है।
Aug 27, 2012: 48 जीबी रैम के साथ सर्वर पर 30GB इनोबीडी टेबल के लिए उचित ट्यूनिंगJan 17, 2013: MySQL 5.5 - Innodb - innodb_log_file_size 4GB से अधिक संयुक्त?व्यक्तिगत रूप से, मैं अभी भी प्रारंभिक सेटअप के लिए 25% नियम के साथ जाऊंगा। फिर, जैसा कि काम का बोझ अधिक सटीक हो सकता है उत्पादन में समय के साथ निर्धारित किया जाता है, आप कुछ ही मिनटों में रखरखाव चक्र के दौरान लॉग का आकार बदल सकते हैं ।
innodb_open_tablesयदि आवश्यक हो तो @SDDowney BTW को याद रखें । डिफ़ॉल्ट 300 है।
InnoDB इंजन हटाए गए डेटा को संग्रहीत नहीं करता है। जब आप पंक्तियाँ डालते और हटाते हैं, तो अप्रयुक्त स्थान को InnoDB संग्रहण फ़ाइलों के भीतर आवंटित किया जाता है। समय के साथ, समग्र स्थान कम नहीं होगा, लेकिन समय के साथ 'हटाए गए और मुक्त' किए गए स्थान का DB सर्वर द्वारा स्वचालित रूप से पुन: उपयोग किया जाएगा।
आप तालिकाओं के मैन्युअल री-ऑर्ग के माध्यम से इंजन द्वारा उपयोग किए जाने वाले स्थान को ट्यून और आगे बढ़ा सकते हैं। ऐसा करने के लिए, mysqldump का उपयोग करके प्रभावित तालिकाओं में डेटा डंप करें, तालिकाओं को छोड़ें, mysql सेवा को पुनरारंभ करें, और फिर डंप फ़ाइलों से तालिकाओं को फिर से बनाएँ।