InnoDB सभी डेटाबेस को एक फ़ाइल में क्यों रखता है?


51

यह सुविधाजनक था कि MyISAM प्रत्येक तालिका को एक संगत फ़ाइल में संग्रहीत करता था। InnoDB ने कई पहलुओं में प्रगति की है, लेकिन मुझे आश्चर्य है कि InnoDB सभी डेटाबेस को एक फ़ाइल ( ibdata1डिफ़ॉल्ट रूप से) में संग्रहीत क्यों करता है ।

मैं समझता हूं कि InnoDB तालिकाओं के लिए अलग-अलग इंडेक्स फ़ाइलों द्वारा फ़ाइल में डेटा का स्थान मैप करेगा, लेकिन मुझे समझ नहीं आता कि यह एक फ़ाइल में सभी डेटा को क्यों मिलाता है। और अधिक महत्वपूर्ण बात, सर्वर पर सभी डेटाबेस के डेटा को क्यों मिलाएं?

MyISAM की एक दिलचस्प विशेषता यह है कि एक डेटाबेस फ़ोल्डर को किसी अन्य मशीन पर कॉपी / पेस्ट कर सकता है और फिर डेटाबेस (बिना डंप के) का उपयोग कर सकता है।

जवाबों:


66

InnoDB की वास्तुकला चार बुनियादी प्रकार के जानकारी पृष्ठों के उपयोग की मांग करती है

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

Ibdata1 का सचित्र प्रतिनिधित्व देखें

डिफ़ॉल्ट रूप से, innodb_file_per_table अक्षम है। यह सभी चार जानकारी पृष्ठ प्रकारों को ibdata1 नामक एकल फ़ाइल को लैंड करने का कारण बनता है। कई लोग कई ibdata फाइलें बनाकर डेटा को फैलाने की कोशिश करते हैं। इससे डेटा और इंडेक्स पेजों का विखंडन हो सकता है।

यही कारण है कि मैं अक्सर डिफ़ॉल्ट ibdata1 फ़ाइल का उपयोग करते हुए और कुछ भी अधिक नहीं, InnoDB बुनियादी ढांचे को साफ करने की सलाह देता हूं ।

बुनियादी ढांचे की वजह से नकल करना बहुत खतरनाक है जिसके तहत InnoDB काम करता है। दो बुनियादी संरचनाएँ हैं

  • innodb_file_per_table अक्षम किया गया
  • innodb_file_per_table सक्षम किया गया

InnoDB ( innodb_file_per_table अक्षम)

साथ innodb_file_per_table विकलांग, InnoDB जानकारी के इन सभी प्रकार ibdata1 भीतर रहते हैं। Ibdata1 के बाहर किसी भी InnoDB तालिका की एकमात्र अभिव्यक्ति InnoDB तालिका की .frm फ़ाइल है। एक बार में सभी InnoDB डेटा कॉपी करना सभी / var / lib / mysql की प्रतिलिपि बनाने की आवश्यकता है।

एक व्यक्ति InnoDB तालिका की नकल करना पूरी तरह से असंभव है। डेटा का तार्किक प्रतिनिधित्व और इसकी अनुक्रमणिका परिभाषाओं के रूप में आपको तालिका का एक डंप निकालने के लिए MySQL डंप करना होगा। फिर आप उस डंप को उसी सर्वर या किसी अन्य सर्वर पर दूसरे डेटाबेस में लोड करेंगे।

InnoDB ( innodb_file_per_table सक्षम)

Innodb_file_per_table सक्षम होने के साथ , तालिका डेटा और इसके अनुक्रमित .frm फ़ाइल के बगल में डेटाबेस फ़ोल्डर में रहते हैं। उदाहरण के लिए, तालिका db1.mytable के लिए, ibdata1 के बाहर उस InnoDB तालिका की अभिव्यक्ति होगी:

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

सिस्टम टेबल्सस्पेस ibdata1

Db1.mytable के लिए सभी मेटाडेटा अभी भी ibdata1 में रहते हैं और इसके आसपास कोई रास्ता नहीं है । Redo लॉग और MVCC डेटा अभी भी ibdata1 के साथ रहते हैं।

जब टेबल विखंडन की बात आती है, तो यहां ibdata1 का क्या होता है:

  • innodb_file_per_table सक्षम : आप db1.mytables के साथALTER TABLE db1.mytable ENGINE=InnoDB;याको छोटा कर सकते हैंOPTIMIZE TABLE db1.mytable;। इससे /var/lib/mysql/db1/mytable.ibd बिना किसी विखंडन के शारीरिक रूप से छोटा हो जाता है।
  • innodb_file_per_table विकलांग : आप के साथ db1.mytables हटना नहीं कर सकते हैंALTER TABLE db1.mytable ENGINE=InnoDB;याOPTIMIZE TABLE db1.mytable;क्योंकि यह ibdata1 साथ रहती है। रनिंग या तो वास्तव में कमांड, तालिका को सन्निहित और पढ़ने और लिखने के लिए तेज़ बनाते हैं। दुर्भाग्य से, यह ibdata1 के अंत में होता है। इससे ibdata1 तेजी से बढ़ता है। यह पूरी तरह से मेरे InnoDB सफाई पोस्ट में संबोधित किया गया है

