आप MySQL संग्रहीत प्रक्रियाओं को डीबग कैसे करते हैं?


125

संग्रहीत प्रक्रियाओं को डीबग करने की मेरी वर्तमान प्रक्रिया बहुत सरल है। मैं "डिबग" नामक एक तालिका बनाता हूं जहां मैं संग्रहीत प्रक्रिया से चर मान सम्मिलित करता हूं क्योंकि यह चलता है। यह मुझे स्क्रिप्ट में दिए गए बिंदु पर किसी भी चर के मूल्य को देखने की अनुमति देता है, लेकिन क्या MySQL संग्रहीत प्रक्रियाओं को डीबग करने का एक बेहतर तरीका है?


2
क्या गैर-विंडोज उपयोगकर्ताओं के लिए कोई GUI विकल्प हैं? संग्रहीत कार्यविधियों को डीबग करने के लिए केवल Windows की एक प्रति को चलाने के लिए जंप का एक सा है। और यदि आप किसी लेन-देन में रोलबैक करने वाले हैं, तो अधिकांश टेबल-इंसर्ट विकल्प विफल हो जाते हैं।
कोड एबिनोमेटर

जवाबों:


44

मैं आपसे बहुत कुछ मिलता-जुलता हूं।

मैं आमतौर पर एक डीबग परम शामिल करूंगा जो झूठे को डिफॉल्ट करता है और मैं रन टाइम पर सच कर सकता हूं। फिर डिबग कथनों को "यदि DEBUG" ब्लॉक में लपेटें।

मैं अपनी कई नौकरियों के साथ एक लॉगिंग टेबल का भी उपयोग करता हूं ताकि मैं प्रक्रियाओं और समय की समीक्षा कर सकूं। मेरे डिबग कोड को वहां भी आउटपुट मिलता है। मैं कॉलिंग परम नाम, एक संक्षिप्त विवरण, पंक्ति गणना प्रभावित (यदि उपयुक्त हो), एक टिप्पणी क्षेत्र और एक समय टिकट शामिल हैं।

अच्छा डीबगिंग उपकरण सभी SQL प्लेटफ़ॉर्म की उदास विफलताओं में से एक है।


3
सभी प्लेटफ़ॉर्म @ थॉट प्रोबस्ट, सिबेस डिबगिंग टूल ट्रिगर और स्टोरेज प्रक्रियाओं के लिए ब्रेकपॉइंट डीबग के साथ शांत सभ्य हैं
अनूप

69

निम्नलिखित debug_msgप्रक्रिया को कंसोल में डिबग संदेश को केवल आउटपुट करने के लिए कहा जा सकता है:

DELIMITER $$

DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$

CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
  IF enabled THEN
    select concat('** ', msg) AS '** DEBUG:';
  END IF;
END $$

CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
  SET @enabled = TRUE;

  call debug_msg(@enabled, 'my first debug message');
  call debug_msg(@enabled, (select concat_ws('','arg1:', arg1)));
  call debug_msg(TRUE, 'This message always shows up');
  call debug_msg(FALSE, 'This message will never show up');
END $$

DELIMITER ;

फिर परीक्षण को इस तरह से चलाएं:

CALL test_procedure(1,2)

इसका परिणाम निम्न आउटपुट में होगा:

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up

8
यह FUNCTIONS के लिए काम नहीं करता है और मुझे पता नहीं क्यों। यह हमेशा "त्रुटि कोड: 1415 देता है। फ़ंक्शन से सेट किए गए परिणाम को वापस करने की अनुमति नहीं है"। क्या कोई सहारा है?
पैट्रिक एम

1
@PatrickM फ़ंक्शंस पंक्तियों ("परिणाम") को वापस नहीं कर सकता, जबकि यह डिबग प्रक्रिया इस पर निर्भर करती है (डिबग संदेश संदेश प्रक्रिया कॉल में दिए गए परिणाम हैं)। फ़ंक्शन में, आप केवल INSERT INTO my_log_table (message) VALUES (msg)और शायद सभी डिबग संदेश प्राप्त कर सकते हैं एक बार फ़ंक्शन कॉल खत्म होने पर (यानी: आप इस प्रक्रिया में वापस आ गए हैं)
Xenos

