आप InnoDB टेबल भ्रष्टाचार की पहचान कैसे करते हैं?


24

मेरे पास कुछ टेबल हैं जिनका विभाजन किया गया है और एक प्रतिकृति दास पर कई अनुक्रमित हैं। स्नैप शॉट (सत्यापित सुरक्षित) की प्रतिलिपि एक नए दास को भेजने और mysqld को 5.1.42 से 5.5.15 पर अपग्रेड करने और प्रतिकृति को पुनरारंभ करने के बाद, मुझे त्रुटि संदेश "अमान्य सूचक ..." के साथ InnoDB क्रैश हो रहा है

ये त्रुटियां अलग-अलग हार्डवेयर और O / S के साथ 2 सर्वरों में हुई हैं। चलने के बाद:

ALTER TABLE .... COALESCE PARTION n;

समस्या उस तालिका के लिए चली जाती है।

मेरा प्रश्न, हालांकि, दायरे में बड़ा है, और यह है कि "आप InnoDB टेबल भ्रष्टाचार की पहचान कैसे करते हैं?" या rephrased "आप InnoDB तालिका स्वास्थ्य का आकलन कैसे करते हैं?" क्या "चेक टेबल" केवल उपकरण है जो पूर्व-दुर्घटना की समस्याओं की पहचान करने के लिए उपलब्ध है?

निश्चित नहीं है कि क्या यह मायने रखता है, लेकिन क्रैश चल रहा है: संस्करण: '5.5.15-55-लॉग' सॉकेट: '/opt/mysql.sock' पोर्ट: 3306 Percona सर्वर (GPL), रिलीज़ rel21.0, संशोधन 158


2
हाय रैंडी! मुझे लगता है कि यहाँ प्रतिक्रियाएँ विश्वसनीय हैं - InnoDB ने अपने भ्रष्टाचार की पहचान की। हो सकता है कि आपको अपने सवाल पर फिर से विचार करना चाहिए, कि आप InnoDB को भ्रष्ट करने का क्या कारण बनेंगे?
बजे मॉर्गन टॉकर

जवाबों:


18

मॉर्गन ने अपनी टिप्पणी में एक संकेत दिया है कि InnoDB लगातार पढ़े जाने वाले पृष्ठों पर चेक पेज कर भ्रष्ट पेजों की जाँच कर रहा है। InnoDB चेकसम बेमेल मिलते हैं तो वह होगा दुर्घटना सर्वर बंद करो।

यदि आप उस प्रक्रिया को गति देना चाहते हैं (दूषित पृष्ठ को पढ़ने के लिए इनोबीडी की प्रतीक्षा करने के बजाय), तो आप इसका उपयोग कर सकते हैं innochecksum:

क्योंकि चेकसम मिसमैच के कारण InnoDB जानबूझकर चल रहे सर्वर को बंद कर देगा, इसलिए क्षतिग्रस्त पेजों का सामना करने के लिए उत्पादन उपयोग में सर्वर की प्रतीक्षा करने के बजाय इस टूल का उपयोग करना बेहतर हो सकता है।

एक दिलचस्प चेतावनी:

मासोकचैटम का उपयोग उन तालिकाओं फ़ाइलों पर नहीं किया जा सकता है जो सर्वर में पहले से खुली हैं। ऐसी फ़ाइलों के लिए, आपको टेबल टेबल के भीतर तालिकाओं की जांच करने के लिए चेक टेबल का उपयोग करना चाहिए।

तो हाँ, एक ऑनलाइन टेबल के CHECK TABLEलिए संभवतः एक उपकरण है (या किसी अन्य उत्तर में बताया गया हैmysqlcheck यदि आप एक समय में एक से अधिक कार्य करना चाहते हैं।)

यदि आप अपने डेटाबेस को बंद कर सकते हैं तो आप इसे चेकसम का उपयोग करने के लिए बाध्य कर सकते हैं innochecksum

उपाख्यानात्मक: 29GB (साथ की एक InnoDB टेबल पर innodb_file_per_table=1), इस स्क्रिप्ट 2 मिनट के बारे में ले लिया

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

एक बोनस के रूप में, हालांकि, जब से आप पेरकोना चला रहे हैं, उन्होंने तेजी से निर्दोष चेकसम के लिए एक नया तरीका लागू किया । मैंने इसका कभी उपयोग नहीं किया है, लेकिन यह इस प्रक्रिया को गति दे सकता है।


1
यहाँ यह एक कोशिश दे दो, लगता है कि समाधान @randymelder +1 की तलाश में है
marcio

2
Percona सर्वर में कुछ अन्य अच्छी विशेषताएं हैं। Innodb_corrupt_table_action percona.com/doc/percona-server/5.5/reliability/… (!!) देखें
Morgan Tocker