चेतावनी (या रोबोट को अंतरिक्ष में खो जाने के रूप में कहेंगे )

यदि आप .frm और .ibd फ़ाइल को कॉपी करने के बारे में सोच रहे हैं, तो आप दुख की दुनिया के लिए कतार में हैं। एक InnoDB तालिका की .frm और .ibd फ़ाइल की प्रतिलिपि बनाना केवल तभी अच्छा है यदि आप केवल यह गारंटी दे सकते हैं कि .ibd फ़ाइल की टेबलस्पेस आईडी ibdata1 फ़ाइल के मेटाडेटा में टेबलस्पेस आईडी प्रविष्टि के साथ बिल्कुल मेल खाती है

मैंने इस टेबल्स आईडी कॉन्सेप्ट के बारे में DBA StackExchange में दो पोस्ट लिखे

बेमेल टेबल्स आईडी की स्थिति में ibdata1 पर किसी भी .ibd फ़ाइल को रीटेट करने के तरीके के बारे में एक उत्कृष्ट लिंक यहां दिया गया है: http://www.chriscalender.com/?tag=innodb-error-tablesetace-id-in-file । इसे पढ़ने के बाद, आपको तत्काल अहसास होना चाहिए कि नकल करना .ibd फाइलें सिर्फ सादा पागलपन है।

InnoDB के लिए, आपको केवल इसे स्थानांतरित करने के लिए कुछ चाहिए

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

एक InnoDB तालिका की एक प्रतिलिपि बनाने के लिए।

यदि आप इसे किसी अन्य DB सर्वर पर माइग्रेट कर रहे हैं, तो mysqldump का उपयोग करें।

सभी डेटाबेस से सभी InnoDB तालिकाओं को मिलाने के संबंध में, मैं वास्तव में ऐसा करने में समझदारी देख सकता हूं। मेरे नियोक्ता की DB / वेब होस्टिंग कंपनी में, मेरे पास एक MySQL क्लाइंट है जिसमें एक डेटाबेस में एक तालिका है जिसकी बाधाओं को उसी MySQL उदाहरण के भीतर किसी अन्य डेटाबेस में दूसरी तालिका में मैप किया जाता है। एक सामान्य मेटाडेटा रिपॉजिटरी के साथ, यह कई डेटाबेस में ट्रांसेक्शनल सपोर्ट और MVCC को संभव बनाता है।


क्या इसका मतलब यह है कि जब मैं सक्षम टेबल प्रति इनकोड फ़ाइल का उपयोग करता हूं और अगर मुझे अपना डेटा एक सर्वर से दूसरे में आयात करने की आवश्यकता होती है, तो मुझे केवल mysqldump का उपयोग करना होगा न कि किसी अन्य उपकरण जैसे Percona xtrabackup का?
tesla747

14

आप अपने cnf में innodb-file-per-table को जोड़कर प्रति फ़ाइल तालिकाओं को संग्रहीत करने के लिए InnoDB को टॉगल कर सकते हैं।

इनोडब वास्तव में केवल बुनियादी स्तर पर डेटा के पृष्ठों की परवाह करता है। वास्तव में, आप InnoDB को किसी भी फाइलसिस्टम के साथ सिर्फ एक कच्चे ब्लॉक डिवाइस का उपयोग करने के लिए सेट कर सकते हैं कि ऐसा क्या है! http://dev.mysql.com/doc/refman/5.5/en/innodb-raw-devices.html

फ़ाइल को स्टोर करने के लिए उपयुक्तताएं हैं जैसे कि अनुकूलन के माध्यम से उपयोग किए गए स्थान को अधिक आसानी से प्राप्त करने में सक्षम होना।

प्रति तालिका फ़ाइलों के साथ भी, आप केवल ibd फ़ाइलों को इतनी आसानी से कॉपी नहीं कर सकते हैं क्योंकि InnoDB लेनदेन है और विश्व स्तर पर साझा किए गए ibdata / लॉग फ़ाइलों में इसके बारे में जानकारी संग्रहीत करता है।

यह कहना नहीं है कि यह नहीं किया जा सकता है। यदि तालिका ऑफ़लाइन है, तो आप टेबलस्पेस को छोड़ / आयात कर सकते हैं। http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html पर।


