यह दुर्घटना के लिए एक 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 सैनिक होगा।