MySQL innodb वेरिएबल 'innodb_log_file_size' को सुरक्षित रूप से कैसे बदलें?


105

तो मैं काफी InnoDB ट्यूनिंग के लिए नया हूँ। मैं धीरे-धीरे टेबल बदल रहा हूं (जहां आवश्यक हो) MyIsam से InnoDB तक। मैं लगभग 100 एमबी इनोडोड में मिला हूं, इसलिए मैंने innodb_buffer_pool_sizeचर को 128 एमबी तक बढ़ा दिया है :

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

जब मैं innodb_log_file_sizeमान बदलने के लिए गया था (उदाहरण के लिए my.cnf mysql के innodb कॉन्फ़िगरेशन पृष्ठ पर टिप्पणी करता है) लॉग फ़ाइल का आकार बदलने के लिए बफर आकार का 25%।

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

जब मैं सर्वर को पुनरारंभ करता हूं, मुझे यह त्रुटि मिलती है:

110216 9:48:41 InnoDB: प्रारंभिक बफ़र पूल, आकार = 128.0M
110216 9:48:41 InnoDB: बफ़र पूल का प्रारंभिक प्रारंभ
InnoDB: त्रुटि: लॉग फ़ाइल ./ib_logfile0 विभिन्न आकार का है 0 5242880 बाइट्स
InnoDB: निर्दिष्ट से अधिक। .cnf फ़ाइल 0 33554432 बाइट्स!
110216 9:48:41 [ERROR] प्लगिन 'InnoDB' init फ़ंक्शन ने त्रुटि लौटा दी।
110216 9:48:41 [ERROR] प्लग इन 'InnoDB' एक पंजीकरण इंजन के रूप में विफल रहा।

तो मेरा प्रश्न: क्या पुराने log_files को हटाना सुरक्षित है, या innodb_log_file_sizeचर को बदलने के लिए कोई अन्य तरीका है ?


1
बस innodb_log_file_size पर my.ini में टिप्पणी करें .....

5
हम्म, मैं इसे डिफ़ॉल्ट मान का उपयोग करने के लिए क्यों कहना चाहूंगा जब मैं इसे डिफ़ॉल्ट मान से बदलने की कोशिश कर रहा हूं?
डेरेक डाउनी

जी हाँ innodb_log_file_size लाइन को लिखकर इसके काम करता है .. धन्यवाद।
मुहम्मद उमर फ़ारूक़ फ्रैंक

2
@muhammadumarfarooqfrank बेशक यह काम करता है - क्योंकि आप अब वैरिएबल के मूल्य को नहीं बदल रहे हैं, इसलिए पूरे बिंदु को बना रहे हैं। काश, टिप्पणियों को कम करने का एक तरीका होता।
dr01

जवाबों:


83

हां, mysqld के शटडाउन होने के बाद लॉग फाइल को हटाना सुरक्षित है

इसके प्रकाश में, बस निम्न चरणों का पालन करें:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Mysqld को फिर से बनाना ib_logfile0और बनाना शुरू करेंगेib_logfile1

कोशिश करो !!!

UPDATE 2011-10-20 16:40 EDT

यह लॉग इन फ़ाइलों को फिर से तैयार करने से पहले InnoDB बफर पूल में सभी डेटा को साफ़ करता है, आपको यह विकल्प शटडाउन से लगभग 1 घंटे पहले सेट करना चाहिए:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

डिफ़ॉल्ट रूप से, innodb_max_dirty_pages_pct 75 (MySQL 5.5+) या 90 (MySQL 5.5 से पहले) है। इसे शून्य पर सेट करने से इनोबीडी बफर पूल के 1% के नीचे गंदे पृष्ठों की संख्या बनी रहती है। प्रदर्शन service mysql stopतो वैसे भी करता है। इसके अलावा, एक शटडाउन फिर से लॉग इन में किसी भी शेष आइटम को पूरा करेगा। इस विकल्प को रखने के लिए बस इसे /etc/my.cnf में जोड़ें:

[mysqld]
innodb_max_dirty_pages_pct = 0

अद्यतन 2013-04-19 16:16 EDT

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

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


1
अच्छा जवाब और अपडेट बहुत अच्छा है। मेरा एकमात्र सुझाव कुछ गलत हो जाने की स्थिति में ib_logfiles को किसी अन्य स्थान पर कॉपी करना होगा। यह आपको फ़ाइलों को आकार देने के लिए एक विचार प्राप्त करने में मदद करेगा: mysqlperformanceblog.com/2011/07/09/…
जस्टिन नोएल

