क्या mysql innodb स्टोरेज इंजन को साफ करना संभव है इसलिए यह डिलीट टेबल से डेटा स्टोर नहीं कर रहा है?
या क्या मुझे हर बार एक नए डेटाबेस का पुनर्निर्माण करना पड़ता है?
क्या mysql innodb स्टोरेज इंजन को साफ करना संभव है इसलिए यह डिलीट टेबल से डेटा स्टोर नहीं कर रहा है?
या क्या मुझे हर बार एक नए डेटाबेस का पुनर्निर्माण करना पड़ता है?
जवाबों:
यहाँ InnoDB के संबंध में अधिक संपूर्ण उत्तर दिया गया है। यह एक लंबी प्रक्रिया का एक सा है, लेकिन प्रयास के लायक हो सकता है।
ध्यान रखें कि /var/lib/mysql/ibdata1
InnoDB बुनियादी ढांचे में सबसे व्यस्त फ़ाइल है। यह आम तौर पर छह प्रकार की जानकारी रखता है:
Pictorial Representation of ibdata1
कई लोग 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
बिल्कुल सिकुड़ा नहीं है।
हटना 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_grants
Mysql में लॉग इन करें और चलाएं 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_logfile1
1G पर प्रत्येक)।
आयात 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 सेवा को पुनरारंभ करें, और फिर डंप फ़ाइलों से तालिकाओं को फिर से बनाएँ।