यहाँ InnoDB के संबंध में अधिक संपूर्ण उत्तर दिया गया है। यह थोड़ी लंबी प्रक्रिया है, लेकिन प्रयास के लायक हो सकती है।
ध्यान रखें कि /var/lib/mysql/ibdata1
InnoDB अवसंरचना में सबसे व्यस्त फ़ाइल है। इसमें आम तौर पर छह प्रकार की जानकारी होती है:
- टेबल डेटा
- टेबल इंडेक्स
- एमवीसीसी (मल्टीवर्जनिंग कंसुरेंसी कंट्रोल)
डेटा
- रोलबैक सेगमेंट
- अंतरिक्ष पूर्ववत करें
- टेबल मेटाडेटा (डेटा डिक्शनरी)
- डबल राइट बफर (ओएस कैशिंग पर निर्भरता को रोकने के लिए बैकग्राउंड राइटिंग)
- बफ़र सम्मिलित करें (गैर-अद्वितीय माध्यमिक अनुक्रमणिका में परिवर्तन प्रबंधित करना)
- देखें
सचित्र प्रतिनिधित्व ibdata1
. का
InnoDB आर्किटेक्चर
बहुत से लोग अनेक ibdata
बनाते हैं बेहतर डिस्क-स्पेस प्रबंधन और प्रदर्शन की उम्मीद करने वाली फाइलें, हालांकि यह विश्वास गलत है।
क्या मैं OPTIMIZE चला सकता हूं टेबल
?
दुर्भाग्य से, चल रहा है टेबल को ऑप्टिमाइज़ करें
कोड>
साझा तालिका-स्थान फ़ाइल ibdata1
. में संग्रहीत एक InnoDB तालिका के विरुद्ध दो काम करता है:
- तालिका के डेटा और अनुक्रमणिका को
ibdata1
. के अंदर सन्निहित बनाता है ibdata1
बनाता है बढ़ो क्योंकि सन्निहित डेटा और अनुक्रमणिका पृष्ठ संलग्न . हैं करने के लिएibdata1
हालांकि, आप टेबल डेटा और टेबल इंडेक्स को ibdata1
. से अलग कर सकते हैं और उन्हें स्वतंत्र रूप से प्रबंधित करें।
क्या मैं OPTIMIZE चला सकता हूं टेबल
साथ innodb_file_per_table
?
मान लीजिए आपको innodb_file_per_table<जोड़ना है /कोड>
करने के लिए /etc/my.cnf (my.ini)
. तो क्या आप बस OPTIMIZE TABLE चला सकते हैं
सभी InnoDB टेबल्स पर?
खुशखबरी :जब आप चलाते हैं टेबल को ऑप्टिमाइज़ करें
साथ 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
को सिकोड़ने के लिए एक बार और सभी के लिए आपको निम्न कार्य करने होंगे:
-
डंप (जैसे,
mysqldump
. के साथ) ) सभी डेटाबेस को.sql
. में टेक्स्ट फ़ाइल (SQLData.sql
नीचे प्रयोग किया जाता है) -
सभी डेटाबेस ड्रॉप करें (
mysql
. को छोड़कर) औरसूचना_स्कीमा
) चेतावनी :एहतियात के तौर पर, कृपया यह सुनिश्चित करने के लिए इस स्क्रिप्ट को चलाएं कि आपके पास सभी उपयोगकर्ता अनुदान हैं: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
innodb_buffer_pool_size
. का 25% है ।साथ ही:
innodb_flush_method=O_DIRECT
विंडोज़ पर उपलब्ध नहीं है) -
ibdata*
मिटाएं औरib_logfile*
, वैकल्पिक रूप से, आप/var/lib/mysql
. में सभी फ़ोल्डर हटा सकते हैं ,/var/lib/mysql/mysql
. को छोड़कर । -
MySQL प्रारंभ करें (यह
ibdata1
को फिर से बनाएगा [10MB डिफ़ॉल्ट रूप से] औरib_logfile0
औरib_logfile1
प्रत्येक 1G पर)। -
आयात
SQLData.sql
अब, ibdata1
अभी भी बढ़ेगा लेकिन केवल तालिका मेटाडेटा होगा क्योंकि प्रत्येक InnoDB तालिका ibdata1
. के बाहर मौजूद होगी . ibdata1
अब अन्य तालिकाओं के लिए InnoDB डेटा और अनुक्रमणिका शामिल नहीं होगी।
उदाहरण के लिए, मान लें कि आपके पास mydb.mytable
. नाम की एक InnoDB तालिका है . अगर आप /var/lib/mysql/mydb
. में देखें तो , आप तालिका का प्रतिनिधित्व करने वाली दो फाइलें देखेंगे:
mytable.frm
(स्टोरेज इंजन हैडर)mytable.ibd
(तालिका डेटा और अनुक्रमणिका)
innodb_file_per_table
. के साथ /etc/my.cnf
. में विकल्प , आप OPTIMIZE TABLE mydb.mytable
run चला सकते हैं और फ़ाइल /var/lib/mysql/mydb/mytable.ibd
वास्तव में सिकुड़ जाएगा।
मैंने अपने करियर में कई बार MySQL DBA के रूप में ऐसा किया है। वास्तव में, जब मैंने पहली बार ऐसा किया, तो मैंने 50GB . को छोटा कर दिया ibdata1
केवल 500MB तक फ़ाइल करें!
कोशिश तो करो। यदि आपके पास इस पर और प्रश्न हैं, तो बस पूछें। मुझ पर भरोसा करें; यह अल्पावधि के साथ-साथ लंबी अवधि में भी काम करेगा।
चेतावनी
चरण 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 पर वापस जाएं और जारी रखें
अपडेट 2013-06-04 11:13 EDT
innodb_log_file_size
सेट करने के संबंध में
तब से मेरे पास लॉग आकार की गणना के बारे में डीबीए स्टैक एक्सचेंज में लिखित पोस्ट हैं और जहां मैंने उन दो पेरकोना लेखों का संदर्भ दिया है।
व्यक्तिगत रूप से, मैं अभी भी प्रारंभिक सेटअप के लिए 25% नियम के साथ जाऊंगा। फिर, चूंकि उत्पादन में समय के साथ कार्यभार अधिक सटीक रूप से निर्धारित किया जा सकता है, आप आकार बदल सकते हैं लॉग्स
रखरखाव चक्र के दौरान कुछ ही मिनटों में। 03 जुलाई, 2006
पर वापस जाएं , पेरकोना के पास एक अच्छा लेख था एक उचित innodb_log_file_size क्यों चुनें
ए> . बाद में, नवंबर 21, 2008
. को , Percona ने एक घंटे के परिवर्तनों को ध्यान में रखते हुए अधिकतम कार्यभार के आधार पर उचित आकार की गणना कैसे करें
।
अगस्त 27, 2012
:48GB रैम के साथ सर्वर पर 30GB InnoDB टेबल के लिए उचित ट्यूनिंग
जनवरी 17, 2013
:MySQL 5.5 - Innodb - innodb_log_file_size 4GB से अधिक संयुक्त?