2008-11-07 65 views
94

我目前的調試存儲過程的過程非常簡單。我創建了一個名爲「debug」的表,我們在運行時從存儲過程插入變量值。這使我能夠看到腳本中某個給定點上的任何變量的值,但有沒有更好的方法來調試MySQL存儲過程?如何調試MySQL存儲過程?

+1

對於非Windows用戶是否有任何GUI選項?不得不運行一個Windows副本來調試存儲過程,這有點跳躍。如果你在一個你將要回滾的事務中,大部分表插入選項都會失敗。 – 2015-03-13 02:02:20

回答

38

我做的事情與你非常相似。

我通常會包含一個DEBUG參數,默認爲false,我可以在運行時設置爲true。然後將調試語句包裝到「If DEBUG」塊中。

我還使用一個記錄表與我的許多工作,以便我可以審查進程和時間。我的調試代碼也在那裏得到輸出。我包括調用參數名稱,簡要說明,受影響的行數(如果適用),註釋字段和時間戳。

好的調試工具是所有SQL平臺中令人悲傷的缺陷之一。

+2

並非所有平臺@Bob Probst,sybase調試工具都非常安靜,帶有用於觸發器和存儲過程的斷點調試 – Anup 2015-06-10 11:03:28

7

我只是簡單地在存儲過程的關鍵區域放置選擇語句來檢查數據集的當前狀態,然後將它們註釋掉( - 選擇...)或在生產之前刪除它們。

23

是的,這種東西有一個專門的工具 - MySQL Debugger
enter image description here

+4

我非常渴望嘗試它。不幸的是,它是一個完整的殘骸。我提供了來自mysql的「函數合併不存在」錯誤消息,因此GUI通過SP代碼錯誤地分支(儘管MySQL正確運行它)。更不用說「DECLARE var DEFAULT值」局部變量。當它們顯然不是時,它們只會顯示爲NULL。哦,還有「未聲明的標識符:'FETCH_RADIUS_DISTSORT'」,這是一個編譯語句。不建議。 – kellogs 2013-10-08 02:26:09

+2

這並不完美,但我對此的試用與上面的@kellogs報告的體驗非常不同。這個工具很好,很輕,看起來只需要做工作而沒有任何臃腫。對我來說,這是一個比任何其他試用工具(即Visual Studio,Toad和dbForge Studio,所有這些工具都有重大缺陷 - 將比較所有這些描述爲「完全殘骸」)更好的體驗。不確定這是否是因爲被調試的函數沒有包含任何錯誤的結構或問題是否已經解決。 – 2016-08-04 09:28:34

+0

我還發現這個工具對於調試我的存儲過程非常有用。 – ralfe 2017-06-07 09:42:09

21

在MySQL中有GUI tools for debugging stored procedures /函數和腳本。 dbForge Studio for MySQL的體面工具具有豐富的功能和穩定性。

+0

很難找到運行調試工具的平臺。似乎在Windows上運行。還要別的嗎? – Guy 2016-07-14 17:20:25

4

MySQL的第一和穩定的調試器是dbForge工作室爲MySQL

3

我不得不使用兩種不同的工具來調試程序和功能:

  1. dbForge - 許多功能的MySQL GUI。
  2. MyDebugger - 用於調試的專用工具...用於調試的方便工具。 vote http://tinyurl.com/voteimg
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

在這裏提到的

How to catch any exception in triggers and store procedures for mysql?

3

MySQL連接/ NET還包括集成在Visual Studio中的存儲過程調試器的6.6版本, 你可以在這裏獲得安裝程序和源代碼: http://dev.mysql.com/downloads/connector/net/

有些文檔/截圖:https://dev.mysql.com/doc/connector-net/en/connector-net-visual-studio-debugger.html

您可以按照公告式在這裏: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

免責聲明:我是誰撰寫了MySQL的存儲過程調試器引擎的Visual Studio產品開發。

48

以下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 BEGIN 
    select concat("** ", msg) AS '** DEBUG:'; 
    END; 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 
14

如何調試MySQL存儲過程。

差芒調試器:

  1. 創建一個名爲logtable有兩列,id INTlog VARCHAR(255)表。

  2. 使id列自動增量。

  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)); 
    

這是一個很好的快速和骯髒的小記錄弄清楚是怎麼回事。

7

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; 
6

的MySQL連接器/淨6.6有一個功能,Debug Stored Procedures and Functions

安裝調試

要啓用存儲過程調試器:

  • 對於連接器/淨6.6:安裝連接器/淨6.6,並選擇完成選項。
  • 對於Connector/Net 6.7及更高版本:安裝存儲過程調試程序所屬的Visual Studio產品MySQL。

啓動調試器

啓動調試器,請按照下列步驟操作:

  • 選擇在Visual Studio服務器資源管理器的連接。
  • 展開存儲過程文件夾。只有存儲過程可以直接調試。要調試用戶定義的函數,請創建一個調用函數的存儲過程。
  • 單擊一個存儲過程節點,然後右鍵單擊並從上下文菜單中選擇Debug Routine。
5

,我遲到了,但帶來了更多的啤酒:

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

我試過了,它似乎相當穩定,支持斷點和變量檢查。

這不是一個完整的套件(只有4,1 Mb),但幫助了我很多!

工作原理:

$install 
$setup yourFunctionName 

它安裝在你的服務器一個新的數據庫,控制調試過程: 它與你的MySQL客戶端(我使用Ubuntu 14.04),和之後執行整合。所以:

$debug yourFunctionName('yourParameter') 

會給你一個機會,一步一步走你的代碼,而「刷新」您的變量,你可以更好地觀察什麼是你的代碼裏面怎麼回事。

重要提示:在調試時,也許你會改變(重新創建過程)。重新創建後,執行:$ exit和$ setup,然後執行新的$ debug調試

這是「insert」和「log」方法的替代方法。 您的代碼不含額外的「調試」指令。

截圖:

ocelot breakpoint stepping

0

通過@Brad公園相當於this回答 不能確定的MySQL版本,但我的是5.6,所以一點點的調整工作:

我創建了一個函數debug_msg這是函數(不是程序)並返回文本(無字符限制),然後調用函數作爲SELECT debug_msg(params)AS 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