@Dest: innochecksum जाने का रास्ता है। यह एक कीपर है। +1 !!!
रोलैंडमाइसीडीडीबीए

@Dest: इस एक पर आज आपको सलाम !!!!
रोलैंडमाइसीडीडीबीए

@ मॉर्गनटॉकर दिलचस्प। मेरे ज्ञान को निर्वात में लाने के लिए और कुछ शोध करने के लिए जाना
Derek Downey

6

चेतावनी: इनमें से किसी भी निर्देश की कोशिश करने से पहले, यह सत्यापित करने के लिए दृढ़ता से अनुशंसा की जाती है कि हाथों में आपके डेटाबेस का एक स्वस्थ बैकअप है, बस मामले में। (चेतावनी के लिए @Nick से साभार)

mysqlcheckकमांड का उपयोग करने का प्रयास करें । एक टर्मिनल पर:

mysqlcheck -u username -p --databases database1 database2

यह कमांड सभी तालिकाओं की सूची और आपको बताएगा कि क्या किसी प्रकार का भ्रष्टाचार है?

table1  OK
table2  OK
table3  OK
tableN  OK

उसके साथ हाथों में आपको पहले से ही पता चल जाएगा कि आपको किन तालिकाओं की मरम्मत करनी है। यदि आप एक ही बार में सब कुछ ठीक करना चाहते हैं, तो:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

के बारे में अधिक mysqlcheck: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

नोट: आपने अपने प्रश्न को के साथ टैग किया है । मुझे इस बात का कोई मलाल नहीं था कि मैं क्या कर रहा था। यह MySQL का कांटा लगता है, लेकिन मेरे पास यह मानने का कोई कारण नहीं है कि कमांड्स असंगत हैं (उंगलियां पार की गई हैं)।


किसी ने मुझे इस मार्गदर्शिका की ओर इशारा किया जिसमें अधिक महत्वपूर्ण परिस्थितियों के लिए InnoDB डेटाबेस पुनर्प्राप्ति के लिए अधिक विशिष्ट निर्देश हैं जहां संपूर्ण डेटाबेस प्रारंभ नहीं होता है: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-MyISAM-InnoDB-1634.html


1
mysqlcheck 'check table ...' का पर्यायवाची है ... -1
randomx


सच नहीं। सबसे पहले, mysqlcheck एक कमांड-लाइन यूटिलिटी है और CHECK TABLE एक SQL स्टेटमेंट है (यह नारंगी की तुलना नींबू की तरह करना है)। इसके अलावा, आप SQL स्टेटमेंट में सभी टेबल नामों के बिना CHECK TABLE के साथ एक पूरे डेटाबेस की जांच नहीं कर सकते। यह बहुत उत्पादक भी नहीं होगा)
marcio

और mysqlcheck के पास एक विकल्प है - ऑटो मरम्मत करने वाली तालिकाओं की मरम्मत जबकि CHECK TABLE केवल यह जांचती है कि टेबल भ्रष्ट हैं या नहीं, लेकिन कोई मरम्मत नहीं कर सकता।
marcio

2
@randymelder - आपको कहना गलत है कि mysqlcheck इसका पर्याय है CHECK TABLE। प्रलेखन आप राज्यों से जुड़ा हुआ: " mysqlcheckका उपयोग करता है SQL कथन CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, और OPTIMIZE TABLEउपयोगकर्ता के लिए एक सुविधाजनक तरीके से यह जो बयान आपरेशन, जो आप चाहते के लिए उपयोग करने के लिए निर्धारित करता है, और उसके बाद सर्वर से बयान निष्पादित करने के लिए भेजता है।। " वह पर्यायवाची नहीं है; वह बयानों के संग्रह के लिए एक उपयोगकर्ता इंटरफ़ेस है।
निक चामास

6

MySQL 5.0 प्रमाणन अध्ययन गाइड के अनुसार , पृष्ठ 443,444 धारा 30.4 :

आप CHECK TABLE कमांड का उपयोग करके या आपके लिए स्टेटमेंट जारी करने के लिए क्लाइंट प्रोग्राम का उपयोग करके InnoDB टेबल की जांच कर सकते हैं। हालाँकि, यदि किसी InnoDB तालिका में समस्या है, तो आप इसे REPAIR TABLE का उपयोग करके ठीक नहीं कर सकते क्योंकि यह कथन केवल MyISAM पर लागू होता है।

यदि एक टेबल चेक इंगित करता है कि एक InnoDB तालिका में समस्याएं हैं, तो आपको तालिका को mysqldump के साथ डंप करके, उसे छोड़ कर, और उस डंप से इसे पुनः बनाकर एक सुसंगत स्थिति में पुनर्स्थापित करने में सक्षम होना चाहिए।