यह aproach अच्छा है, लेकिन कंसोल पर लिखना IDEs की तरह MySQL Workbench पर प्रभावी नहीं है। क्योंकि हर "चयन" कथन नए परिणाम फलक को खोलता है। मुझे लगता है कि समय की मोहर और प्रक्रिया के नाम के साथ त्रुटि संदेशों को लॉग करने के लिए एक अस्थायी लॉग टेबल बनाना बेहतर है
मुस्तफा कमाल तूना

28

हां, इस तरह की चीज के लिए एक विशेष उपकरण है - MySQL डीबगर
यहाँ छवि विवरण दर्ज करें


5
मैं इसे आज़माने के लिए बहुत उत्सुक था। दुर्भाग्य से यह कुल मलबे है। मुझे "फ़ंक्शन कोलेसस मौजूद नहीं है" त्रुटि संदेश mysql से दबाया गया, परिणामस्वरूप GUI शाखाएं SP कोड के माध्यम से गलत तरीके से (हालांकि MySQL इसे सही ढंग से चलाता है)। "DECLARE var DEFAULT मान" स्थानीय चर का उल्लेख नहीं करना। जब वे स्पष्ट रूप से नहीं होते हैं तो वे केवल NULL के रूप में दिखाई देते हैं। ओह, और यह भी "अघोषित पहचानकर्ता: 'FETCH_RADIUS_DISTSORT'" जहां एक संकलित बयान था। सिफारिश नहीं की गई।
kellogs

4
यह सही नहीं है, लेकिन इसके साथ मेरा परीक्षण ऊपर दिए गए @kellogs द्वारा बताया गया एक बहुत ही अलग अनुभव रहा है। उपकरण अच्छा और हल्का है और बिना किसी ब्लोट के आवश्यक काम करने के लिए लगता है। यह किसी भी अन्य उपकरण की तुलना में मेरे लिए एक बेहतर अनुभव था (यानी विजुअल स्टूडियो, टॉड और dbForge स्टूडियो, जिनमें से सभी में प्रमुख दोष थे - इन सभी का वर्णन "कुल मलबे" के रूप में होगा)। यह सुनिश्चित नहीं है कि क्या यह इसलिए है क्योंकि डिबग किए जा रहे फ़ंक्शन में कोई भी गलत निर्माण शामिल नहीं है या क्या समस्याएँ ठीक हो गई हैं।
स्टीव चेम्बर्स

2
मुझे अपनी संग्रहीत प्रक्रियाओं को डीबग करने के लिए भी यह उपकरण काफी उपयोगी लगा।
राल्फ r ’

22

MySQL संग्रहीत कार्यविधि को डीबग करने के लिए कैसे करें।

गरीब आदमी डिबगर:

  1. दो स्तंभों के साथ लॉगटेबल नामक एक तालिका बनाएं, id INTऔर log VARCHAR(255)

  2. आईडी कॉलम को स्‍पष्‍ट करें।

  3. इस प्रक्रिया का उपयोग करें:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
  4. इस कोड को कहीं भी रखिए आप एक संदेश को तालिका में लॉग इन करना चाहते हैं।

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));

यह एक अच्छा त्वरित और गंदा लकड़हारा है जो यह पता लगाने के लिए कि क्या चल रहा है।


21

MySQL में संग्रहीत कार्यविधियाँ / फ़ंक्शन और स्क्रिप्ट डीबग करने के लिए GUI उपकरण हैं । एक सभ्य उपकरण जो MySQL के लिए dbForge स्टूडियो में समृद्ध कार्यक्षमता और स्थिरता है।


डिबग टूल किस प्लेटफॉर्म पर चलता है, यह पता लगाना मुश्किल है। विंडोज पर चलने लगता है। और कुछ?
गाइ

10

Mysql के लिए डिबगर अच्छा था लेकिन यह मुफ़्त नहीं था। यह वही है जो अब मैं उपयोग करता हूं:

DELIMITER GO$

DROP PROCEDURE IF EXISTS resetLog

GO$

Create Procedure resetLog() 
BEGIN   
    create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam; 
    truncate table log;
END; 

GO$

DROP PROCEDURE IF EXISTS doLog 

GO$

Create Procedure doLog(in logMsg nvarchar(2048))
BEGIN  
  insert into log (msg) values(logMsg);
END;

GO$

संग्रहीत कार्यविधि में उपयोग:

call dolog(concat_ws(': ','@simple_term_taxonomy_id',  @simple_term_taxonomy_id));

संग्रहीत कार्यविधि का उपयोग:

call resetLog ();
call stored_proc();
select * from log;

8

एक और तरीका यहाँ प्रस्तुत किया गया है

