MySQL सर्वर पर चलने वाले प्रश्नों को कैसे कैप्चर करें?


14

हम कुछ सर्वर प्रदर्शन डिबगिंग करने की कोशिश कर रहे हैं और मैं कुछ मिनटों की अवधि में हमारे MySQL सर्वर पर चलाए जा रहे प्रश्नों का स्नैपशॉट कैप्चर करना चाहूंगा।

मैं MySQL से परिचित हूं SHOW FULL PROCESSLIST, हालांकि मैं इसे कमांड लाइन के माध्यम से चलाना चाहता हूं, इसलिए मैं इसे एक फाइल में डंप कर सकता हूं और इसे प्रोसेस कर सकता हूं।

क्या इस क्वेरी को किसी फ़ाइल में आउटपुट करने का कोई तरीका है और क्या यह हर सेकंड या तो चलता है?

क्या सभी प्रकार के प्रश्नों को चलाया जा रहा है?

ध्यान दें कि मुझे केवल धीमी क्वेरी में दिलचस्पी नहीं है (मैं धीमी क्वेरी लॉग से परिचित हूं)।


आप कौन सा ओएस चला रहे हैं? यह लिनक्स पर करना बेहद आसान है, इसलिए मैं विंडोज़ का अनुमान लगा रहा हूं?
पैट्रिक

@ पैट्रिक ग्लैड यह सुनने में आसान है कि यह लिनक्स पर है! आग दूर ...
hafichuk

1
अधिकांश क्वेरीज़ एक सेकंड से भी कम समय में चलेंगी और समाप्त होंगी, और कभी भी आपकी सूची में नहीं दिखाई देंगी।
जोएल कोएल

इसके अलावा लंबे समय तक प्रश्न प्रत्येक लूप के लिए एक बार कई बार दिखाई देंगे, लेकिन अगर आप चाहते हैं कि आप बैश में लूप में बस echo show full processlist | mysqlया बेहतर कर सकते हैं SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"। लाइनों की एक जोड़ी जोड़ें और आप की तुलना में एक ही क्वेरी कार्यक्षमता मिल जाएगा innotopया pt-kill
आस्तिक

जवाबों:


10

मैं धीमी क्वेरी लॉग का उपयोग करूंगा। यह सभी प्रश्नों को पकड़ता है, न कि केवल धीमी गति से, यदि आप long_query_time = 0 सेट करते हैं।

यह सभी प्रश्नों को भी कैप्चर करता है, जो यहां बताई गई टीसीपी-स्निफिंग तकनीकों के बारे में सही नहीं है; उन लोगों को सॉकेट के माध्यम से निष्पादित प्रश्नों पर कब्जा नहीं होगा। SHOW PROCESSLIST देखने के लिए डिट्टो; आप तेजी से चल रहे प्रश्नों को याद करेंगे।

यदि आप प्रोसेसलिस्ट के माध्यम से या टीसीपी ट्रैफ़िक के माध्यम से प्रश्नों को कैप्चर करना चाहते हैं, तो मैं Percona Toolkit के pt-query-digest का उपयोग करने का सुझाव दूंगा। यह आपके लिए प्रक्रिया सूची को प्रदूषित कर सकता है (और परिणामों से समझ बना सकता है, जो करना बहुत कठिन है यदि आप स्वयं इसके नमूनों का एक गुच्छा कैप्चर कर रहे हैं), और यह MySQL के टीसीपी प्रोटोकॉल की व्याख्या कर सकता है, इसलिए आप कुछ टीसीपी ले सकते हैं ट्रैफ़िक और इसका विश्लेषण। बेशक, यह सबसे अच्छा क्वेरी एग्रीगेटर / प्रोफाइलर / रिपोर्टर कभी भी लिखा गया है, लेकिन आपने उन्हें पकड़ने के बाद प्रश्नों के साथ क्या करना चाहते हैं, यह नहीं कहा।


13

सबसे सामान्य तरीका "सामान्य क्वेरी लॉग" का उपयोग करना होगा, जो सभी प्रश्नों को कैप्चर करेगा: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

