MySql - एक जीवित db के लिए बदलते innodb_file_per_table


18

मेरे पास एक बड़ा MySql DB (150GB) है और अब केवल मैंने देखा है कि innodb_file_per_tableवह सेट है offजिसके कारण पूरे DB को एक सिंगल फाइल ( ibdata1) पर होस्ट किया जा सकता है । मैं सक्रिय करना चाहता हूं innodb_file_per_tableऔर इसे रेट्रो रूप से डीबी को कई फाइलों में विभाजित करना है, ऐसा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


32

इस बंद को खींचने का केवल एक ही तरीका है। आपको mysqldumps का उपयोग करके डेटा निर्यात करना होगा, सभी डेटाबेस को छोड़ना होगा, mysqld को बंद करना होगा, ib_logfile0 को हटाना होगा, ib_logfile1 को हटाना होगा, ibdata1 को हटाना होगा, शीर्षक के innodb_file_per_tableनीचे जोड़ना होगा, ssql को [mysqld]शुरू करना होगा।

मैंने अक्टूबर 2010 में वापस StackOverflow में यह उत्तर पोस्ट किया

यहां लंबवत सूचीबद्ध किए गए चरण हैं:

चरण 01) एक SQL पाठ फ़ाइल में सभी डेटाबेस MySQLDump (इसे SQLData.sql कहें)

चरण 02) सभी डेटाबेस (mysql स्कीमा को छोड़कर) ड्रॉप करें

चरण 03) शटडाउन mysql

CAVEAT : InnoDB फ़ाइलों से अनक्लेम्ड लेनदेन को पूरी तरह से साफ़ करने के लिए, इसे चलाएँ

mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop

चरण 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_buffer_pool_size के लिए है, सुनिश्चित करें कि innodb_log_file_size 25% innodb_buffer_pool_size है।

चरण 05) ibdata1, ib_logfile0 और ib_logfile1 हटाएं

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

चरण 06) mysql को पुनरारंभ करें

यह ibdata1 को 10MB, ib_logfile0 पर और ib_logfile1 को 1G पर पुनः बनाएगा

चरण ० Rel) SQLData.sql को mysql में पुनः लोड करें

ibdata1 बढ़ेगा लेकिन इसमें केवल टेबल मेटाडेटा होगा

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

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

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

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

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

मैंने अपने करियर में कई बार MySQL DBA के रूप में ऐसा किया है

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

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

एक विकल्प है जो ibdata1 सिकुड़ते हुए InnoDB तालिका को निकालेगा।

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

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

चरण 02) service mysql restart

चरण 03) mydb.mytable नामक एकल InnoDB तालिका निकालने के लिए, यह करें:

ALTER TABLE mydb.mytable ENGINE=InnoDB;

यह मूल संरचना फ़ाइल रखने के लिए एक फ़ाइल pleus बनाएगा

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

आप इसे प्रत्येक InnoDB तालिका के लिए कर सकते हैं। दुर्भाग्य से, ibdata1 150GB रहेगा।


.sql फ़ाइलों से पुनः लोड करते समय मैं निम्नलिखित त्रुटि ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytesकिसी भी विचार मिला ?
रैन

@ कृपया एक अलग प्रश्न के रूप में पोस्ट करें।
रोलैंडमाइसीडीडीबीए


यदि आप सेट करते हैं innodb_file_per_tableऔर फिर ALTER TABLEहर एक टेबल पर करते हैं, तो क्या आप रिस्टोर करने के लिए बिना स्पेस रिक्लेम करने के लिए ibdata1 फाइल को डिलीट कर सकते हैं?
SystemParadox

1
@SystemParadox ABSOLUTELY नहीं !!!!!!!! आप डेटा शब्दकोश खो देंगे।
RolandoMySQLDBA

5

यदि आप ibdata के स्थान को पुनः प्राप्त करना चाहते हैं, तो एक डंप / पुनर्स्थापना आपकी एकमात्र पसंद है, जैसा कि रोलांडो बताते हैं। ऐसा करना प्रदर्शन के लिए भी शायद सबसे अच्छा है।

हालाँकि, अगर आप अपने घाटे को कम करना चाहते हैं और हार्डड्राइव पर 150GB खोना चाहते हैं, तो आप सीधे innodb_file_per_tablemy.cnf में सक्षम कर सकते हैं और अपने सर्वर को पुनः आरंभ कर सकते हैं।

फिर प्रत्येक तालिका के लिए, जारी करें:

ALTER TABLE x DISABLE KEYS;
ALTER TABLE x ENGINE=InnoDB;
ALTER TABLE x ENABLE KEYS; 

यहां समस्या यह है कि बड़े तालिकाओं में कुछ समय लगेगा।

मैं जो सुझाव दूंगा वह आपके लाइव db का गुलाम स्थापित करेगा, गुलाम पर रूपांतरण चलाएगा, फिर या तो मास्टर / दास को बंद कर देगा और नए डेटास्पेस को मास्टर को कॉपी करेगा, या एक बार पकड़े जाने पर दास को मास्टर होने के लिए बढ़ावा देगा। ।

आपको यह परिवर्तन करने में कठिनाई हो रही है और बिना किसी डाउनटाइम के।


+1 क्रूरतापूर्वक ईमानदार होने और 'अपने नुकसान में कटौती' करने के लिए। आप 'बुलेट को काटो' भी कह सकते थे।
रोलैंडमाइसीडीडीबीए

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