MySQL पर निष्पादित अंतिम प्रश्नों को कैसे दिखाएं?


471

क्या सभी सर्वरों पर निष्पादित अंतिम प्रश्नों को दिखाने के लिए कोई क्वेरी / तरीका है?

जवाबों:


793

MySQL> = 5.1.12 से धन्य लोगों के लिए, आप इस विकल्प को वैश्विक स्तर पर रनटाइम पर नियंत्रित कर सकते हैं:

  1. निष्पादित SET GLOBAL log_output = 'TABLE';
  2. निष्पादित SET GLOBAL general_log = 'ON';
  3. मेज पर एक नज़र डालें mysql.general_log

यदि आप किसी तालिका के बजाय किसी फ़ाइल में आउटपुट करना पसंद करते हैं:

  1. SET GLOBAL log_output = "FILE"; डिफ़ॉल्ट
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

मैं संपादन के लिए इस विधि को पसंद करता हूं। क्योंकि फाइल को:

  1. आप my.cnfफ़ाइल को संपादित नहीं कर रहे हैं और संभवतः स्थायी रूप से लॉगिंग चालू कर रहे हैं
  2. आप क्वेरी लॉग की तलाश में फाइलसिस्टम के आसपास मछली पकड़ नहीं रहे हैं - या इससे भी बदतर, सही गंतव्य की आवश्यकता से विचलित। /var/log /var/data/log /opt /home/mysql_savior/var
  3. आपको सर्वर को पुनरारंभ करने और किसी भी वर्तमान कनेक्शन को बाधित करने की आवश्यकता नहीं है।
  4. सर्वर को पुनः आरंभ करना आपको वहीं छोड़ देता है जहाँ आपने शुरू किया था (लॉग बाय डिफॉल्ट स्टिल ऑफ)

अधिक जानकारी के लिए, MySQL 5.1 संदर्भ मैनुअल - सर्वर सिस्टम चर - general_log देखें


4
महान यूआई डिजाइन। वैसे भी, MySQL लॉग टेबल वास्तव में CSV इंजन का उपयोग कर रहे हैं ताकि आप वह सब कुछ कर सकें जो FlipMcF ने सामान्य_लॉग तालिका में लॉगिंग को सक्षम करने के बारे में कहा था, और इस तरह के सामान्य_लॉग की पूंछ -f है: पूंछ -f / var / lib / mysql / mysql / general_log.CSV

2
लानत है, इसके लिए mysql doc ने टेबल पैरामीटर को भी शूट नहीं किया है। बहुत बहुत धन्यवाद।
अभिषेक दुजारी २


6
समाप्त होने पर अपनी सामान्य लॉग टेबल को साफ़ करना याद रखें: "truncate table mysql.general_log"
pdwalker

1
मुझे इस तरह से परिणाम मिला, लेकिन पैरामीटर प्रश्न चिह्न द्वारा मौजूद हैं, उदाहरण के लिए, बार से फू का चयन करें जहां x = ?. मुझे पूरी क्वेरी कैसे मिल सकती है?
okwap

43

आप उस तरह के डायग्नोस्टिक के लिए एक सामान्य क्वेरी लॉग को सक्षम कर सकते हैं । आम तौर पर आप एक उत्पादन सर्वर पर सभी चयनित प्रश्नों को लॉग नहीं करते हैं, हालांकि यह एक प्रदर्शन हत्यारा है।

अपने MySQL कॉन्फिगर को एडिट करें, जैसे /etc/mysql/my.cnf - इस तरह से एक लाइन देखें या जोड़ें

[mysqld]
log = /var/log/mysql/mysql.log

उस परिवर्तन को लेने के लिए mysql को पुनरारंभ करें, अब आप कर सकते हैं

tail -f /var/log/mysql/mysql.log

जैसे ही वे आते हैं, आप प्रश्नों को देख सकते हैं।


4
general_log_file और general_log मेरे my.cnf में
मार्टिन थोमा


1
मैक ओएस एक्स के नए संस्करणों (कम से कम मैक ओएस एक्स पर) को केवल "लॉग =" के बजाय सामान्य_लॉग_फाइल और जनरल_लॉग विकल्प की आवश्यकता होती है। अन्यथा, आपको इस तरह की त्रुटि मिलती है: ERROR / usr / local / mysql / bin / mysqld: अस्पष्ट विकल्प '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay

@ जयशेत, मुझे यह त्रुटि १०.२ पर मारियाडब पर मिली, इसलिए मुझे यकीन नहीं है कि यह केवल मैक ओएस से संबंधित है।
user10089632

16

आप mysql क्वेरी लॉग की निगरानी के लिए बहने वाली चीज़ कर सकते हैं।

Mysql कॉन्फ़िगरेशन फ़ाइल my.cnf खोलें

sudo nano /etc/mysql/my.cnf

एक [mysqld]शीर्षक के तहत निम्नलिखित पंक्तियों को खोजें और लॉग को सक्षम करने के लिए इन पंक्तियों को अनसुना करें

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

परिवर्तनों को प्रतिबिंबित करने के लिए अपने mysql सर्वर को पुनरारंभ करें

sudo service mysql start

टर्मिनल में निम्नलिखित कमांड के साथ mysql सर्वर लॉग की निगरानी करें