http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

कस्टम डिबग mySql प्रक्रियाओं और लॉगिंग टेबल के साथ।

आप अपने कोड में केवल एक साधारण चयन भी कर सकते हैं और देख सकते हैं कि क्या इसे निष्पादित किया गया है।

SELECT 'Message Text' AS `Title`; 

मुझे यह विचार आया

http://forums.mysql.com/read.php?99,78155,78225#msg-78225

इसके अलावा किसी ने GitHub पर कस्टम डिबग प्रक्रियाओं के लिए एक टेम्पलेट बनाया।

यहाँ देखें

http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines

यहाँ उल्लेख किया गया था

ट्रिगर और mysql के लिए स्टोर प्रक्रियाओं में किसी भी अपवाद को कैसे पकड़ें?


7

मैं केवल डेटा सेट की वर्तमान स्थिति की जांच करने के लिए संग्रहीत कार्यविधि के प्रमुख क्षेत्रों में कुछ चुनिंदा बयान देता हूं और फिर उन्हें (--select ...) टिप्पणी करता हूं या उत्पादन से पहले हटा देता हूं।


7

मुझे पार्टी में देर हो रही है, लेकिन अधिक बीयर लाया हूँ:

http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ और https://github.com/ocelot-inc/ocelotgui

मैंने कोशिश की, और यह काफी स्थिर लगता है, ब्रेकपॉइंट और परिवर्तनीय निरीक्षण का समर्थन करता है।

यह एक पूर्ण सूट (सिर्फ 4,1 एमबी) नहीं है, लेकिन इससे मुझे बहुत मदद मिली!

यह कैसे काम करता है: यह आपके mysql क्लाइंट के साथ एकीकृत होता है (मैं Ubuntu 14.04 का उपयोग कर रहा हूँ), और आपके द्वारा निष्पादित करने के बाद:

$install
$setup yourFunctionName

यह आपके सर्वर पर एक नया डेटाबेस स्थापित करता है, जो डिबगिंग प्रक्रिया को नियंत्रित करता है। इसलिए:

$debug yourFunctionName('yourParameter')

आपको अपने कोड को चरण दर चरण चलने का मौका देगा, और आपके चर को "ताज़ा" करके आप बेहतर तरीके से देख सकते हैं कि आपके कोड के अंदर क्या चल रहा है।

महत्वपूर्ण सुझाव: डिबगिंग करते समय, शायद आप बदल जाएंगे (प्रक्रिया को फिर से बनाएँ)। फिर से निर्माण के बाद, निष्पादित करें: एक नया $ डीबग से पहले $ निकास और $ सेटअप

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

स्क्रीनशॉट:

ऑसील्ट ब्रेकपॉइंट स्टेपिंग


6

MySQL कनेक्टर / नेट 6.6 में संग्रहीत कार्यविधियों और कार्यों को डीबग करने की सुविधा है

डिबगर को स्थापित करना

संग्रहीत कार्यविधि डीबगर को सक्षम करने के लिए:

  • कनेक्टर / नेट 6.6 के लिए: कनेक्टर / नेट 6.6 स्थापित करें और पूरा विकल्प चुनें।
  • कनेक्टर / नेट 6.7 और बाद के लिए: Visual Studio के लिए उत्पाद MySQL स्थापित करें, जिसमें संग्रहीत कार्यविधि डीबगर संबंधित है।

डीबगर शुरू करना

डीबगर प्रारंभ करने के लिए, इन चरणों का पालन करें:

  • Visual Studio Server Explorer में कनेक्शन चुनें।
  • संग्रहीत कार्यविधि फ़ोल्डर का विस्तार करें। केवल संग्रहीत प्रक्रियाओं को सीधे डीबग किया जा सकता है। उपयोगकर्ता-परिभाषित फ़ंक्शन को डीबग करने के लिए, एक संग्रहीत बनाएँ
    कार्यविधि जो फ़ंक्शन को कॉल करती है।
  • एक संग्रहीत प्रक्रिया नोड पर क्लिक करें, फिर राइट-क्लिक करें और संदर्भ मेनू से डीबग रूटीन चुनें।

5

MySql कनेक्टर / NET में विज़ुअल स्टूडियो में एकीकृत एक स्टोरेज प्रक्रिया डिबगर भी शामिल है जिसमें संस्करण 6.6 है, आप यहाँ इंस्टॉलर और स्रोत प्राप्त कर सकते हैं: http://dev.mysql.com/downloads/connector/net/

