क्या Apache httpd के लिए mysql के लिए एक सुंदर या सुरक्षित पुनरारंभ है?


29

मैं अपने आप को httpd की तरह ही शालीनतापूर्वक पुनः आरंभ करना चाहूँगा जहाँ पुनः आरंभ करने से पहले धागे परोसे जाते हैं। मैं प्रश्नों को तोड़ना पसंद करूंगा।

जवाबों:


37

MySQL (शॉर्ट kill -9) में कोई भी "अनुरोधित" शटडाउन अनुक्रम कुछ हद तक सुशोभित है , क्योंकि लेन-देन प्रगति में है (लेन-देन तालिकाओं पर) वापस लुढ़का हुआ है, लेकिन यहां कुछ तरीके हैं जो संभव के रूप में साफ करने के लिए पुनरारंभ करें।

नोट: यदि आप सर्वर को अपग्रेड के लिए बंद कर रहे हैं, तो इस प्रक्रिया का उपयोग न करें; इसके बजाय, इस उत्तर में विस्तृत प्रक्रिया का पालन करें ।

अन्यथा, यदि आप एक अन्यथा स्वस्थ सर्वर को फिर से शुरू कर रहे हैं ताकि आप केवल पढ़ने के लिए वैश्विक चर या कुछ इसी तरह बदल सकें, तो यहां एक अनुग्रह मार्ग है:

पहले, innodb_fast_shutdownअगर यह पहले से ही सक्षम नहीं है। यह सीधे शटडाउन की शालीनता से संबंधित नहीं है, लेकिन यह आपके सर्वर को तेजी से वापस लाना चाहिए।

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

अगला, सर्वर को सभी खुली तालिकाओं को बंद करने का निर्देश दें जैसे ही वर्तमान में चल रहे प्रश्नों को संदर्भित नहीं कर रहे हैं। इस कदम का शालीन बंद से भी कोई लेना-देना नहीं है, लेकिन यह बाद के कदम को और तेज कर देगा:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLESबयान (वैकल्पिक साथ LOCALकीवर्ड, जो किसी भी गुलामों की एक अनावश्यक लेकिन अन्यथा हानिरहित फ्लश से बचा जाता है) को अवरुद्ध कर देगा और अपने संकेत देगा वापस नहीं जब तक तालिकाओं के सभी बंद किया जा सकता। एक बार जब प्रत्येक तालिका को "फ्लश" कर दिया जाता है (बंद), यदि कोई क्वेरी बाद में तालिका का संदर्भ देती है, तो यह स्वचालित रूप से फिर से खोल दी जाएगी, लेकिन यह ठीक है। हम इस कदम के साथ पूरा कर रहे हैं अंतिम चरण के लिए कम काम कर रहा है:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

यह कथन सभी तालिकाओं को फ्लश करता है (इसलिए इससे कुछ लाभ प्राप्त करने का तरीका पूर्ववर्ती कदम से कम विघटनकारी है) और उन पर एक वैश्विक (सर्वर-वाइड) रीड-ओनली लॉक प्राप्त करता है।

आपके पास एक वैश्विक रीड लॉक नहीं हो सकता है जब तक कि वर्तमान में चल रहे "लिखना" क्वेरी (यानी, बहुत ज्यादा सब कुछ लेकिन SELECT) नहीं किया जाता है। लॉक अनुरोध जारी करने से मौजूदा प्रश्न समाप्त हो जाएंगे, लेकिन नए लोगों को शुरू करने की अनुमति नहीं होगी।

जब तक आप इस वैश्विक लॉक को नहीं पकड़ते, तब तक आपका प्रॉम्प्ट वापस नहीं आता है , इसलिए जब आप अनुरोध करते हैं कि लॉक खत्म होने में सक्षम है, और आप जानते हैं कि वे समाप्त हो गए हैं, तो हर क्वेरी प्रगति पर है। किसी भी तालिका में कुछ भी लिखने की कोशिश करने वाले किसी भी बाद के प्रश्नों को केवल स्टाल, कोई डेटा नहीं बदलना होगा, ताला के लिए अनिश्चित काल तक इंतजार करना, ...

  • आप पुनरारंभ के बारे में अपना विचार बदलते हैं और लॉक को मैन्युअल रूप से जारी करते हैं ( UNLOCK TABLES;)
  • आप सर्वर को पुनरारंभ करें, या
  • आप गलती से या जानबूझकर इस थ्रेड से कमांड लाइन क्लाइंट को डिस्कनेक्ट कर दें (ताकि ऐसा न करें)। इस विंडो को कनेक्ट रखें और mysql प्रॉम्प्ट पर बैठे:

इसे बंद करने के प्रलोभन का विरोध करें।

mysql>

यह आइडल कंसोल प्रांप्ट है जो आपके लिए ग्लोबल लॉक को होल्ड कर रहा है। यह खोना, ताला खोना।

किसी अन्य कंसोल विंडो से, MySQL को सामान्य तरीके से रीस्टार्ट करें, जिसमें या तो इनस्क्रिप्ट (जैसे, आपका लोकल वेरिएंट service mysql.server restart) या mysqladmin shutdownमैनुअल रीस्टार्ट के साथ।


क्या innodb_fast_shutdown = 1वास्तव में यह सुनिश्चित करना कि MySQL तेजी से शुरू होता है? डॉक्स को देखते हुए, ऐसा लगता है कि यह शटडाउन गति (स्टार्टअप गति की कीमत पर?) में सुधार करता है।
क्रिस

@ यह विचार है कि यह सुनिश्चित करने में मदद करता है कि संपूर्ण शटडाउन + स्टार्टअप व्यावहारिक के रूप में त्वरित है, लेकिन यह कुछ हद तक महत्वपूर्ण है क्योंकि काम की मात्रा सैद्धांतिक रूप से समान है - बस अनुक्रम के दूसरी तरफ ले जाया गया - अभी तक किसी कारण से, यह आम तौर पर समग्र रूप से तेजी से प्रतीत होता है, जैसे कि शायद यह शटडाउन में कुछ अक्षमता है जो स्टार्टअप पर नहीं है। बताना कठिन है।
माइकल - sqlbot

2

संक्षेप में, MySQL को बंद करने से पहले कुछ सर्वोत्तम प्रथाओं पर विचार किया जाना चाहिए:

  1. उस उदाहरण की पुष्टि करें जिसे आप गलती से किसी अन्य उदाहरण को रोकने के लिए बंद करने जा रहे हैं।
  2. यदि आप किसी दास को बंद करने जा रहे हैं, तो प्रतिकृति को रोकें mysql> STOP SLAVE;
  3. शटडाउन समय को कम करने के लिए पहले से गंदे पन्नों को फ्लश करें mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
  4. लंबे समय तक चलने वाले प्रश्नों की जाँच करें mysql> SHOW PROCESSLIST;, उन्हें मारें mysql> kill thread_id;या समाप्त होने तक प्रतीक्षा करें।
  5. बफर पूल को शटडाउन पर डंप करें और बफर पूल को वार्मअप करने के लिए mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;इसे स्टार्टअप पर पुनः लोड करें # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON

फिर पिछले बिंदुओं की पुष्टि करने के बाद, आप सुरक्षित रूप से MySQL पुनः आरंभ कर सकते हैं shell$ service mysql restart

अधिक जानकारी के लिए, MySQL को बंद करने से पहले मेरी पोस्ट देखें।


इसे क्यों ठुकरा दिया गया? मैं यह नहीं जान पाया कि कौन सी आज्ञा खराब है, लेकिन मैं जानना चाहता हूं ताकि मैं उनसे बच सकूं।
जॉन

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