tail -f /var/log/mysql/mysql.log


9

1) यदि सामान्य mysql लॉगिंग सक्षम है, तो हम लॉग फ़ाइल या तालिका में उन प्रश्नों की जांच कर सकते हैं जो हमने कॉन्फ़िगरेशन में बताए हैं। निम्न कमांड के साथ सक्षम है की जाँच करें

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

अगर हमें टेबल में क्वेरी हिस्ट्री चाहिए

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

तालिका mysql.general_log पर एक नज़र डालें

यदि आप किसी फ़ाइल में आउटपुट करना पसंद करते हैं:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) हम .mysql_history फ़ाइल बिल्ली ~ / .mysql_h में प्रश्नों की भी जाँच कर सकते हैं।



4

यदि mysql binlog सक्षम है तो आप mysql binlog निर्देशिका में ब्राउज़ करके linux कंसोल में निम्नलिखित कमांड निष्पादित करके उपयोगकर्ता द्वारा चलाए गए आदेशों की जांच कर सकते हैं।

mysqlbinlog binlog.000001 >  /tmp/statements.sql

सक्रिय करने के

[mysqld]
log = /var/log/mysql/mysql.log

या सामान्य लॉग का mysql के प्रदर्शन पर प्रभाव पड़ेगा


संभव है, लेकिन दर्दनाक। अधिक उपयोगी है यदि आप यह देखना चाहते हैं कि अतीत में क्या हुआ था।
pdwalker 5

2

यदि आपको अपना MySQL कॉन्फ़िगरेशन बदलने का मन नहीं है, तो आप "Neor Profile SQL" http://www.profilesql.com जैसे SQL प्रोफाइलर का उपयोग कर सकते हैं ।


2

पॉल के उत्तर को पढ़ने के बाद, मैं https://dev.mysql.com/doc/refman/5.7/en/query-log.html पर अधिक जानकारी के लिए खुदाई करता रहा।

मुझे एक व्यक्ति द्वारा वास्तव में उपयोगी कोड मिला। यहाँ संदर्भ का सारांश दिया गया है।

(नोट: निम्नलिखित कोड मेरा नहीं है)

यह स्क्रिप्ट तालिका को साफ रखने के लिए एक उदाहरण है जो आपको अपनी तालिका का आकार कम करने में मदद करेगी। एक दिन के बाद, लॉग के लगभग 180k प्रश्न होंगे। (एक फ़ाइल में, यह प्रति दिन 30MB होगा)

आपको एक अतिरिक्त कॉलम (Event_unix) जोड़ने की आवश्यकता है और फिर आप लॉग को साफ रखने के लिए इस स्क्रिप्ट का उपयोग कर सकते हैं ... यह टाइमस्टैम्प को यूनिक्स-टाइमस्टैम्प में अपडेट करेगा, 1 दिन से पुराने लॉग को हटा देगा और फिर इवेंट_टाइम को टाइमस्टैम्प में अपडेट कर देगा। Event_unix से ... थोड़ा भ्रमित करने वाला लगता है, लेकिन यह बहुत अच्छा काम कर रहा है।

नए कॉलम के लिए कमांड:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

सफाई स्क्रिप्ट:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

क्रेडिट सेबस्टियन कैसर (कोड के मूल लेखक) को जाता है।

आशा है कि किसी को यह उपयोगी लगेगा जैसा मैंने किया।


दिलचस्प। आप क्लीनअप के दौरान प्रश्नों को याद नहीं करेंगे जब तक कि आप सभी डीबी के पहले को लॉक न कर दें। अन्य मुद्दे हैं जो यहां उत्पन्न हो सकते हैं। यदि हम 'निरंतर' लॉगिंग के इस बिंदु पर हैं, तो मैं फ़ाइल लॉगिंग या बिन लॉग और ऑफ़-द-शेल्फ लॉग रोटेटर का उपयोग करूंगा।
FlipMcF

1

आप लिनक्स में निम्नलिखित देख सकते हैं

cd /root

ls -al

vi .mysql_history यह मदद कर सकता है


6
ऐसा लगता है कि यह केवल आधिकारिक कमांड-लाइन mysql क्लाइंट के लिए काम करेगा, और केवल मूल उपयोगकर्ता द्वारा निष्पादित प्रश्नों के लिए
golimar

प्रश्न कहता है 'सभी सर्वर' जो इस उत्तर को गलत बनाता है। यह एकल क्लाइंट द्वारा निष्पादित सभी प्रश्नों को दिखाएगा।
FlipMcF

यदि mysql binlog सक्षम है, तो आप mysql binlog निर्देशिका mysqlbinlog binlog.000001> /tmp/statements.ql को सक्षम करके [mysqld] log = / var / log / mysql / mysql को ब्राउज़ करके linux कंसोल में निम्न कमांड निष्पादित करके उपयोगकर्ता द्वारा चलाए गए आदेशों की जांच कर सकते हैं। mysql.log या जेनरल लॉग का mysql के प्रदर्शन पर प्रभाव पड़ेगा
अविनाश सिंह

इसमें कुछ प्रविष्टियाँ डिफ़ॉल्ट रूप से दबा दी जाती हैं, उदाहरण के लिए "पासवर्ड" वाले तार।
mckenzm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.