कुछ प्रलेखन / स्क्रीनशॉट: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

आप यहां दिए गए उद्घोषणाओं का अनुसरण कर सकते हैं: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

अद्यतन: दृश्य स्टूडियो के लिए MySql कनेक्टर / NET से एक अलग उत्पाद में विभाजित किया गया था, आप इसे (डीबगर सहित) https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (अभी भी ) से चुन सकते हैं मुक्त और खुला स्रोत)।

अस्वीकरण: मैं डेवलपर था जिसने विज़ुअल स्टूडियो उत्पाद के लिए MySQL के लिए संग्रहीत प्रक्रियाओं डीबगर इंजन को अधिकृत किया था।


MySQL और कनेक्टर .NET का उपयोग करते समय मल्टी-होस्ट कनेक्शन स्ट्रिंग के साथ एक समस्या है। मैंने यहाँ मुद्दा समझाया है .. मैं सोच रहा था कि क्या कोई इस पर ध्यान देने वाला है? यह हम में से कई लोगों के लिए काफी परेशानी का कारण बना हुआ है। नेट डेवलपर्स जो MySQL का उपयोग करते हैं ...
Hooman Bahreini

1
यह सुनने के लिए क्षमा करें, मैं अब ओरेकल में काम नहीं करता हूं, और बहुत खाली समय नहीं है, मेरा सुझाव है कि मैं MySQL के समर्थन में संपर्क कर रहा हूं।
फर्नांडो गोंजालेज सांचेज़

4

MySQL के लिए पहला और स्थिर डीबगर MySQL के लिए dbForge स्टूडियो में है


3

मैंने प्रक्रियाओं और कार्यों को डिबग करने के लिए दो अलग-अलग टूल का उपयोग किया था:

  1. dbForge - कई कार्यात्मक mysql GUI।
  2. MyDebugger - डिबगिंग के लिए विशेष टूल ... डीबगिंग के लिए आसान टूल। वोट http://tinyurl.com/voteimg

3

MySQL उपयोगकर्ता परिभाषित चर (सत्र में साझा) का उपयोग लॉगिंग आउटपुट के रूप में किया जा सकता है:

DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
  SET @stmt = CONCAT('SELECT * FROM ', tableName);
  PREPARE pStmt FROM @stmt;
  EXECUTE pStmt;
  DEALLOCATE PREPARE pStmt;
  -- uncomment after debugging to cleanup
  -- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;

उत्पादन होगा:

SELECT * FROM foo

1

टॉड mysql। एक फ्रीवेयर संस्करण है http://www.quest.com/toad-for-mysql/


1
मैंने टॉड का उपयोग वर्षों से किया है, लेकिन यह नहीं पता था कि डिबगिंग स्प्रोक्स के लिए इसकी कोई विशेष विशेषता थी। क्या आप स्पष्ट कर सकते हैं कि आप ऐसा करने के लिए टॉड का उपयोग कैसे करते हैं?
Cory House

Mysql के लिए टॉड 6.3 को अभी देखा, ऐसा लगता है कि ब्रेकपॉइंट और सब कुछ के साथ डीबग सुविधा है। क्या आपका मतलब है कि डिबग सुविधा काम नहीं कर रही है? या हो सकता है कि आपका संस्करण पुराना है और इसमें डीबग सुविधा शामिल नहीं है?
जॉयस

1

करने के लिए इसी उत्तर इस @Brad पार्क से सुनिश्चित नहीं हैं कि MySQL के संस्करण के बारे में, लेकिन मेरा 5.6, इसलिए थोड़ा फेरबदल काम करता था:

मैंने एक फ़ंक्शन बनाया debug_msgजो फ़ंक्शन है (प्रक्रिया नहीं) और रिटर्न टेक्स्ट (कोई वर्ण सीमा) नहीं है और फिर फ़ंक्शन को SELECT debug_msg(परम) के रूप में my_res_set, नीचे दिए गए कोड के रूप में कॉल करें :

CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
    READS SQL DATA
BEGIN
    IF enabled=1 THEN
    return concat('** DEBUG:', "** ", msg);
    END IF;
END

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
 IN RegionID VARCHAR(20),
 IN RepCurrency INT(11),
 IN MGID INT(11),
 IN VNC VARCHAR(255)
)
BEGIN
    SET @enabled = TRUE;
    SET @mainQuery = "SELECT * FROM Users u";
    SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
    SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
    SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.