5
मेरे लिए भी काम किया, लेकिन: लिनक्स कंसोल यूआई भ्रामक हो सकता है - यदि आप एक बड़ा लॉग फ़ाइल आकार (कई सौ एमबी या अधिक) सेट करते हैं तो mysqld स्टार्टअप को बहुत समय लगता है। कंसोल UI आपको डॉट्स दिखा रहा है और फिर "विफल!" दिखाता है, लेकिन वास्तव में MySQL अभी भी शुरू हो रहा है। जब तक आप "mysqld: कनेक्शन के लिए तैयार नहीं होते हैं" तब तक प्रतीक्षा करें और लॉग फ़ाइल को पढ़ते रहें (या "पूंछ-लॉग [लॉग-फाइल]" के साथ लॉग फ़ाइल की निगरानी करें।) और डिस्क पर आवंटित दोनों लॉग फाइल।
f055

2
चेतावनी !! चरण 3 ने मेरे लिए काम नहीं किया और मेरा दिल लगभग बंद हो गया जब मैंने देखा कि mysql को InnoDB के बिना लोड हो रहा है, mysql को रोकना और उन्हें मैन्युअल रूप से निकालना और फिर से MySQL शुरू करना था। सलाह के दो टुकड़े: 1. अपनी पहले से मौजूद लॉग फ़ाइलों का बैकअप लें, 2. मैन्युअल रूप से फ़ाइलों को हटा दें
पीयूष कुशवाहा

2
पीयूष सही है। यहां तक ​​कि mysql प्रलेखन कुछ गलत हो जाता है के मामले में अपने logfiles का समर्थन करने की सिफारिश की है
ग्रेग

1
@ इस कारण से मैं उपयोग कर रहा हूँ SET GLOBAL innodb_fast_shutdown = 0;। जब MySQL शट डाउन हो जाता है, तो सब कुछ लेन-देन के सभी चलती भागों से अलग हो जाता है, जिसमें रेडो लॉग्स (ib_logfile0 और ib_logfile1) शामिल हैं। कोई उन्हें रख सकता है। मैं अभी तक पूरी तरह से फ्लश लॉग के साथ मुद्दों का सामना करने के लिए है।
रोलैंडमाइसीडीडीबीए

31

मैं इसके बजाय आधिकारिक विधि की सिफारिश करूंगा , जिसे मैं सुविधा के लिए यहां प्रस्तुत करता हूं:

MySQL 5.6.7 या उससे पहले के इनबॉक्स लॉग फाइल की संख्या या आकार बदलने के लिए, निम्न निर्देशों का उपयोग करें। उपयोग करने की प्रक्रिया innodb_fast_shutdown के मूल्य पर निर्भर करती है, जो यह निर्धारित करती है कि सिस्टम शटडाउन को पूरी तरह से अप-टू-डेट एक शटडाउन ऑपरेशन से पहले लाया जाए या नहीं:

  • यदि innodb_fast_shutdown 2 पर सेट नहीं है: MySQL सर्वर बंद करें और सुनिश्चित करें कि यह त्रुटियों के बिना बंद हो जाता है, यह सुनिश्चित करने के लिए कि रीडो लॉग में बकाया लेनदेन के लिए कोई जानकारी नहीं है। पुरानी रेड लॉग फ़ाइलों को सुरक्षित स्थान पर कॉपी करें, यदि शटडाउन के दौरान कुछ गलत हो गया है और आपको टेबलस्पेस को पुनर्प्राप्त करने की आवश्यकता है। लॉग फ़ाइल निर्देशिका से पुरानी लॉग फ़ाइलों को हटाएं, लॉग फ़ाइल कॉन्फ़िगरेशन को बदलने के लिए my.cnf को संपादित करें, और MySQL सर्वर को फिर से शुरू करें। mysqld देखता है कि कोई भी InnoDB लॉग फ़ाइल स्टार्टअप पर मौजूद नहीं है और नए बनाता है।

  • अगर innodb_fast_shutdown 2 पर सेट है: innodb_fast_shutdown को 1 पर सेट करें:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

फिर पिछले आइटम में दिए गए निर्देशों का पालन करें।

