2010-04-17 10 views
6

मुझे पता है कि सामान्य प्रश्न है जो सभी प्रश्नों को लॉग करता है, लेकिन मैं यह जानना चाहता हूं कि कौन सी क्वेरी में कोई त्रुटि है, और त्रुटि संदेश प्राप्त करें। मैंने उद्देश्य पर एक त्रुटि क्वेरी चलाने का प्रयास किया है, लेकिन यह सामान्य क्वेरी के रूप में लॉग करता है और त्रुटि के साथ इसकी रिपोर्ट नहीं करता है। कोई विचार?mysql में त्रुटि प्रश्नों को कैसे लॉग इन करें?

उत्तर

4

मुझे पता है कि यह अब प्राचीन है, लेकिन किसी भी व्यक्ति के लिए जो Google से यहां है, यहां मेरे दो सेंट हैं।

यदि आप क्ली क्लाइंट का उपयोग कर रहे हैं, तो आप बस अपने स्टैर को एक फ़ाइल में रीडायरेक्ट कर सकते हैं, और फिर उसके माध्यम से पार्स कर सकते हैं।

mysql -u user -p 2> errors.log 
+0

धन्यवाद, फ़ाइल में लॉग इन करने के बजाय, यह नहीं पता था। मैंने इसे डेटाबेस में लॉग ऑन किया है। चीयर्स। –

1

मैं उद्देश्य पर एक त्रुटि क्वेरी चलाने की कोशिश की है, लेकिन यह एक सामान्य प्रश्न के रूप में लॉग करता है और त्रुटि के साथ यह रिपोर्ट नहीं करता। कोई भी विचार?

तो, आपने यह गलत किया। कोड के बिना कोई अन्य विचार नहीं।

PHP में

मैं इसे इस तरह से कर रहा हूँ (आप mysql ड्राइवर का उपयोग कर रहे मान):

$res=mysql_query($sql) or trigger_error(mysql_error().$sql); 

यह सब गलत क्वेरी को लॉग होगा यदि आप log_errors है पर स्थापित करने (और आप के लिए है)

संपादित करें: अब मैं देखता हूं, आप वैश्विक स्तर के लॉगिंग चाहते हैं, एम आवेदन स्तर नहीं है। लेकिन क्या आवेदन स्तर भी आपके अनुरूप होगा?

+0

मैं phpmyadmin 3.3.2 के माध्यम से इनपुट एसक्यूएल कर रहा हूं क्या वे गलत कर रहे हैं? –

+0

@user phpmyadmin एकल-उपयोगकर्ता एप्लिकेशन है, इस प्रकार इसे किसी भी लॉगिंग की आवश्यकता नहीं है। –

+0

अब मैं देख रहा हूं, मेरा उत्तर संपादित किया –

6

There is no functionality in MySQL to do this

आपको एप्लिकेशन-लेयर लॉगिंग के साथ रहना होगा।

+0

क्यों? एक सवाल - क्यों? क्या यह बहुत मुश्किल है ... बनाना? क्लाइंट को वापस फेंकते समय बस क्वेरी और त्रुटि लॉग करें .. –

+0

@ सर्ज: मुझे नहीं पता। ऐसा लगता है कि इसे लागू करना बहुत कठिन नहीं होना चाहिए। शायद एक अलग-अलग चिंताओं की बात (यानी यह एसक्यूएल कथन सही करने के लिए ग्राहक की ज़िम्मेदारी है, और यह विफलता लॉग इन करने के लिए स्वतंत्र है)। –

2

भले ही यह प्रश्न काफी पुराना है, मुझे उम्मीद है कि यह किसी ऐसे व्यक्ति के लिए उपयोगी होगा जिसने mysql लॉग त्रुटि क्वेरी या इसी तरह की शर्तों की खोज की है।

बहुत समय पहले मुझे केवल गलत प्रश्नों को लॉग करने के लिए mysqld की आवश्यकता थी। मैंने पाया है कि mysql-प्रॉक्सी ऐसा करने के लिए सक्षम बनाता है और एक छोटे से LUA पटकथा लिखी:

local err_flag = false 
function read_query(packet) 
    if packet:byte() == proxy.COM_QUERY then 
     local user = proxy.connection.client.username 
     local host = proxy.connection.client.src.name 
     if user:lower() == 'someuser' then -- change this to any condition where errors should be logged 
      proxy.queries:append(1, packet, {resultset_is_needed = true}) 
      proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SET @last_query = '" .. string.sub(packet, 2) .. "'", {resultset_is_needed = true}) 
      proxy.queries:append(3, string.char(proxy.COM_QUERY) .. "SHOW WARNINGS", {resultset_is_needed = true}) 
     end 
     return proxy.PROXY_SEND_QUERY 
    end 
end 


