从MySQL中的存储过程打印调试信息


Answers:


113

选项1:将其放入您的过程中,以便在运行时将“注释”输出到stdout。

SELECT 'Comment';

选项2:将其放在您的过程中以将变量输出到stdout:

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);

myvar is 5过程运行时,这将打印到stdout。

选项3,使用一个名为的文本列创建一个表tmptable,并将消息推送到该表:

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);

您可以将以上内容放入存储过程中,因此您只需要编写以下内容:

CALL log(concat('the value is', myvar));

这样可以节省一些击键。

选项4,将消息记录到文件

select "penguin" as log into outfile '/tmp/result.txt';

此命令有非常严格的限制。您只能将输出文件写入磁盘上赋予“其他”组创建和写入权限的区域。它应该可以将其保存到/ tmp目录中。

同样,一旦写入输出文件,就无法覆盖它。这是为了防止破解者仅仅因为他们将SQL注入了您的网站并可以在MySQL中运行任意命令而使您的盒子生根。


3
mysql抱怨Not allowed to return a result set from a trigger,有什么主意吗?
杰里·钱

可能您已经在近3年的时间内解决了该问题,但是使用输出来消除该错误。
加布里埃尔·克利塞鲁


5

我通常使用存储过程创建日志表以对其进行记录。从正在开发的过程中随时在需要时调用日志记录过程。

查看关于同一问题的其他帖子,尽管有一些替代方法,但这似乎是一种惯例。


5
日志表应该是MyISAM或其他非事务性存储引擎,因此您甚至可以跟踪回滚的事务,
gaborsch 2014年


3

这是我调试的方式:

CREATE PROCEDURE procedure_name() 
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;  --this is the only one which you need
        ROLLBACK;   
    END; 
    START TRANSACTION;
        --query 1
        --query 2
        --query 3
    COMMIT;
END 

如果查询1、2或3将引发错误,则HANDLER将捕获SQLEXCEPTION,而SHOW ERRORS将为我们显示错误。注意:SHOW ERRORS应该是HANDLER中的第一条语句。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.