MySQL InnoDB - innodb_file_per_table कंस?


32

डिफ़ॉल्ट रूप से MySQL InnoDB सभी DBs की सभी तालिकाओं को एक वैश्विक फ़ाइल में संग्रहीत करता है। आप इसे config में innodb_file_per_table सेट करके बदल सकते हैं, जो तब प्रत्येक तालिका के लिए एक डेटा फ़ाइल बनाता है।

मैं सोच रहा हूं कि innodb_file_per_tableडिफ़ॉल्ट रूप से सक्षम क्यों नहीं है। क्या इसका उपयोग करने के लिए डाउनसाइड हैं?

जवाबों:


32

मेरे पास इसके लिए पूरा उत्तर है।

एक बार innodb_file_per_table को डाल दिया जाता है, और नई InnoDB तालिकाओं ALTER TABLE <innodb-table-name> ENGINE=InnoDB';को सिकोड़ कर उपयोग किया जा सकता है। यह नई .ibdफाइलों को सिकोड़ देगी ।

यदि आप ALTER TABLE <innodb-table-name> ENGINE=InnoDB';innodb_file_per_table का उपयोग करने से पहले बनाई गई एक InnoDB तालिका पर चलते हैं, तो यह उस तालिका के लिए डेटा और अनुक्रमित को ibdata1 फ़ाइल से बाहर निकाल देगा और इसे एक .ibdफ़ाइल में संग्रहीत करेगा, यह ibdata1 में एक स्थायी कबूतर छोड़ देगा जिसे कभी भी उपयोग नहीं किया जा सकता है ।

ibdata1फ़ाइल सामान्य रूप से जानकारी के चार प्रकार घरों

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

यहाँ ibdata1 फ़ाइल को बहुत अधिक हमेशा के लिए सिकोड़ने का गारंटीकृत तरीका है ...

STEP 01) MySQLDump को सभी डेटाबेसों को SQL टेक्स्ट फाइल (SQLData.sql पर कॉल करें)

चरण 02) सभी डेटाबेस (mysql, info_schema और performance_schema स्कीमा को छोड़कर)

STEP 03) शटडाउन mysql

चरण 04) निम्नलिखित पंक्तियों को /etc/my.cnf में जोड़ें

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend

सिडेनोट: आपका जो भी सेट innodb_buffer_pool_size के लिए है, सुनिश्चित करें कि innodb_log_file_size 25% innodb_buffer_pool_size है।

  • चरण 05) ibdata1, ib_logfile0 और ib_logfile1 हटाएं ( हटाने से पहले अद्यतन देखें! )

इस बिंदु पर, केवल / var / lib / mysql में mysql स्कीमा होना चाहिए

  • STEP 06) mysql को पुनरारंभ करें

यह 10 एमबी पर ibdata1 को फिर से बनाएगा (विकल्प को कॉन्फ़िगर न करें), ib_logfile0 और ib_logfile1 प्रत्येक 1G पर

  • STEP 07) SQLData.sql को mysql में पुनः लोड करें

ibdata1 बढ़ेगा, लेकिन केवल टेबल मेटाडेटा और आंतरायिक MVCC डेटा होगा।

प्रत्येक InnoDB टेबल के बाहर मौजूद होगा ibdata1

मान लीजिए कि आपके पास mydb.mytable नाम की एक InnoDB तालिका है। यदि आप अंदर जाते हैं /var/lib/mysql/mydb, तो आपको तालिका का प्रतिनिधित्व करने वाली दो फाइलें दिखाई देंगी

  • mytable.frm (भंडारण इंजन हैडर)
  • mytable.ibd(घर के लिए टेबल डेटा और टेबल इंडेक्स का mydb.mytable)

ibdata1 अब कभी भी InnoDB डेटा और इंडेक्स शामिल नहीं होंगे।

में innodb_file_per_table विकल्प के साथ /etc/my.cnf, आप OPTIMIZE TABLE mydb.mytableOR को चला सकते हैं ALTER TABLE mydb.mytable ENGINE=InnoDB;और फ़ाइल /var/lib/mysql/mydb/mytable.ibdवास्तव में सिकुड़ जाएगी।

मैंने अपने करियर में कई बार MySQL DBA के बिना एक ही समस्या के बिना ऐसा किया है। वास्तव में, पहली बार मैंने ऐसा किया था, मैंने 50 एमबी में 50 जीबी ibdata1 फ़ाइल को ढहा दिया।

कोशिश तो करो। यदि आपके पास इस पर और प्रश्न हैं, तो मुझे ईमेल करें। मुझ पर विश्वास करो। यह छोटी अवधि में और लंबी दौड़ में काम करेगा।

अद्यतन 2013-07-02 15:08 EDT

