उत्तर का पहला भाग खुशखबरी है... कि mysqlcheck -o
OPTIMIZE TABLE
. चलाने से आपके डेटाबेस को नुकसान पहुंचने की कोई संभावना नहीं है हर टेबल पर, क्योंकि बस यही करता है। यह एक सुविधा उपयोगिता है जो सर्वर में लॉग इन करती है, तालिकाओं की एक सूची प्राप्त करती है, और उनके माध्यम से पुनरावृति करती है, एक OPTIMIZE TABLE
भेजती है सर्वर से एक समय में एक टेबल के लिए क्वेरी करें, जब तक कि यह पूरा न हो जाए।
अब, कुछ बुरी खबर। यदि आपके टेबल स्पेस में गुप्त भ्रष्टाचार है, OPTIMIZE TABLE
इसमें भाग ले सकते हैं, इसलिए आपको निश्चित होना चाहिए कि आप बैकअप और पुनर्प्राप्ति योजना के साथ उस संभावना के लिए तैयार हैं। इसकी संभावना काफी दूर है, लेकिन यह है एक संभावित परिणाम।
इससे भी बुरी खबर:लगभग निश्चित रूप से गलत पेड़ को काट रहे हैं।
अपाचे और माईएसक्यूएल को एक ही मशीन पर महत्वपूर्ण ट्रैफिक के साथ चलाना - या महत्वपूर्ण ट्रैफिक भिन्नता - सर्वोत्तम प्रथाओं के खिलाफ है और समस्याओं के लिए एक नुस्खा है, क्योंकि दोनों सेवाएं लोड के तहत अपनी मेमोरी खपत को बढ़ाती हैं, और यदि डेटाबेस समर्थन है वेब साइट डेटा के लिए स्टोर करें, फिर बढ़ा हुआ लोड एक ही समय में दोनों सेवाओं पर होता है।
डेटाबेस एडमिनिस्ट्रेटर स्टैक एक्सचेंज पर InnoDB क्रैश पोस्ट मॉर्टम के लिए मेरा जवाब देखें और अपाचे क्यों जंगली चल रहा है और MySQL को मार रहा है सर्वर फॉल्ट पर इस काफी सामान्य समस्या के पूर्ण कवरेज के लिए, जहां MySQL पीड़ित है, किसी भी चीज़ से अधिक।
ध्यान दें कि इससे कोई फर्क नहीं पड़ता कि आप InnoDB का उपयोग कर रहे हैं या नहीं। MySQL त्रुटि लॉग में डेटाबेस पुनर्प्राप्ति प्रविष्टियां थोड़ी अलग होंगी, लेकिन मृत सस्ता यह है:कुछ भी संदिग्ध नहीं होने से पहले, MySQL त्रुटि लॉग कहता है:
mysqld_safe Number of processes running now: 0
उसके बाद आने वाले संदेशों को अक्सर MySQL "क्रैशिंग" के रूप में गलत समझा जाता है, लेकिन ऐसा नहीं हो रहा है ... इसे मार दिया गया है। जब तक अपाचे शांत नहीं हो जाता या फिर से चालू नहीं हो जाता, या सर्वर रिबूट नहीं हो जाता, तब तक MySQL पुनरारंभ करने से मना कर सकता है। फिर से, त्रुटि लॉग से, आप अतिरिक्त रूप से ऐसा कुछ देख भी सकते हैं और नहीं भी देख सकते हैं:
InnoDB: Initializing buffer pool, size = 4.0G
InnoDB: mmap(4395630592 bytes) failed; errno 12
InnoDB: Completed initialization of buffer pool
InnoDB: Fatal error: cannot allocate memory for the buffer pool
[ERROR] Aborting
[Note] /usr/libexec/mysqld: Shutdown complete
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
/var/log/syslog
की जांच की जा रही है या /var/log/messages
(आप किस डिस्ट्रो को चलाते हैं उसके आधार पर) आपको असली समस्या दिखाएगा।
$ sudo egrep 'kernel|oom' /var/log/syslog
...या संदेश... कुछ इस तरह से शुरू होने वाली कई प्रविष्टियों को प्रकट करना चाहिए:
kernel: pcscd invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0
अपाचे इतनी मेमोरी भूख लगी है कि सिस्टम को समग्र अस्थिरता का खतरा है, इसलिए "कुछ" बलिदान हो जाता है। वह "कुछ" MySQL सर्वर डेमॉन होने की संभावना है, mysqld
।
kernel: Out of memory: Killed process 3044, UID 27, (mysqld)
MySQL आमतौर पर अपने आप को पुनरारंभ करने का प्रयास करेगा, और आप सभी जानते हैं, यह कभी-कभार भी हो सकता है ... हार मान लो।
तालिकाओं के अनुकूलन के अपने मान्य अनुप्रयोग हैं... लेकिन, इस मामले में, यदि मैंने आपकी समस्या की सही पहचान कर ली है, तो यह डूबते जहाज टाइटैनिक. पर डेक कुर्सियों को पुनर्व्यवस्थित करने के लिए काफी तुलनीय होगा। यह आपको कुछ डिस्क स्थान बचा सकता है, लेकिन चलते समय यह आपको कुछ अतिरिक्त डिस्क स्थान भी खर्च करेगा क्योंकि कुछ स्टोरेज इंजन तालिका की पूरी तरह से नई प्रतिलिपि बनाते हैं, फिर प्रतिलिपि का नाम बदलें और पुरानी तालिका को हटा दें। किसी भी घटना में, स्मृति खपत पर इसका कोई सार्थक प्रभाव होने की संभावना नहीं है।