बिजली चली गई - क्या क्वेरी खत्म हो गई?


9

क्या जांच और देखने का कोई तरीका है कि कोई प्रश्न समाप्त हुआ? जब मैं पिछले सप्ताह छुट्टी के लिए बाहर गया तो मैंने 3 बहुत लंबे समय तक चलने वाले अपडेट क्वेश्चन (+/- 25 घंटे प्रत्येक) चलाए। दुर्भाग्य से, सप्ताह के दौरान कहीं बिजली चली गई और MYSQL चलाने वाली मशीन बंद हो गई। क्या यह जांचने और देखने का कोई तरीका है कि 3 (या तीनों) प्रश्नों में से कौन सा पूरा हुआ?

मुझे पता है कि मैं यह देखने के लिए जांच कर सकता हूं कि क्या डेटा अपडेट किया गया था, लेकिन NULL को एक सही और पूर्ण निष्पादन के साथ होने की उम्मीद है और डेटा के 48 मिलियन पंक्तियों को भ्रमित करने के लिए है। कोई विचार?

mysql 

6
लॉग ... यदि आप चीजों को लॉग करते हैं। यदि आप मुझे शुरू करने की सलाह नहीं देते।
बेन

1
मुझे पता है - यूपीएस और ट्रांसेक्शनल प्रोसेसिंग की सिफारिश करने में बहुत देर हो चुकी है, मुझे लगता है।

1
यदि आप InnoDB का उपयोग कर रहे हैं तो आप अपना कोड लेनदेन में कर सकते हैं। dev.mysql.com/doc/refman/5.0/en/commit.html

1
यदि आपने धीमी क्वेरी लॉगिंग चालू की थी, तो धीमी क्वेरी लॉग में धीमे धीमे समाप्त होने वाले प्रश्नों पर विचार किया जाएगा।

3
और, अगर यह ठीक से पूरा नहीं हुआ, तो क्या आपके पास बैकअप है?

जवाबों:


9

यदि आप बाइनरी लॉग के साथ चल रहे हैं तो यह अपेक्षाकृत उच्च विश्वसनीयता के साथ जांचा जा सकता है।

सबसे पहले, यह देखने के लिए कि क्या बाइनरी लॉग वास्तव में सक्षम हैं, चलाएं:

SHOW BINARY LOGS;

यदि वे सक्षम हैं, तो आपको इस तरह एक आउटपुट मिलना चाहिए:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

अन्यथा आपको एक त्रुटि संदेश मिलेगा।

अब, यदि बाइनरी लॉग्स सक्षम हैं, तो किसी भी सफल कमेंट को बाइनरी लॉग भी लिखा जाता है। मैं कहता हूं "प्रतिबद्ध", लेकिन सत्य कोई भी सफल संचालन है, यहां तक ​​कि MyISAM जैसी गैर-लेन-देन तालिकाओं पर भी लिखा जाता है। लेकिन, ईमानदार होने के लिए, आपके प्रश्नों के परिणाम के बारे में कोई निश्चितता रखने के लिए, मैं आपके लिए उम्मीद करता हूं कि आप एक ट्रांसेक्शनल इंजन का उपयोग कर रहे हैं जैसे कि InnoDB, या फिर आप कुछ भी सुनिश्चित नहीं कर सकते।

ठीक है, इसलिए अब मान लें कि आपके पास बाइनरी लॉग ऑन हैं, और यह कि आपकी टेबल ट्रांजेक्शनल हैं (उम्मीद है कि InnoDB), तो आपके प्रश्नों का एक सफल समापन बाइनरी लॉग में लिखे जाने की उम्मीद है।

अब आपको प्रासंगिक बाइनरी लॉग का शिकार करना होगा और वहां क्वेरी की तलाश करनी होगी। यदि आप क्वेरी पाते हैं - अच्छा! यदि नहीं - यह सबसे शायद नहीं है। मैं जल्द ही समझाता हूँ।

किस बाइनरी लॉग में आपकी क्वेरी है? बाइनरी लॉग फ़ाइलों को स्वयं देखें, आमतौर पर आपकी डेटा निर्देशिका में। उनके टाइमस्टैम्प के लिए देखो। जब शक्ति बढ़ी, तो एक नया बाइनरी लॉग बनाया गया था। इसे खोजें। आपके प्रश्न शायद बाइनरी लॉग वन में सबसे पहले हैं । यह एक अनुमान है। यह उससे पहले भी एक हो सकता है, आदि लेकिन यह एक अच्छा अनुमान है।

अब, mysqlbinlogउपयोगिता का उपयोग , कमांड लाइन से निष्पादित, कुछ इस तरह से:

mysqlbinlog mysql-bin.000245

उस फ़ाइल का नाम बदलें, जिसमें आपको संदेह है कि वह क्वेरी है।

यह इस बाइनरी लॉग फ़ाइल में सभी प्रश्नों को मानक आउटपुट में आउटपुट करेगा। यूनिक्स पर, grepअपनी क्वेरी खोजने के लिए उपयोग करें:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

विंडोज पर, शुभकामनाएँ। नोटपैड ++ या कुछ और के साथ खोलें और मैन्युअल रूप से खोजें।

वहाँ क्वेरी है? महान - आप जानते हैं कि यह प्रतिबद्ध है।

क्या क्वेरी नहीं है? sync_binlogपरम पर जांच की जरूरत है । यह 1 है ? फिर बाइनरी लॉग में क्वेरी नहीं ==> क्वेरी प्रतिबद्ध नहीं है। लेकिन अगर 1sync_binlog नहीं है , तब भी एक मौका हो सकता है कि क्वेरी अभी तक बाइनरी लॉग में नहीं की गई है, क्योंकि बाइनरी लॉग डिस्क में फ्लश होने के ठीक पहले और बाद में क्रैश हो सकता है । आपको फिर अन्य साधनों पर वापस जाने की आवश्यकता है।commit

वे जा रहे हैं: (और उम्मीद है, फिर से, आप InnoDB का उपयोग कर रहे हैं): एक एकल पंक्ति की तलाश करें जो क्वेरी के परिणाम की पहचान कर सकती है। InnoDB के साथ आपको "सभी या कुछ भी नहीं" मिलता है। यदि आप क्वेरी से प्रभावित किसी एक पंक्ति के बारे में निश्चित हो सकते हैं - तो आप सुनिश्चित कर सकते हैं कि क्वेरी पूरी हो गई है।

संपादित करें: बेशक, यदि धीमी लॉग सक्षम है, तो आप उम्मीद कर सकते हैं कि इस तरह की लंबी क्वेरी लॉग के पूरा होने के बाद भी हो सकती है ...

सौभाग्य!


2
मुझे आशा है कि आप चारों ओर चिपकेंगे।
jcolebrand

2
@jcolebrand रोलैंडो यहाँ पर कुछ प्रतियोगिता के साथ कर सकता था :)
Phil
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.