जब आपका डेटाबेस कार्यभार अधिक तनावग्रस्त हो जाता है, तो आप सबसे पहले यह देखना चाहते हैं कि क्वेरी के पैटर्न को देखने के प्रयास में कौन से प्रश्न चल रहे हैं। क्या यह भारी लिखा है? भारी पढ़ें? अड़चन कहां है?
क्वेरी समस्याओं की पहचान करना
इसका पता लगाने के लिए आप सामान्य लॉग या धीमी लॉग को सक्षम कर सकते हैं ताकि चल रहे प्रश्नों को कैप्चर करने का प्रयास किया जा सके और फ़ाइल में लिखा जा सके। आप बाइनरी लॉग से भी पढ़ सकते हैं (जैसा कि बाइनरी लॉग डेटाबेस में सभी परिवर्तनों को कैप्चर करता है) और डेटाबेस में चल रही प्रक्रिया सूची से सीधे पढ़ता है। आप tcpdump को देखकर भी नेटवर्क के नजरिए से क्वेरी को कैप्चर कर सकते हैं।
आगे क्या करना है? आप सामान्य लॉग फ़ाइल, धीमी लॉग फ़ाइल, बाइनरी लॉग में लिखी गई क्वेरी का विश्लेषण कर सकते हैं कि क्या कुछ दिलचस्प चल रहा है (उदाहरण के लिए क्वेरी में बाधा)।
Percona के पास इस प्रकार की क्वेरी का विश्लेषण करने के लिए एक टूल है, जिसका नाम pt-query-digest है। इसे तब शामिल किया जाता है जब आप Percona टूलकिट स्थापित करते हैं, उपयोगिता टूल का एक संग्रह जो DBA को उनके डेटाबेस को प्रबंधित करने में मदद करता है। इस ब्लॉग में हम इस टूल पर एक नज़र डालेंगे और यह कैसे ClusterControl की क्वेरी प्रबंधन सुविधाओं से तुलना करता है।
स्थापना प्रक्रिया
पेरकोना रिपॉजिटरी सेटअप के लिए दो पैकेज लिनक्स वितरण का समर्थन करती है, जो डेबियन-आधारित और आरपीएम-आधारित पैकेज वितरण है। जैसा कि नीचे दिखाया गया है, स्थापना सरल है:
डेबियन-आधारित पैकेज (उबंटू, डेबियन)
पैकेज डाउनलोड करके Percona पैकेज रिपॉजिटरी कॉन्फ़िगर करें
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
और फिर dpkg का उपयोग करके डाउनलोड किए गए पैकेज को इंस्टॉल करें
sudo dpkg -i percona-release_latest.generic_all.deb
उसके बाद, बस पैकेज मैनेजर से इंस्टॉलेशन चलाएं
sudo apt-get install percona-toolkit
RPM- आधारित पैकेज (RHEL, CentOS, Oracle Enterprise Linux, Amazon AMI)
परकोना पैकेज रिपॉजिटरी को सीधे rpm पैकेज इंस्टॉल करके कॉन्फ़िगर करें।
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
उसके बाद, बस पैकेज मैनेजर से इंस्टॉलेशन चलाएं
sudo apt-get install percona-toolkit
Percona उपयोगिताओं को आपकी मशीन में स्थापित किया जाएगा, और आपको बस इसका उपयोग करने की आवश्यकता है।
क्वेरी वर्कलोड एनालिसिस
पीटी-क्वेरी-डाइजेस्ट का उपयोग करके क्वेरी वर्कलोड से आंकड़े उत्पन्न करने के कई तरीके हैं, नीचे एक धीमी क्वेरी फ़ाइल, सामान्य फ़ाइल, डेटाबेस में प्रक्रिया सूची दिखाएं, और बाइनरी लॉग के माध्यम से पढ़ें।
शो प्रोसेसलिस्ट डेटाबेस से जेनरेट करें
pt-query-digest --processlist h=localhost,D=sbt,u=sbtest,p=12qwaszx --output slowlog > /tmp/slow_query.log
धीमी क्वेरी फ़ाइलों / सामान्य क्वेरी फ़ाइल से उत्पन्न करें
pt-query-digest mysql-slow.log > /tmp/slow_query.log
बाइनरी लॉग से उत्पन्न करें। पीटी-क्वेरी-डाइजेस्ट चलाने से पहले, आपको बाइनरी लॉग को mysqlbinlog का उपयोग करके पढ़ने योग्य प्रारूप में निकालने की आवश्यकता है। --टाइप विकल्प जोड़ना न भूलें और स्रोत के रूप में बिनलॉग टाइप करें।
pt-query-digest --type binlog mysql-bin.000001.txt > slow_query.log
फ़ाइल जनरेट करने के बाद, आप नीचे दिखाए गए अनुसार रिपोर्ट देखेंगे:
# 12s user time, 170ms system time, 27.44M rss, 221.79M vsz
# Current date: Sun May 10 21:40:47 2020
# Hostname: n2
# Files: mysql-1
# Overall: 94.92k total, 47 unique, 2.79k QPS, 27.90x concurrency ________
# Time range: 2020-05-10 21:39:37 to 21:40:11
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 949s 6us 1s 10ms 42ms 42ms 2ms
# Lock time 31s 0 1s 327us 80us 11ms 22us
# Rows sent 69.36k 0 490 0.75 0.99 11.30 0
# Rows examine 196.34k 0 490 2.12 0.99 21.03 0.99
# Rows affecte 55.28k 0 15 0.60 0.99 1.26 0
# Bytes sent 13.12M 11 6.08k 144.93 299.03 219.02 51.63
# Query size 15.11M 5 922 166.86 258.32 83.13 174.84
# Profile
# Rank Query ID Response time Calls R/Call V/M Ite
# ==== ============================= ============== ===== ====== ===== ===
# 1 0xCE367F5CFFCAF46E816F682E... 162.6485 17.1% 199 0.8173 0.03 SELECT order_line? stock?
# 2 0x360F872745C81781F8F75EDE... 107.4898 11.3% 14837 0.0072 0.02 SELECT stock?
# 3 0xE0CE1933D0392DA3A42FAA7C... 102.2281 10.8% 14866 0.0069 0.03 SELECT item?
# 4 0x492B86BCB2B1AE1278147F95... 98.7658 10.4% 14854 0.0066 0.04 INSERT order_line?
# 5 0x9D086C2B787DC3A308043A0F... 93.8240 9.9% 14865 0.0063 0.02 UPDATE stock?
# 6 0x5812BF2C6ED2B9DAACA5D21B... 53.9681 5.7% 1289 0.0419 0.05 UPDATE customer?
# 7 0x51C0DD7AF0A6D908579C28C0... 44.3869 4.7% 864 0.0514 0.03 SELECT customer?
# 8 0xFFFCA4D67EA0A788813031B8... 41.2123 4.3% 3250 0.0127 0.01 COMMIT
# 9 0xFDDEE3813C59881488D9C47F... 36.0707 3.8% 1180 0.0306 0.02 UPDATE customer?
# 10 0x8FBBE0AFA061755CCC1C27AB... 31.6417 3.3% 1305 0.0242 0.03 UPDATE orders?
# 11 0x8AA6EB56551923DB9A49E40A... 23.3281 2.5% 1522 0.0153 0.04 SELECT customer? warehouse?
# 12 0xF34C10B3DA8DB048A630D4C7... 21.1662 2.2% 1305 0.0162 0.03 UPDATE order_line?
# 13 0x59DBA67188951C532AFC2598... 20.8006 2.2% 1503 0.0138 0.33 INSERT new_orders?
# 14 0xDADBEB0FBFA537F5D8722F42... 17.2802 1.8% 1290 0.0134 0.03 SELECT customer?
# 15 0x597A805ADA793440507F3334... 16.4394 1.7% 1516 0.0108 0.03 INSERT orders?
# 16 0x1B1EA568857A6AAC6544B44A... 13.9560 1.5% 1309 0.0107 0.05 SELECT new_orders?
# 17 0xCE3EDD98779478DE17154DCE... 12.1470 1.3% 1322 0.0092 0.05 INSERT history?
# 18 0x9DFD75E88091AA333A777668... 11.6842 1.2% 1311 0.0089 0.05 SELECT orders?
# MISC 0xMISC 39.6393 4.2% 16334 0.0024 0.0 <29 ITEMS>
# Query 1: 6.03 QPS, 4.93x concurrency, ID 0xCE367F5CFFCAF46E816F682E53C0CF03 at byte 30449473
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.03
# Time range: 2020-05-10 21:39:37 to 21:40:10
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 0 199
# Exec time 17 163s 302ms 1s 817ms 992ms 164ms 816ms
# Lock time 0 9ms 30us 114us 44us 84us 18us 36us
# Rows sent 0 199 1 1 1 1 0 1
# Rows examine 39 76.91k 306 468 395.75 441.81 27.41 381.65
# Rows affecte 0 0 0 0 0 0 0 0
# Bytes sent 0 15.54k 79 80 79.96 76.28 0 76.28
# Query size 0 74.30k 382 384 382.35 381.65 0 381.65
# String:
# Databases sbt
# Hosts localhost
# Last errno 0
# Users sbtest
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms ################################################################
# 1s ####
# 10s+
# Tables
# SHOW TABLE STATUS FROM `sbt` LIKE 'order_line6'\G
# SHOW CREATE TABLE `sbt`.`order_line6`\G
# SHOW TABLE STATUS FROM `sbt` LIKE 'stock6'\G
# SHOW CREATE TABLE `sbt`.`stock6`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT COUNT(DISTINCT (s_i_id))
FROM order_line6, stock6
WHERE ol_w_id = 1
AND ol_d_id = 1
AND ol_o_id < 3050
AND ol_o_id >= 3030
AND s_w_id= 1
AND s_i_id=ol_i_id
AND s_quantity < 18\G
# Query 2: 436.38 QPS, 3.16x concurrency, ID 0x360F872745C81781F8F75EDE9DD44246 at byte 30021546
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.02
# Time range: 2020-05-10 21:39:37 to 21:40:11
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 15 14837
# Exec time 11 107s 44us 233ms 7ms 33ms 13ms 3ms
# Lock time 1 522ms 15us 496us 35us 84us 28us 23us
# Rows sent 20 14.49k 1 1 1 1 0 1
# Rows examine 7 14.49k 1 1 1 1 0 1
# Rows affecte 0 0 0 0 0 0 0 0
# Bytes sent 28 3.74M 252 282 264.46 271.23 8.65 258.32
# Query size 19 3.01M 209 215 213.05 212.52 2.85 212.52
# String:
# Databases sbt
# Hosts localhost
# Last errno 0
# Users sbtest
# Query_time distribution
# 1us
# 10us #
# 100us ##
# 1ms ################################################################
# 10ms #############
# 100ms #
# 1s
# 10s+
# Tables
# SHOW TABLE STATUS FROM `sbt` LIKE 'stock9'\G
# SHOW CREATE TABLE `sbt`.`stock9`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT s_quantity, s_data, s_dist_01 s_dist
FROM stock9
WHERE s_i_id = 60407 AND s_w_id= 2 FOR UPDATE\G
जैसा कि आप उपरोक्त पीटी-क्वेरी-डाइजेस्ट रिपोर्ट परिणाम में देख सकते हैं, हम 3 भागों में विभाजित कर सकते हैं।
सारांश रिपोर्ट
होस्टनाम सर्वर से शुरू होकर, आप जिस तारीख को कमांड निष्पादित करते हैं, क्वेरी से संबंधित जानकारी लॉग की गई थी, क्यूपीएस, और समय सीमा कैप्चर से, सारांश रिपोर्ट में आपको बहुत सी जानकारी मिल सकती है। इसके अलावा, आप प्रत्येक विशेषता पर समय के आंकड़े भी देख सकते हैं।
# 12s user time, 170ms system time, 27.44M rss, 221.79M vsz
# Current date: Sun May 10 21:40:47 2020
# Hostname: n2
# Files: mysql-1
# Overall: 94.92k total, 47 unique, 2.79k QPS, 27.90x concurrency ________
# Time range: 2020-05-10 21:39:37 to 21:40:11
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 949s 6us 1s 10ms 42ms 42ms 2ms
# Lock time 31s 0 1s 327us 80us 11ms 22us
# Rows sent 69.36k 0 490 0.75 0.99 11.30 0
# Rows examine 196.34k 0 490 2.12 0.99 21.03 0.99
# Rows affecte 55.28k 0 15 0.60 0.99 1.26 0
# Bytes sent 13.12M 11 6.08k 144.93 299.03 219.02 51.63
# Query size 15.11M 5 922 166.86 258.32 83.13 174.84
रैंक के आधार पर क्वेरी प्रोफाइलिंग
आप प्रोफाइलिंग क्वेरी में उपयोगी जानकारी देख सकते हैं।
# Profile
# Rank Query ID Response time Calls R/Call V/M Ite
# ==== ============================= ============== ===== ====== ===== ===
# 1 0xCE367F5CFFCAF46E816F682E... 162.6485 17.1% 199 0.8173 0.03 SELECT order_line? stock?
# 2 0x360F872745C81781F8F75EDE... 107.4898 11.3% 14837 0.0072 0.02 SELECT stock?
कितनी जानकारी है जैसे कि क्वेरी चल रही है, क्वेरी का प्रतिक्रिया समय (प्रतिशत गणना सहित), क्वेरी कितनी कॉल कर रही है, और प्रति कॉल पढ़ता है।
क्वेरी वितरण
क्वेरी वितरण आँकड़े क्वेरी प्रोफाइलिंग रैंक के आधार पर विस्तृत जानकारी का वर्णन करते हैं, आप QPS समवर्ती, क्वेरी विशेषता से संबंधित आँकड़े जानकारी देख सकते हैं।
# Query 1: 6.03 QPS, 4.93x concurrency, ID 0xCE367F5CFFCAF46E816F682E53C0CF03 at byte 30449473
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.03
# Time range: 2020-05-10 21:39:37 to 21:40:10
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 0 199
# Exec time 17 163s 302ms 1s 817ms 992ms 164ms 816ms
# Lock time 0 9ms 30us 114us 44us 84us 18us 36us
# Rows sent 0 199 1 1 1 1 0 1
# Rows examine 39 76.91k 306 468 395.75 441.81 27.41 381.65
# Rows affecte 0 0 0 0 0 0 0 0
# Bytes sent 0 15.54k 79 80 79.96 76.28 0 76.28
# Query size 0 74.30k 382 384 382.35 381.65 0 381.65
# String:
# Databases sbt
# Hosts localhost
# Last errno 0
# Users sbtest
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms ################################################################
# 1s ####
# 10s+
# Tables
# SHOW TABLE STATUS FROM `sbt` LIKE 'order_line6'\G
# SHOW CREATE TABLE `sbt`.`order_line6`\G
# SHOW TABLE STATUS FROM `sbt` LIKE 'stock6'\G
# SHOW CREATE TABLE `sbt`.`stock6`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT COUNT(DISTINCT (s_i_id))
FROM order_line6, stock6
WHERE ol_w_id = 1
AND ol_d_id = 1
AND ol_o_id < 3050
AND ol_o_id >= 3030
AND s_w_id= 1
AND s_i_id=ol_i_id
AND s_quantity < 18\G
क्वेरी समय वितरण, होस्ट, उपयोगकर्ता और डेटाबेस के बारे में भी जानकारी है।
ClusterControl के साथ क्वेरी मॉनिटरिंग
ClusterControl में एक क्वेरी मॉनिटरिंग सुविधा है जिसे आप क्वेरी मॉनिटर टैब में देख सकते हैं जैसा कि नीचे दिखाया गया है।
आप डेटाबेस में निष्पादित क्वेरी से संबंधित जानकारी देख सकते हैं, सांख्यिकीय जानकारी और निष्पादन समय सहित। आप क्वेरी मॉनिटर सेटिंग को भी कॉन्फ़िगर कर सकते हैं जो अभी भी उसी पृष्ठ पर है। सेटिंग्स पर क्लिक करके धीमी क्वेरी और इंडेक्स का उपयोग नहीं करने वाली क्वेरी को सक्षम करने का विकल्प है
आपको बस लंबी क्वेरी समय निर्धारित करने की आवश्यकता है, जो कि थ्रेशोल्ड है क्वेरी जो निष्पादन समय के आधार पर लंबे समय तक वर्गीकृत होती है। साथ ही उस क्वेरी को सक्षम करने का एक विकल्प है जो अनुक्रमणिका का उपयोग नहीं कर रही है।
निष्कर्ष
क्वेरी वर्कलोड की निगरानी और विश्लेषण फायदेमंद हो सकता है ताकि आप अपने डेटाबेस वर्कलोड को जान सकें और समझ सकें, पीटी-क्वेरी-डाइजेस्ट और क्लस्टरकंट्रोल क्वेरी मॉनिटर दोनों डेटाबेस में चल रही क्वेरी से संबंधित जानकारी प्रदान करते हैं ताकि आपको उस समझ को प्राप्त करने में मदद मिल सके।