इस संबंध में मेरे पास एक चेतावनी है जिसे मैंने अपने अन्य पदों में अपडेट किया है, लेकिन मैं इससे चूक गया: मैं अपने उत्तर को innodb_fast_shutdown के साथ थोड़ा और अपडेट कर रहा हूं क्योंकि मैं mysql को पुनरारंभ करता था और ऐसा करने के लिए mysql को रोकता था। अब, यह एक-कदम महत्वपूर्ण है क्योंकि प्रत्येक लेनदेन में जो भी लेनदेन हो सकता है, उसके अंदर और बाहर चलने वाले अन्य भाग हो सकते हैं, जो कि InnoDB लेनदेन लॉग्स ( InnoDB इन्फ्रास्ट्रक्चर देखें ) के बाहर हैं।

कृपया ध्यान दें कि innodb_fast_shutdown को 2 पर सेट करने से लॉग साफ़ हो जाते हैं, लेकिन अधिक चलने वाले हिस्से अभी भी मौजूद हैं और mysqld के स्टार्टअप के दौरान क्रैश रिकवरी पर उठाया गया है। 0 की सेटिंग सबसे अच्छी है।


बढ़िया जानकारी - धन्यवाद! 50GB >> 50MB - यह बहुत प्रभावशाली है!
20 अक्टूबर को

नमस्ते, मैंने ठीक वैसा ही करने की कोशिश की है जैसा आपने यहां लिखा, 'केवल' समस्या यह है कि सर्वर बाद में शुरू नहीं होता है। अगर मैं mysql की सेवा करूं तो यह वहीं लटक जाएगा। अगर मैं अपनी पुरानी cnf फाइल वापस ले लूं तो सब कुछ ठीक है। क्या आपको इस पर कोई सुराग मिला है?
निकोला पेलुचेती

यह सवाल निकोला के लिए है: क्या आपने स्टेप 5 किया था ???
रोलैंडमाइसीडीडीबीए

@ नोइकोला के लिए एक और सवाल: आपके सिस्टम में कितनी रैम है ???
रोलैंडमाइसीडीडीबीए

2
सावधान रहे! innodb_fast_shutdown=0लॉग फ़ाइलों को हटाने के लिए इसे बंद करने से पहले विकल्प MySQL में सेट किया जाना चाहिए! ( ib_logfile0और ib_logfile1) अन्यथा, आप डेटा खो सकते हैं!
टोटर

12

देखें बग

क्या इसका उपयोग करने के लिए डाउनसाइड हैं?

  • अधिक खुली फाइलें
  • खुला / खुला ओवरहेड
  • .ibd फ़ाइल सिकुड़ती नहीं है (देखें 1 , 2 )

मैं हमेशा बड़े डेटाबेस पर innodb_file_per_table का उपयोग करता हूं।