इसमें कोई संदेह नहीं है कि InnoDB एक लचीला इंजन है, लेकिन मुझे समझ नहीं आता है कि एक फ़ाइल में सभी डेटा को संग्रहीत करना कितना फायदेमंद है (जैसा कि इस नए ढांचे को InnoDB में MyISAM की तुलना में लागू किया गया है)।
Googlebot

मुझे लगता है कि यह उन हंदियों में से एक है जो 20/20 चीजें हैं। अलमारियों से पहली बार लुढ़कने के बाद प्रति टेबल विकल्प फ़ाइल को जोड़ा गया था। फाइल सिस्टम ओवरहेड से बचने के लिए इसे देने का अपना ही ब्लॉक डिवाइस है। मैं एक कारण नहीं बता सकता कि इन सभी को एक साथ डंप करना बेहतर है (और पूरे ब्लॉक डिवाइस की बात यह खुद की बहस है)। मेरे सभी निर्दोष सेटअप में प्रति तालिका सक्षम फ़ाइल है।
atxdba

यह मुद्दा है, फाइलसिस्टम पर निर्भर नहीं होना एक अमूल्य हो सकता है लेकिन यह डिफ़ॉल्ट रूप से सक्रिय नहीं है। इस प्रकार, कुछ उपयोगकर्ता इसका उपयोग करेंगे।
Googlebot

1
प्रति तालिका विकल्प में से एक फ़ाइल को नुकसान हो सकता है यदि आपके पास बहुत सी तालिकाएँ हैं और RAM की अधिक नहीं है (उदाहरण के लिए Magento स्टोर में लगभग 1000 तालिकाएँ हो सकती हैं)। और खुली हुई फ़ाइलों की सेटिंग को अनुकूलित करना होगा, वह भी (OS सीमाओं पर विचार करते हुए)। तो, सावधानी के साथ उपयोग करें।
ypercube y

यह निश्चित रूप से वसूली के प्रयासों पर एक नुकसान डाल सकता है। हां, आपके पास एक बैकअप होना चाहिए, लेकिन अगर आप नहीं करते हैं, तो इस संरचना के कारण InnoDB चीजों को कठिन बना देता है।
मकाटो

10

यह डिफ़ॉल्ट व्यवहार है लेकिन अनिवार्य नहीं है। से MySQL डॉक्स, पर-टेबल टेबलस्पेस का उपयोग करते हुए :

डिफ़ॉल्ट रूप से, सभी InnoDB टेबल और इंडेक्स को सिस्टम टेबलस्पेस में संग्रहीत किया जाता है। एक विकल्प के रूप में, आप प्रत्येक InnoDB तालिका और उसकी अनुक्रमणिका को अपनी फ़ाइल में संग्रहीत कर सकते हैं । इस सुविधा को "मल्टीपल टेबलस्पेस" कहा जाता है क्योंकि प्रत्येक टेबल जो इस सेटिंग के प्रभावी होने पर बनाई जाती है, उसका अपना टेबलस्पेस होता है।

ऐसा क्यों है, इसका कारण संभवतः दो इंजनों (MyISAM और InnoDB) के विभिन्न आर्किटेक्चर हैं। उदाहरण के लिए, InnoDB में, आप केवल .ibd फ़ाइल को किसी अन्य डेटाबेस या स्थापना में कॉपी नहीं कर सकते। स्पष्टीकरण (उसी पृष्ठ से):

.Ibd फ़ाइलों के लिए पोर्टेबिलिटी विचार

आप डेटाबेस निर्देशिकाओं के बीच स्वतंत्र रूप से .ibd फ़ाइलों को स्थानांतरित नहीं कर सकते हैं जैसा कि आप MyISAM तालिका फ़ाइलों के साथ कर सकते हैं। InnoDB साझा तालिकाओं में संग्रहीत तालिका परिभाषा में डेटाबेस का नाम शामिल है। तालिकाओं फ़ाइलों में संग्रहीत लेनदेन आईडी और लॉग अनुक्रम संख्या भी डेटाबेस के बीच भिन्न होती है।


बहुत जानकारीपूर्ण उत्तर और इस मुद्दे को स्पष्ट किया, लेकिन फिर भी मैं उत्सुक हूं कि सभी डेटाबेस वाली एक बड़ी फ़ाइल प्रदर्शन में सुधार कर सकती है (यदि करता है)।
गूगलबोट

सभी के लिए एक फ़ाइल होने के कारण प्रदर्शन बेहतर नहीं है। टेबल-लेवल के बजाय रो-लेवल लॉकिंग जैसी विभिन्न विशेषताएं, प्रदर्शन में मदद करती हैं। और निश्चित रूप से मुख्य लाभ लेनदेन और एफके बाधाओं (और इस तरह डेटाबेस की अखंडता) है।
ypercube y

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