MySQL 5.6.8 के रूप में , नंबर बदलने या InnoDB लॉग फ़ाइलों का आकार बदलते समय innodb_fast_shutdown सेटिंग अब प्रासंगिक नहीं है। इसके अतिरिक्त, आपको पुरानी लॉग फ़ाइलों को हटाने की आवश्यकता नहीं है, हालाँकि आप अभी भी बैकअप के रूप में पुरानी लॉग फ़ाइलों को सुरक्षित स्थान पर कॉपी करना चाह सकते हैं। InnoDB लॉग फ़ाइलों की संख्या या आकार बदलने के लिए, निम्न चरणों का पालन करें:

  1. MySQL सर्वर को बंद करें और सुनिश्चित करें कि यह त्रुटियों के बिना बंद हो जाता है।

  2. लॉग फ़ाइल कॉन्फ़िगरेशन बदलने के लिए my.cnf को संपादित करें। लॉग फ़ाइल का आकार बदलने के लिए, innodb_log_file_size कॉन्फ़िगर करें। लॉग फ़ाइलों की संख्या बढ़ाने के लिए, innodb_log_files_in_group कॉन्फ़िगर करें।

  3. MySQL सर्वर को फिर से शुरू करें।

यदि InnoDB यह पता लगाता है कि innodb_log_file_size रीडो लॉग फ़ाइल के आकार से भिन्न है, तो यह लॉग चेकपॉइंट लिखेगा, पुरानी लॉग फ़ाइलों को बंद और हटा देगा, अनुरोधित आकार में नई लॉग फाइलें बना सकता है, और नई लॉग फाइलें खोल सकता है।


इस सवाल के अपडेट के रूप में यह एक अच्छा जवाब है। +1 !!!
RolandoMySQLDBA

2
यह एक "अपडेट" नहीं है। ये मैनुअल पृष्ठ लंबे समय से मौजूद हैं। मैं हमेशा पहिया को सुदृढ़ करने और जानकारी को डुप्लिकेट करने के बजाय मैनुअल (वहाँ से बाहर सबसे अच्छे मैनुअल में से एक) की सलाह देता हूं (जो कि कुछ ऐसा है जिसे हम डीबीए से सबसे अधिक नफरत करते हैं)।
रैंडमसाइड

यह MySQL 5.6 के रूप में पसंदीदा तरीका है। यदि आप अभी भी 5.6 से पहले के संस्करण पर चल रहे हैं, तो यह काम नहीं करेगा।
डेरेक डाउनी

20

innodb_buffer_pool_size- बस बदलें my.cnf( my.ini) और mysqld को पुनरारंभ करें।

innodb_log_file_sizeकम महत्वपूर्ण है। जब तक कोई कारण न हो तब तक इसे न बदलें। रोलैंड ने कदम प्रदान किए , लेकिन एक पहलू मुझे चिंतित करता है ... मुझे नहीं पता कि क्या पहले दो चरण महत्वपूर्ण हैं; ऐसा लगता है कि वे हो सकते हैं:

  1. set innodb_fast_shutdown = OFF
  2. mysql को पुनरारंभ करें
  3. mysql बंद करो
  4. लॉगफ़ाइलों को निकालें
  5. mysql शुरू करें

लॉग फ़ाइलें अपूर्ण व्यवसाय का ट्रैक रखती हैं; " innodb_fast_shutdown" पुनः आरंभ करने के बाद उस सामान से निपटने के लिए कहता है । तो फ़ाइलों को हटाने से जानकारी खो सकती है?

नए संस्करणों में सुधार हुआ है: (टिप्पणियों में अधिक चर्चा)

  • 5.6 innodb_log_file_size> 4GB के लिए अनुमति देता है
  • 5.6 innodb_log_file_sizeiblog को हटाए बिना बदला जा सकता है *
  • 5.7 गतिशील रूप से आकार बदलने के लिए अनुमति देता है innodb_buffer_pool_size

क्या मुझे log_file_size बदलना चाहिए?

GLOBAL STATUSलॉग साइकल से पहले मिनट की संख्या की गणना करने के लिए उपयोग करें ।

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

यदि यह 60 (मिनट) से बहुत कम है, तो यह log_file_size को बढ़ाने में मदद कर सकता है। यदि यह बहुत अधिक है, तो लॉग फाइलें डिस्क स्थान को बर्बाद कर रही हैं। यह "1 घंटा" बल्कि मनमाना है, इसलिए यदि आप इसके करीब हैं, तो log_file_size को बदलने से परेशान न हों।