यहां तक ​​कि अगर आप इसका इस्तेमाल नहीं करते हैं, तो ibdata फाइलें नहीं हटेंगी, या तो :(
minaev

1
धन्यवाद। मुझे यह भी आश्चर्य है कि फ़ाइल-प्रति-डीबी होने का कोई विकल्प क्यों नहीं है?
उपराष्ट्रपति

1
@UpTheCreek, टेबल इकाइयाँ हैं। डेटाबेस संस्थाओं के तार्किक समूह हैं, बजाय अपने आप में संस्थाओं के। यह MyISAM के साथ अधिक स्पष्ट है, जहां डेटाबेस निर्देशिकाएं हैं और टेबल फाइलें हैं।
जॉन गार्डनियर्स

बस यह इंगित करना चाहता था कि जबकि .ibd फाइलें स्वचालित रूप से सिकुड़ती नहीं हैं , न ही ibdata1, फाइल-प्रति-टेबल का विकल्प। कम से कम यह एक .ibd का उपयोग कर सिकोड़ना संभव है optimize table, जो सिकुड़ते हुए ibdata1 की तुलना में तुच्छ है।
रोमनस्ट्रीम

8

innodb_file_per_table डिफ़ॉल्ट रूप से MariaDB में सक्षम है।


1
मेरा नहीं (CentOS 7 में डिफ़ॉल्ट संस्करण)। आपको MySQL 5.6.6 या नए के बराबर की आवश्यकता है। अन्यथा डिफ़ॉल्ट बंद है
मोनिका

2

जिस कारण से मैंने उपयोग नहीं करने का विकल्प चुना है innodb_file_per_table, वह यह है कि प्रत्येक तालिका को अपनी फ़ाइल में रखा जाता है, जिसका अर्थ है कि प्रत्येक तालिका का अपना अलग, अलग-अलग ओवरहेड (फ़ाइल-हस्ताक्षर आदि) होता है, जो MySQLनिर्देशिका के कुल आकार का कारण बनता है। साझा तालिकाओं का उपयोग करने से बड़ा है। इसके अलावा, एकल, बड़े वाले के बजाय कई, छोटी फ़ाइलें होने पर क्लस्टर-स्लैक के कारण अधिक बर्बादी होती है।

दी गई है, अतिरिक्त ओवरहेड चीजों की भव्य योजना में एक बड़ी राशि नहीं है , खासकर यदि आप एक बड़ी ड्राइव का उपयोग कर रहे हैं या एक विशाल डेटाबेस है, लेकिन खुद के लिए (और शायद कई "होम-यूज़र्स"), यह सब और बढ़ गया अभी भी बहुत बड़े क्लस्टरों के साथ छोटी ड्राइव के लिए बहुत ज्यादा था जहां मैं अपना MySQL स्टोर रख रहा था।

उदाहरण के लिए, मेरा डेटाबेस मेरे वर्डप्रेस डेटाबेस और कुछ अन्य छोटे डेटाबेस (phpBB, देव, कुछ एएमपी परीक्षण इत्यादि) के साथ संग्रहीत है, प्रति तालिका में परिवर्तित करके इसे 32 एमबी से बदलकर 50 एमबी कर दिया गया, और वह ibdata1भी अभी तक इसमें शामिल नहीं है। कम से कम 60 एमबी की कुल के लिए न्यूनतम 10 एमबी की आवश्यकता होती है ।

जैसा कि मैंने कहा, कुछ लोगों के लिए, विशेषकर उद्यमों के लिए यह बहुत अधिक समस्या नहीं हो सकती है, लेकिन यदि आप एक ऐसे होम-उपयोगकर्ता हैं जो केवल आपकी साइट, ब्लॉग आदि की मेजबानी कर रहा है, तो यह वास्तव में चुनने जैसी चीजों में एक कारक हो सकता है। एक होस्ट प्रदाता, क्योंकि कई होस्ट कुल डिस्क-उपयोग के अलावा आपके डेटाबेस के आकार को सीमित करते हैं।


1
मैं सोच रहा था कि आप पागल थे (जो दस मेगाबाइट की परवाह करते हैं ???) जब तक आपको होस्टिंग प्रदाताओं पर तंग कोटा के बारे में बात नहीं मिली। ऐसा कभी नहीं सोचा होगा।
डैन प्रिट्स

@DanPritts, विशेष रूप से मुफ्त होस्ट। इसके अलावा, आपके पास एक विशाल ड्राइव हो सकती है, लेकिन हर कोई नहीं करता है। मैंने पिछले वर्ष में अपने मुख्य डेटा विभाजन को 1GB से 2GB तक विस्तारित किया है क्योंकि यह बहुत तंग था, लेकिन यहां तक ​​कि 10MB और यहां 10MB (विशेष रूप से लॉग फ़ाइलों के साथ) इसे तेजी से खा सकते हैं। इसके अलावा, क्लस्टर-कचरे को भी मत भूलना। अंत में, यह जरूरी नहीं कि हार्ड-ड्राइव भी हो । उदाहरण के लिए, मैं वर्तमान में अपनी वेब-साइट "पोर्टबॉल्ज़िंग" कर रहा हूं ताकि मैं इसे किसी भी सिस्टम से होस्ट कर सकूं, इसलिए 2 जीबी फ्लैश-ड्राइव पहले से ही सीमित है। इस प्रकार, आकार छोटा रखना और लिखने से बचना महत्वपूर्ण है। और फिर एम्बेडेड सिस्टम है!
Synetech

इसके अलावा, यह 10 एमबी नहीं है (यह पूर्ण न्यूनतम आकार है IBDATA1)। यह 30MB से ~ 85MB तक चला गया। पूरी चीज़ को हटाकर और एक डंप को खरोंच से आयात करके, मैंने पिछले 30 एमबी के बजाय 69 एमबी के साथ समाप्त किया (एक अनुमान जो डेटाबेस ने इसे आधे से अधिक लिया thing)। किसी कारण से, प्रति-तालिका का उपयोग करने के बावजूद, मेरा ibdata1अभी भी 18 एमबी है। ☹
Synetech

कुछ ऐसा लगता है जैसे कि मैं एक सीएमएस के साथ स्थापित किया गया था जिसमें सेलाइन के बिना बनाम एक के साथ स्थापित किया गया था, जो कि 32M / 50M की फाइलों से देखते हुए। मैं वास्तव में संख्याओं पर विश्वास नहीं कर सकता, आपके पास कितने डेटाबेस हैं यहां तक ​​कि कुछ फाइलें 'मेटाडेटा आकार में MEGABYTES तक जोड़ सकते हैं अन्यथा पहचान योग्य सिस्टम?
सूरजे

2

बस थोड़ा और जानकारी जोड़ने के लिए

चूंकि mysql 5.6.6 डिफ़ॉल्ट रूप से सक्षम है


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