MySQL टेबल क्यों क्रैश होते हैं? मैं इसे कैसे रोकूं?


9

मैं एक Moodle साइट का व्यवस्थापक हूं, जिसकी उपयोगकर्ता तालिका दूषित थी और यह अनुपयोगी हो गई थी।

सौभाग्य से, एक साधारण REPAIR TABLE mdl_userने इसे फिर से काम किया। बात यह है कि मुझे नहीं पता कि यह वास्तव में क्यों दुर्घटनाग्रस्त हो गया और इसे अनुपयोगी बना दिया, और मैं यह सुनिश्चित करना चाहता हूं कि मैं अगली बार बेहतर तैयार हूं।

मैं एक अच्छी तरह से अनुभवी डीबीए नहीं हूं - मैं सिर्फ एक डेवलपर हूं जो बहुत सारे सामान करता है, इसलिए कृपया मेरे साथ रहें।

मैं बस एक बैकअप बहाल कर सकता था, लेकिन मुझे लगता है कि क्रैश को रोकने के तरीके हैं।

उन तालिकाओं utf8_general_ci और MyISAM का उपयोग कर रहे हैं।

MySQL टेबल क्रैश क्यों होता है? ऐसा होने से रोकने के लिए मैं क्या कर सकता हूं?

जवाबों:


11

यह दुर्घटना के लिए एक MyISAM तालिका के लिए आसान है।

प्रत्येक MyISAM तालिका के हेडर में एक काउंटर होता है जो ट्रैक करता है कि टेबल के खिलाफ कितनी खुली फ़ाइल हैंडल हैं।

यदि आप mysql शुरू करते हैं और हेडर में संख्या वास्तविक फ़ाइल हैंडल की संख्या से मेल नहीं खाती है, तो mysqld तालिका को दुर्घटनाग्रस्त मानता है।

यदि एक साधारण REPAIR TABLE mdl_userडेटा के नुकसान के बिना हर बार इसे फिर से काम करता है, तो यह संकेत दे सकता है कि आपके पास एक बहुत ही तस्करी वाली साइट है जो लिखती है mdl_user

यदि दर्जनों तालिकाओं की आवश्यकता होती है REPAIR TABLE, तो मैं सभी तालिकाओं को InnoDB में बदल दूंगा। हालाँकि, यदि mdl_userतालिका इस समस्या के साथ एकमात्र तालिका है, तो कुछ ऐसा है जिसे आप कर सकते हैं (उदाहरण के लिए, मान लें कि डेटाबेस है moodle);

यदि आप चाहते हैं कि सभी टेबल MyISAM के रूप में बचे

चरण 01: एक मरम्मत तालिका स्क्रिप्ट बनाएँ

echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql

चरण 02: मरम्मत स्क्रिप्ट को स्टार्टअप फ़ाइल के रूप में घोषित करें

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