innodb_log_files_in_group2 के डिफ़ॉल्ट पर छोड़ दें ।


+1 आपकी चिंता के द्वारा समर्थित किया जा रहा है डॉक्स
जैक डगलस

मैंने इस जवाब पर एक नज़र डाली और मुझे पहली पंक्ति पसंद है। मेरे पास आम तौर पर ग्राहक थे, --skip-networkingजो एहतियात के तौर पर अपने आप को नीचे लाते हैं और उन आखिरी मिनटों में रास्ता बदल देते हैं। आपकी पहली पंक्ति (सेट innodb_fast_shutdown = OFF) को समाप्त करता है। +1 !!!
रोलैंडमाइसीडीडीबीए

1
Upvotes के लिए धन्यवाद। नए पाठकों को इसकी आवश्यकता नहीं हो सकती है। में 5.6.8 , innodb_log_file_sizeiBlog फ़ाइलों को हटाने के बिना इसे बदलने की अनुमति के लिए बढ़ाया गया था।
रिक जेम्स

Dis का अर्थ है "अधिक क्रिटिकल", न कि "कम क्रिटिकल"?
इगोर

@Igor - नहीं। यदि आपके पास log_file_size बहुत छोटा है, तो इसके माध्यम से अतिरिक्त I / O थ्रैशिंग होगा। मुझे वह शायद ही कभी दिखाई पड़े। यदि आपके पास यह बहुत बड़ा है, तो आप डिस्क स्थान को बर्बाद कर रहे हैं। इसे सेट करने का लक्ष्य एक घंटे में साइकिल चलाना है। लेकिन 10 मिनट बनाम 10 घंटे - न तो ज्यादा मायने रखता है। अधिक ...
रिक जेम्स

1

जब आप mysql पर लॉग इन करते हैं तो उन कमांड्स को टाइप करें:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

आपको दो नंबर मिलेंगे। पहले आप एक प्राप्त करें और फिर एक मिनट तक प्रतीक्षा करें। आपको दूसरा मिल जाएगा।

पहले वाले को 3.456.718.123 और दूसरे को 4.098.873.134 कहते हैं

अब (4.098.873.134-3.856.718.123) * 60/1024/1024

परिणाम = 13.856 एमबी है

आपके पास दो लॉग फाइलें हैं। तो इसे दो से विभाजित करें और आपको 7.000 एमबी के पास एक नंबर मिलेगा। बस सुनिश्चित करने के लिए, अपने लॉग फ़ाइल का आकार 8GB सेट करें


1
यह स्पष्ट नहीं है (कम से कम मेरे लिए) कि यह वास्तव में सवाल का जवाब देता है। यह लॉग फ़ाइल के लिए एक वैकल्पिक आकार के लिए एक सुझाव प्रतीत होता है, न कि लॉग फ़ाइल के आकार को सुरक्षित रूप से कैसे बदलें
RDFozz

1
@RDFozz आप सही हैं। यह जवाब नहीं देता है कि लॉग फ़ाइल का आकार कैसे बदलना है। यह प्रश्न उत्तर देता है कि कैसे अंकुश को सेट करने के बारे में जाना जाता है ताकि innodb_log_file_size को सेट किया जा सके। मैंने पहले ही पांच साल पहले इस तरह के सवाल का जवाब दिया था (देखें dba.stackexchange.com/questions/23189/… ) Log File Sizeमें सबहेडिंग देखें
रोलांडोमीक्यूडीबीबीए

मैं केवल मदद करना चाहता था: / मुझे पता है कि इसका सटीक उत्तर नहीं है।
लिनक्स न्यूबी

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * और& सेवा mysql पुनरारंभ || सेवा mysql पुनरारंभ करें

कोशिश करो, काम करने की गारंटी [डेबियन 6 पर परीक्षण]


2
यह एक साफ शटडाउन की गारंटी नहीं देता है। यह केवल लाइट लोड वाले सर्वर पर औसत स्थिति में काम कर सकता है, लेकिन यह अनुशंसित नहीं है यदि आप अपने डेटाबेस अखंडता के बारे में परवाह करते हैं।
एमिल विक्रोत्तम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.