2008-11-07 64 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