你如何调试MySQL存储过程?

Cor*_*use 116 mysql database debugging stored-procedures

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

Bra*_*rks 64

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 ;
Run Code Online (Sandbox Code Playgroud)

然后像这样运行测试:

CALL test_procedure(1,2)
Run Code Online (Sandbox Code Playgroud)

它将产生以下输出:

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
Run Code Online (Sandbox Code Playgroud)

  • 这对于FUNCTIONS似乎不起作用,我不知道为什么.它总是给出"错误代码:1415.不允许从函数返回结果集".有任何追索权吗? (8认同)

Bob*_*bst 41

我做了一件与你非常相似的事情.

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

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

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

  • 并非所有平台@Bob Probst,sybase调试工具都是安静的,可以通过断点调试来触发和存储过程 (3认同)

Geo*_*rge 28

是的,有一种专门用于此类工具的工具--MySQL Debugger.
在此输入图像描述

  • 我非常渴望尝试一下.不幸的是,它完全是残骸.我从mysql中得到"函数coalesce不存在"错误消息,因此GUI通过SP代码错误地分支(尽管MySQL正确运行它).更不用说"DECLARE var DEFAULT value"局部变量了.当它们显然不是时,它们只显示为NULL.哦,还有"Undeclared identifier:'FETCH_RADIUS_DISTSORT'",这是一个编译语句.不建议. (4认同)
  • 这并不完美,但我对此的试验与上面@kellogs报道的情况完全不同.该工具既漂亮又轻巧,似乎只需要完成所需的工作而不会有任何臃肿.对我来说,这比任何其他试用的工具(即Visual Studio,Toad和dbForge Studio,所有这些都有重大缺陷)都要好得多 - 相比之下,所有这些都将描述为"完全残骸".不确定这是否是因为正在调试的函数不包含任何错误的结构或问题是否已修复. (4认同)
  • 我还发现此工具对于调试存储过程非常有用。 (2认同)

小智 21

有一些GUI工具可用于调试 MySQL中的存储过程 /函数和脚本.dbForge Studio for MySQL的一个不错的工具,具有丰富的功能和稳定性.


Eri*_*ski 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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将此代码放在您要将消息记录到表的任何位置.

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
    
    Run Code Online (Sandbox Code Playgroud)

这是一个很好的快速和肮脏的小记录器来弄清楚发生了什么.


Ton*_*oda 9

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$
Run Code Online (Sandbox Code Playgroud)

存储过程中的用法:

call dolog(concat_ws(': ','@simple_term_taxonomy_id',  @simple_term_taxonomy_id));
Run Code Online (Sandbox Code Playgroud)

存储过程的用法:

call resetLog ();
call stored_proc();
select * from log;
Run Code Online (Sandbox Code Playgroud)


Jer*_* S. 8

另一种方式在这里介绍

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

使用自定义调试mySql过程和日志记录表.

您也可以在代码中放置一个简单的选择,看看它是否已执行.

SELECT 'Message Text' AS `Title`; 
Run Code Online (Sandbox Code Playgroud)

我从中得到了这个想法

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的触发器和存储过程中捕获任何异常?


Ash*_*ine 7

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


Mar*_*rim 7

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

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
Run Code Online (Sandbox Code Playgroud)

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

$debug yourFunctionName('yourParameter')
Run Code Online (Sandbox Code Playgroud)

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

重要提示:在调试时,您可能会更改(重新创建过程).重新创建后,在新的$ debug之前执行:$ exit和$ setup

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

截图:

ocelot断点踩踏


Rah*_*thi 6

MySQL Connector/Net 6.6具有调试存储过程和函数的功能

安装调试器

要启用存储过程调试程序:

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

启动调试器

要启动调试程序,请按照下列步骤操作:

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


Fer*_*hez 5

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的,你可以从这里挑吧(含调试)https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (仍免费和开源)。

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