你如何调试MySQL存储过程?

时间:2008-11-07 19:58:13

标签: mysql database debugging stored-procedures

我当前调试存储过程的过程非常简单。我创建了一个名为“debug”的表,我在运行时从存储过程中插入变量值。这允许我在脚本中的给定点看到任何变量的值,但是有更好的方法来调试MySQL存储过程吗?

16 个答案:

答案 0 :(得分:57)

可以调用以下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

答案 1 :(得分:40)

我做的事和你非常相似。

我通常会包含一个默认为false的DEBUG参数,我可以在运行时设置为true。然后将调试语句包装到“If DEBUG”块中。

我还使用包含许多作业的日志记录表,以便我可以查看进程和时间。我的调试代码也在那里输出。我包括调用param名称,简要描述,受影响的行数(如果适用),注释字段和时间戳。

良好的调试工具是所有SQL平台的悲惨失败之一。

答案 2 :(得分:28)

答案 3 :(得分:21)

MySQL中有GUI tools for debugging stored procedures个/函数和脚本。 dbForge Studio for MySQL的一个不错的工具,具有丰富的功能和稳定性。

答案 4 :(得分:19)

如何调试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));
    
  5. 这是一个很好的快速和肮脏的小记录器,可以弄清楚发生了什么。

答案 5 :(得分: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?

答案 6 :(得分:8)

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;

答案 7 :(得分:7)

我只是简单地将select语句放在存储过程的关键区域中,以检查数据集的当前状态,然后将它们注释掉( - 选择...)或在生产之前删除它们。

答案 8 :(得分:6)

MySQL Connector / Net 6.6具有Debug Stored Procedures and Functions

的功能
  

安装调试程序

     

启用存储过程调试器:

     
      
  • 对于Connector / Net 6.6:安装Connector / Net 6.6并选择Complete选项。
  •   
  • 对于Connector / Net 6.7及更高版本:安装存储过程调试器所属的Visual Studio产品MySQL。
  •   
     

启动调试器

     

要启动调试器,请执行以下步骤:

     
      
  • 在Visual Studio Server Explorer中选择一个连接。
  •   
  • 展开“存储过程”文件夹。只能直接调试存储过程。要调试用户定义的函数,请创建存储的
      调用函数的过程。
  •   
  • 单击存储过程节点,然后右键单击并从上下文菜单中选择Debug Routine。
  •   

答案 9 :(得分:6)

我迟到了,但带来了更多啤酒:

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

我试过,看起来非常稳定,支持断点和变量检查。

这不是一个完整的套件(仅仅4,1 Mb),但对我帮助很大!

工作原理: 它集成了你的mysql客户端(我正在使用Ubuntu 14.04),并在你执行之后:

$install
$setup yourFunctionName

它在您的服务器上安装一个新数据库,用于控制调试过程。所以:

$debug yourFunctionName('yourParameter')

将为您提供逐步遍历代码的机会,并“刷新”您的变量,以便更好地查看代码中的内容。

重要提示:在调试时,您可能会更改(重新创建过程)。重新创建后,在新的$ debug

之前执行:$ exit和$ setup

这是“插入”和“日志”方法的替代方法。 您的代码仍然没有其他“调试”指令。

截图:

ocelot breakpoint stepping

答案 10 :(得分:4)

MySQL的第一个稳定的调试器位于dbForge Studio for MySQL

答案 11 :(得分:4)

MySql Connector / NET还包括从Visual Studio 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

更新:Visual Studio的MySql从Connector / NET拆分为单独的产品,您可以从这里https://dev.mysql.com/downloads/windows/visualstudio/1.2.html(仍然是免费和开源)中选择它(包括调试器)。

免责声明:我是为Visual Studio产品编写MySQL存储过程调试器引擎的开发人员。

答案 12 :(得分:3)

我使用了两种不同的工具来调试程序和功能:

  1. dbForge - 许多功能性的mysql GUI。
  2. MyDebugger - 用于调试的专用工具...用于调试的方便工具。vote http://tinyurl.com/voteimg

答案 13 :(得分:2)

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

答案 14 :(得分:1)

Toad mysql。有一个免费版本 http://www.quest.com/toad-for-mysql/

答案 15 :(得分:1)

@Brad Parks对应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