function insert_query(err_t, err_n, err_m) 
    local query = "INSERT INTO `somedb`.`mysql_error` " .. -- change log destination 
    "(`date`, `err_num`,`err_type`, `err_message`, `problem_query`, `conn_id`)" .. 
    " VALUES (NOW(), " .. 
    err_n .. "," .. "\"" .. 
    err_t .."\"" .. "," .. "\"" .. 
    err_m .. "\"" .. "," .. 
    "@last_query" .. "," .. 
    proxy.connection.server.thread_id .. ")" 
    proxy.queries:append(4, string.char(proxy.COM_QUERY) .. query, {resultset_is_needed = true}) 
    return proxy.PROXY_SEND_QUERY 
end 


function read_query_result(inj) 
    local res = assert(inj.resultset) 
    if inj.id == 1 then 
     err_flag = false 
     if res.query_status == proxy.MYSQLD_PACKET_ERR then 
      err_flag = true 
      return proxy.PROXY_IGNORE_RESULT 
     end 
    elseif inj.id == 2 then 
     return proxy.PROXY_IGNORE_RESULT 
    elseif inj.id == 3 then 
     if err_flag == true then 
      for row in res.rows do 
       proxy.response.type = proxy.MYSQLD_PACKET_ERR 
       proxy.response.errmsg = row[3] 
       insert_query(row[1], row[2], row[3]) 
      end 
      return proxy.PROXY_SEND_RESULT 
     end 
     return proxy.PROXY_IGNORE_RESULT 
    elseif inj.id == 4 then 
     return proxy.PROXY_IGNORE_RESULT 
    end 
end 

DDL प्रवेश तालिका के लिए की जरूरत है, somedb समायोजित करें। mysql_error पसंद करने के लिए, लेकिन उपरोक्त LUA स्क्रिप्ट में ऐसा करने के लिए मत भूलना।

CREATE TABLE `somedb`.`mysql_error` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` datetime NOT NULL, 
    `err_num` smallint(6) NOT NULL, 
    `err_type` varchar(10) COLLATE utf8_unicode_ci NOT NULL, 
    `err_message` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `problem_query` varchar(8000) COLLATE utf8_unicode_ci NOT NULL, 
    `conn_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

, स्क्रिप्ट का उपयोग करने के लिए

/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua

चलाने के लिए या कि अगर विफल रहता है (> = v0.9)

/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua --plugins=proxy

प्रॉक्सी डिफ़ॉल्ट रूप से बंदरगाह 4040 पर चलता है , परीक्षण करने के लिए:

mysql -u username -p --host=127.0.0.1 --port=4040

और कुछ दोषपूर्ण एसक्यूएल चलाएं।

जब सब कुछ लगता है कि आपके अनुप्रयोग में बंदरगाह को वास्तविक mysqld पोर्ट के बजाय 4040 पर सेट किया गया है और आपके पास डेटाबेस स्तर पर mysql त्रुटि लॉगिंग है।

अंतिम नोट: mysql-proxy बीटा है। मुझे लगता है कि सावधानी के साथ प्रयोग करें। बिना किसी समस्या के लगभग आधे साल तक यहां चल रहे थे, हालांकि वाईएमएमवी।

+0

अच्छा, उस पर जाना था और अंत में काम करने के लिए थोड़ी देर लग गई, लेकिन एक आकर्षण की तरह काम करता है। बीटीडब्ल्यू, यह बीटा भी नहीं है, यह अभी भी अल्फा है। http://dev.mysql.com/downloads/mysql-proxy/ –

+0

क्या यह प्रदर्शन हत्यारा नहीं है? मुझे लगता है कि क्लाइंट साइड पर त्रुटि प्रबंधन ठीक होगा – Zaffy

+0

यह काम करता है। महान! – hellojinjie

1

MariaDB Audit Plugin के साथ त्रुटि प्रश्नों को लॉग करना संभव है।

मारियाडीबी ऑडिट प्लगइन मारिया डीबी, माईएसक्यूएल और पेर्कोना सर्वर के लिए काम करता है।

उदाहरण के लिए, इन प्रश्नों

select now(); 
select now()+(); 
select 9+(); 
select 'hello'; 

लॉग के लिए इस तरह लगता है:

20150807 23:00:36,mnv-Satellite-L300D,root,localhost,82,377,QUERY,`test`,'select now() 
LIMIT 0, 1000',0 
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,379,QUERY,`test`,'select now()+()',1064 
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,382,QUERY,`test`,'select 9+()',1064 
20150807 23:00:38,mnv-Satellite-L300D,root,localhost,82,383,QUERY,`test`,'select \'hello\' 
LIMIT 0, 1000',0 

अंतिम स्तंभ वापसी कोड है। 0 ठीक है। अन्य - त्रुटि।

संबंधित मुद्दे