MySQL中是否有一种方法可以将调试消息打印到stdout,temptable或logfile?类似于:
SQLServer中的print
Oracle中的DBMS_OUTPUT.PUT_LINE
使用incron stackoverflow.com/a/41766032/953374从任何地方记录日志
选项1:将其放入您的过程中,以在运行时将”注释”打印到stdout。
SELECT ‘Comment’;
选项2:将其放入您的过程中,以将其输出到stdout的变量:
declare myvar INT default 0;
SET myvar = 5;
SELECT concat(‘myvar is ‘, myvar);
当过程运行时,这会将myvar is 5打印到标准输出。
选项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中运行任意命令而使您的盒子生根。
相关讨论
mysql抱怨Not allowed to return a result set from a trigger,有什么主意吗?
可能您已经在近3年的时间内解决了该问题,但是使用输出文件来消除该错误。
打印某些内容的快速方法是:
select ‘** Place your mesage here’ AS ‘** DEBUG:’;
一种解决方法是仅使用select而不使用任何其他子句。
http://lists.mysql.com/mysql/197901
我通常创建带有存储过程的日志表以对其进行记录。从正在开发的过程中随时在需要时调用日志记录过程。
看看关于这个问题的其他帖子,这似乎是一种常见的做法,尽管有一些替代方法。
相关讨论
日志表应该是MyISAM或其他非事务性存储引擎,因此您甚至可以跟踪回滚的事务,
这是我调试的方式:
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中的第一条语句。