[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql

चरण 03: mysql को पुनरारंभ करें

Mysql का हर रीस्टार्ट रिपेयर टेबल स्क्रिप्ट को ट्रिगर करेगा

यदि आप चाहते हैं कि सभी टेबल InnoDB बनें

MyoAM तालिकाओं के एक थोक रूपांतरण स्क्रिप्ट को InnoDB में बनाने के लिए इस कोड को चलाएं और इसे देखें

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql

एक बार जब आप रूपांतरण स्क्रिप्ट की सामग्री से संतुष्ट हो जाते हैं, तो उसे चलाएं

mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql

UPDATE 2012-03-15 14:00 EDT

@ केविन , MyISAM का उपयोग करते समय, यदि डिस्क स्थान से बाहर चल रहा है तो आपका क्या है?

यहाँ कुछ विचार करने के लिए है: MySQL 5.0 प्रमाणन अध्ययन गाइड के अनुसार ,

यहां छवि विवरण दर्ज करें

बुलेटपॉइंट # 11 पेज 408,409 पर निम्नलिखित 29.2 कहता है:

यदि आप एक MyISAM तालिका में पंक्तियों को जोड़ते समय डिस्क स्थान से बाहर निकलते हैं, तो कोई त्रुटि नहीं होती है। सर्वर ऑपरेशन को निलंबित कर देता है जब तक कि अंतरिक्ष उपलब्ध नहीं हो जाता है, और फिर ऑपरेशन पूरा करता है।

जब आप डिस्क स्थान से बाहर निकलते हैं, तो mysql को केवल बंद या मार न दें। किसी भी समय उपयोग किए जाने वाले MyISAM में खुले फ़ाइल हैंडल की गिनती को साफ़ नहीं किया जाएगा। इस प्रकार, MyISAM तालिका दुर्घटनाग्रस्त हो गई है। यदि आप अभी भी चल रहे mysqld के साथ डेटा वॉल्यूम में डिस्क स्थान खाली कर सकते हैं, तो डिस्क स्थान उपलब्ध होने पर mysqld सैनिक होगा।


बहुत बढ़िया प्रतिक्रिया। फ़ाइल के बिट्स को नहीं जानता था, और आपने पहले ही हल कर लिया है कि कुछ गलत होने पर मैं कैसे (या स्वचालित रूप से मरम्मत) को रोक सकता हूं। सुरक्षा के लिए कोई सुझाव यदि साइट वास्तव में mdl_user (या किसी अन्य तालिका) को बहुत कुछ लिखती है?
एयरोक्रॉस

आपको तीन काम करने चाहिए: 1) रैम बढ़ाएं, 2) अधिकतम_कनेक्ट बढ़ाएं, 3) इनोबीडी पर स्विच करें।
रोलैंडमाइसीडीडीबीए

Noob यहाँ। मैं इस कोड को "कहां" चलाता हूं? सर्वर पर अपलोड की गई फ़ाइल से या कुछ कमांड लाइन से?
शर्त के

0

मैं mysql पर एक मूडल साइट भी प्रशासित करता हूं, और हमारे लिए तालिका भ्रष्टाचार का सबसे आम कारण डिस्क स्थान से बाहर चल रहा है।


@RolandoMySQLDBA - हाँ, डिस्क स्थान निश्चित रूप से समस्या है (सामान्य रूप से कुछ अन्य प्रक्रियाओं और प्रबंधन दर्शन से संबंधित)। दुर्भाग्य से, हम समस्या को स्वयं हल नहीं करते हैं जब अंतरिक्ष को साफ किया जाता है, या यह समय पर पर्याप्त गोलीबारी में खुद को हल नहीं करता है। मेरी प्रतिक्रिया सिर्फ यह बताने के लिए थी कि हमारे मनोदशा / मायस्कल उदाहरण के साथ, डिस्क स्थान की समस्याएं टेबल क्रैश का कारण बन सकती हैं, भले ही mysql / myisam क्या करना है।
केविन

-3

मुझे सभी तालिकाओं को InnoDB में बदलने के लिए एक अच्छी लाइन मिली:

mysql -u root -p dbName -e "show table status where Engine='MyISAM';" | 
    awk 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
    mysql -u root -p dbName

इसके लिए कोड ठीक हो सकता है लेकिन यह पहले भाग के सवाल का जवाब नहीं देता (एक MySQL टेबल क्रैश क्यों होता है?)। यदि आपका मतलब है कि यह दूसरे भाग का जवाब देता है (इसे कैसे रोका जाए?), कुछ और स्पष्टीकरण जोड़ें, कृपया।
ypercube y

अधिक विवरण भी जोड़ें। क्या इसे चलाने से डेटाबेस में सभी टेबल बदल जाएंगे? या पूरा सर्वर? यदि तालिका बदलने में विफल रहती है और हमें एक त्रुटि मिलती है तो क्या होगा? यह संभव है कि हम कुछ तालिकाओं को परिवर्तित कर दें और कुछ MyiSAM में छोड़ दें? सामान्य तौर पर, डीबीए को इसे चलाने से पहले किन अन्य बातों पर विचार करना चाहिए?
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.