आप MySQL सर्वर संस्करण को निर्दिष्ट नहीं करते हैं, लेकिन यदि आपके पास 5.1.12 या बाद में आप SQL के माध्यम से वैश्विक चर के साथ सक्षम और अक्षम कर सकते हैं; विवरण के लिए प्रलेखन देखें।


धन्यवाद @ डैनियल। हमने इसे चालू कर दिया है, हालांकि लॉग में कोई टाइमस्टैम्प जानकारी नहीं है। किसी भी विचार कैसे वहाँ में एक टाइमस्टैम्प पाने के लिए?
hafichuk

क्षमा करें, नहीं, आपको मैनुअल इंगित करने के अलावा और कुछ नहीं।
डैनियल पिटमैन

2
Long_query_time = 0 के साथ धीमी क्वेरी लॉग एक बेहतर विकल्प है; यह अभी भी सभी प्रश्नों को कैप्चर करेगा।
बैरन श्वार्ट्ज

बैरन के लिए +1: सामान्य क्वेरी लॉग में आपके द्वारा आवश्यक प्रदर्शन मीट्रिक शामिल नहीं है। धीमी क्वेरी लॉग का विश्लेषण करने के लिए MySQL सर्वर के साथ बंडल किए गए पर्ल स्क्रिप्ट भी हैं (जो कि विधेय से शाब्दिक मूल्यों को हटाते हैं)। लेकिन ध्यान दें कि MySQL के पुराने संस्करण 1 सेकंड से कम के long_query_time का समर्थन नहीं करेंगे - यदि आपके लिए यह मामला है तो नवीनीकरण करें - हाल के संस्करणों में बहुत अधिक प्रदर्शन संवर्द्धन हैं।
सिम्बियन

5

इस कमांड को रूट (या उपयोग sudo) के रूप में आज़माएँ :

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

मिला http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-log/


4

ज़रूर:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

चियर्स


आह ... mysqladmin। बिल्कुल सही, धन्यवाद @ HTTP500
hafichuk

1
यह वास्तव में हर 1 सेकंड में प्रोसेसलिस्ट कमांड चलाता है। कुछ बहुत तेज प्रश्न अभी भी कैप्चर से बच सकते हैं; यदि यह लोड कुछ बड़े प्रश्नों से बना है, तो यह कई छोटे प्रश्नों से बना होगा, यह नहीं हो सकता है।
LSerni

@ इस्मी, ओपी ने "प्रत्येक सेकंड या तो" के लिए कहा।
HTTP500

4

यह मैसकल प्रॉक्सी के लिए एक जगह हो सकती है । यह मूल रूप से आपको भेजे जा रहे प्रश्नों को पकड़ने (और हेरफेर) करने की अनुमति देता है। अवरोधन के लिए एक बुनियादी सेटअप बहुत आसान है। फिर बस प्रॉक्सी पर इंगित करने के लिए अपने क्लाइंट कॉन्फिग को बदलें ताकि आप सभी अनुरोधों को पकड़ सकें।


4

टर्मिनल-आधारित Wireshark कार्यक्रम tshark मदद कर सकता है:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkआपको Amazon Linux पर tshark sudo apt-get install tsharkदेगा और Ubuntu 14+ पर आपको tshark देगा


3

मैंने 'रुई पेड्रो बर्नार्डिनो के समाधान का उपयोग किया। महान काम करता है सिवाय इसके कि मैं पहली पंक्ति में कुछ चीजें बदलकर नीचे दी गई ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

मैं खोज रहा था और खोज रहा था और आखिरकार मैं मोनसॉग सर्वर में निष्पादित होने वाले वास्तविक समय पर सभी प्रश्नों की निगरानी के लिए मोनयोग में उतरा । केवल ध्यान देने योग्य बात यह है कि "Performance_schema" और "statement_digest" तालिका सक्षम होनी चाहिए और Performance_schema है MySQL 5.6.14 और इसके बाद के संस्करण के साथ उपलब्ध है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.