क्या innodb_file_per_table उचित है?


19

हमारे पास एक एप्लिकेशन है जहां सिर्फ एक टेबल लाखों लाइनों में बढ़ रही है, लेकिन बाकी बस एक मिलियन से नीचे होगी। तो क्या सलाह है कि हमें innodb_file_per_table के साथ जाना चाहिए या सिर्फ एक .ibd के रूप में छोड़ना चाहिए? मैं कुछ लेखों को पढ़ता हूं कहता हूं कि इसके साथ मत जाओ क्योंकि जब प्रदर्शन किया जाता है तो आपको अधिक डिस्क एक्सेस की आवश्यकता होती है? पीढ़ी के उद्देश्यों की रिपोर्टिंग के लिए हम इस तालिका और अन्य के बीच शामिल होंगे।

जवाबों:


24

आपको innodb_file_per_table के साथ जाना चाहिए और आपको कुछ करना होगा कि InnoDB के मौजूदा बुनियादी ढांचे के साथ सफाई कैसे की जाए।

मैंने कई DB होस्टिंग क्लाइंट सेटअप MySQL को देखा है और InnoDB को उसकी डिफ़ॉल्ट स्थिति में छोड़ दिया है। इसके कारण सिस्टम टेबलस्पेस (जिसे ibdata1 के रूप में जाना जाता है) बेतहाशा बढ़ता है।

यहां तक ​​कि अगर आप innodb_file_per_table पर स्विच करते हैं, तो .ibd फ़ाइल को ibdata1 से निकाला जाना होगा और ibdata कभी सिकुड़ नहीं पाएगी। उदाहरण के लिए, यदि आपके पास mydb.mytable नामक एक तालिका है जो ibdata1 के अंदर 2GB ले रही है, तो आपको इसे निकालने के लिए निम्न करना होगा:

STEP 01) इसे /etc/my.cnf में जोड़ें

[mysqld]
innodb_file_per_table

कदम 02) service mysql restart

कदम 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;

यह फ़ाइल /var/lib/mysql/mydb/mytable.ibd बना देगा

दुर्भाग्य से, परिवर्तन से पहले तालिका द्वारा कब्जा कर लिया गया 2GB स्थान पुनः प्राप्त नहीं किया जा सकता है। मैंने InnoDB के बुनियादी ढांचे को कैसे और क्यों साफ किया जाए, इसके बारे में पिछले पोस्ट लिखे:

एक बार जब आप यह बड़ा बदलाव करते हैं, तो innodb_open_files (डिफ़ॉल्ट 300) को बढ़ाना न भूलें । अन्यथा, डिस्क एक्सेस बहुत सीमित है।

जुड़ने के संबंध में, सुनिश्चित करें कि आपके पास उचित सूचकांक हैं जो जुड़ने के मानदंडों का समर्थन करते हैं।

UPDATE 2012-04-02 11:30 EDT

एक ताजा किश्त में innodb_file_per_table का उपयोग करने से ibdata1 बहुत धीरे-धीरे बढ़ता है क्योंकि सभी DDL को ibdata के लिए बाहरी किया जाता है। आप किसी भी InnoDB तालिका को सिकोड़ सकते हैं जैसा कि मैंने इस तरह बताया है:

ALTER TABLE mydb.mytable ENGINE=InnoDB;

अद्यतन 2012-04-02 16:50 EDT

जब बैकअप की बात आती है, तो .ibd फ़ाइलों की प्रतिलिपि बनाने में बेहद सावधानी बरतें। क्यों?

हर .ibd फ़ाइल के अंदर विशेष मूल्य है जिसे टेबलस्पेस_ड के नाम से जाना जाता है। Ibdata1 में tablespace_id मानों की एक सूची है। यदि आप कभी तालिका रखरखाव करते हैं, जिसमें तालिका को छोड़ने और पुनः बनाने की आवश्यकता होती है, तो टेबलस्पेस_ड अलग हो जाएगा। यदि आप ibdata1 की एक प्रति भी बनाते हैं, तो ऐसी .ibd फ़ाइल की एक प्रति बनाना केवल उपयोग के लिए डेटाबेस में वापस लाया जा सकता है। यह अन्य सभी InnoDB तालिकाओं के tablepace_id को खतरे में डालती है। इसके प्रकाश में, यह बेहतर है कि आप mysqldump बैकअप करें क्योंकि mysqldumps डेटा की तार्किक प्रतियां हैं। दूसरे शब्दों में, बैकअप ibdata1 के पॉइंट-इन-टाइम से स्वतंत्र है और आप बिना किसी समस्या के पुनः लोड करने के लिए स्वतंत्र हैं।


यह एक नया सर्वर होने वाला है। तो मुझे क्या करना चाहिए? आप क्यों कहते हैं कि innodb_file_per_table के साथ जाना अच्छा है? ओवरटाइम यह तालिका बढ़ती जा रही है कि किसी भी प्रकार की सीमा त्रुटियों को देखना चाहिए?
newbie14

7

@RolandoMySQLDBA के साथ सहमत, कुछ के लिए वह उल्लेख नहीं करता है: बैकअप।

यदि आपके पास अपना MySQL बैकअप शासन है, तो सभी ने काम किया है, और आप अपनी फ़ाइल सिस्टम बैकअप रणनीति में इसकी .ibd फ़ाइल को शामिल नहीं कर रहे हैं, तो यह इतना महत्वपूर्ण नहीं है। लेकिन विचार करें कि किसी भी टेबल पर वन बीईटीईएस को जोड़ने से आपके .ibd टेबल के अन्य बुद्धिमानों का वृद्धिशील बैकअप हो जाएगा, और आप देख सकते हैं कि आप जल्दी से बैकअप स्टोरेज से बाहर हो जाएंगे।


प्रिय सब हाँ मैं भी बैकअप चलाने की योजना है। अगर मुझे मास्टर बैकअप के लिए मास्टर की जरूरत है तो क्या फर्क पड़ता है? क्या यह दोनों एक दूसरे का बैकअप लेंगे? सेटिंग्स पर क्या बदलना होगा?
newbie14

4

मेरे पास एक एप्लिकेशन है जहां मेरे पास बिल्कुल यही स्थिति है: कुछ बड़ी टेबल और कुछ छोटे।

मैंने ibdata1बड़े लोगों को अपनी फाइलों में रखने के दौरान छोटे लोगों को छोड़ने का फैसला किया ।

मैं innodb_file_per_tableडिफ़ॉल्ट रूप से स्विच करके ऐसा करता हूं और केवल एक टेबल को ibdata1साथ ले जाने के लिए इसे अस्थायी रूप से बंद करता हूं ALTER TABLE


@ igigigi कैसे ibdata1 में छोटे लोगों को छोड़ने के लिए और अपनी खुद की फ़ाइलों में बड़ा एक यह है कि यदि आप इस innodb_file_per_table सेट का मतलब है कि सभी अपनी फ़ाइलों में होगा?
newbie14

ALTER TABLEउनके बाद ही आप । इसलिए मेरी रणनीति innodb_file_per_tableनियमित रूप से स्विच करने की है और एक छोटी सी तालिका को आगे बढ़ने के लिए ibdata1और बाद में इसे फिर से स्विच करने के लिए इसे आकस्मिक रूप से स्विच करना है ।
21

यह हमेशा के लिए innodb_file_per_table के रूप में रहने के लिए ठीक है यहाँ एक समस्या नहीं है?
newbie14

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