एक MySQL सर्वर के दुर्घटनाग्रस्त होने की स्थिति में या जिस पर यह चलता है उस होस्ट पर, कुछ InnoDB तालिकाओं को मरम्मत की आवश्यकता हो सकती है। आम तौर पर, यह केवल सर्वर को पुनरारंभ करने के लिए पर्याप्त होता है क्योंकि इनोबीडी स्टोरेज इंजन अपने स्टार्टअप अनुक्रम के भाग के रूप में ऑटो-रिकवरी करता है। दुर्लभ मामलों में, InnoDB ऑटो-रिकवरी की विफलता के कारण सर्वर शुरू नहीं हो सकता है। यदि ऐसा होता है, तो निम्न प्रक्रिया का उपयोग करें:

  • 1 से 6 तक क्रोध में एक मूल्य के लिए सेट --innodb_force_recovery विकल्प के साथ सर्वर को पुनरारंभ करें। ये मान किसी क्रैश से बचने में सावधानी के बढ़ते स्तर, और बरामद तालिकाओं में संभावित असंगतता के बढ़ते स्तर के संकेत देते हैं। 4 के साथ शुरू करने के लिए एक अच्छा मूल्य है।

  • जब आप सर्वर को एक गैर-शून्य मान पर सेट --innodb_force_recovery के साथ शुरू करते हैं, तो InnoDB रीड-ओनली के रूप में तालिकाओं का व्यवहार करता है। नतीजतन, आपको mysqldump के साथ InnoDB तालिकाओं को डंप करना चाहिए और फिर विकल्प के प्रभावी होने पर उन्हें छोड़ देना चाहिए। फिर सर्वर को --innodb_force_recovery विकल्प के बिना पुनः आरंभ करें। जब सर्वर ऊपर आता है, तो डंप फ़ाइलों से InnoDB तालिकाओं को पुनर्प्राप्त करें।

  • यदि पूर्ववर्ती चरण विफल होते हैं, तो पिछले बैकअप से InnoDB तालिकाओं को पुनर्स्थापित करना आवश्यक है।

कृपया InnoDB जबरन वसूली पर MySQL डॉक्स पढ़ें  


3
FWIW, प्रमाणन गाइड का बहुत ही राजनीतिक रूप से सही उत्तर है :) यदि आप एक InnoDB टेबल पर चेक करते हैं और यह वास्तव में भ्रष्ट है, तो यह कभी भी "भ्रष्ट" के रूप में वापस नहीं आएगा, यह सर्वर को क्रैश कर देगा। InnoDB में कथन लगभग अप्रचलित है, क्योंकि हर बार जब आप InnoDB पृष्ठ पढ़ते हैं तो यह भ्रष्टाचार (पेज चेकसम के माध्यम से) की जाँच कर रहा होता है।
मॉर्गन टॉकर

2

मुझे आश्चर्य है कि क्या होता है अगर कोई InnoDB प्लगइन के माध्यम से बनाए गए InnoDB डेटा का उपयोग करता है और फिर InnoDB के किसी अन्य संस्करण पर स्विच करता है। यह mysqld की नजर में संभावित पेज करप्शन पैदा कर सकता है।

ध्यान दें कि इस संभावना के बारे में InnoDB फ़ाइल स्वरूप पर MySQL प्रलेखन क्या कहता है:

सामान्य तौर पर, InnoDB का एक नया संस्करण एक टेबल या इंडेक्स बना सकता है, जो दुर्घटनाओं, हैंग, गलत परिणामों या भ्रष्टाचारों के जोखिम के बिना InnoDB के पूर्व संस्करण के साथ सुरक्षित रूप से पढ़ा या लिखा नहीं जा सकता है। इनोबीडी प्लगइन इन स्थितियों से बचाव के लिए एक नया तंत्र पेश करता है, और डेटाबेस फाइलों और इनोबीडी के संस्करणों के बीच संगतता को बनाए रखने में मदद करता है।

मैं गुलाम पर डेटा स्क्रैप करेगा। वास्तव में, मैं सिर्फ डेटा के एक तार्किक डंप (mysqldump) प्राप्त करके जानवर बल का उपयोग करेगा:

  • गुलाम पर InnoDB का उपयोग कर सभी डेटाबेस ड्रॉप
  • शटडाउन mysql गुलाम पर
  • दास पर ibdata1, ib_logfile0 और ib_logfile1 हटाएं
  • Ibdata1, ib_logfile0 और ib_logfile1 को पुनः प्राप्त करने देते हुए गुलाम पर mysql शुरू करें
  • mysqldump ने स्वामी से डेटा गुलाम में लिया

मेरी पोस्ट की गई ऑरिजनल ऑवर को 'पुराना स्कूल' माना जाता है। फिर भी, इस मामले में, मैं निश्चित रूप से .ibd और / या ibdata1 द्वारा उपयोग किए जा रहे फ़ाइल स्वरूपों को देखूंगा।

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