调试MySQL触发器
我喜欢触发器有一个原因——它们只是工作而已。我讨厌触发器有一个原因——当触发器不工作时,忘记调试。哦,甜蜜的挫折 基本上,我希望看到运行的更新、删除、插入等查询。我想看看这个问题。。。在我的终端或日志中的某个地方,MySQL执行它的确切方式和时间,以及可能的任何相应的输出/错误。想法/技巧 我正在尝试调试一个包含一些连接的更新查询。我的查询要复杂得多,但为了简洁起见,这里有一个示例调试MySQL触发器,mysql,triggers,Mysql,Triggers,我喜欢触发器有一个原因——它们只是工作而已。我讨厌触发器有一个原因——当触发器不工作时,忘记调试。哦,甜蜜的挫折 基本上,我希望看到运行的更新、删除、插入等查询。我想看看这个问题。。。在我的终端或日志中的某个地方,MySQL执行它的确切方式和时间,以及可能的任何相应的输出/错误。想法/技巧 我正在尝试调试一个包含一些连接的更新查询。我的查询要复杂得多,但为了简洁起见,这里有一个示例 DELIMITER | CREATE TRIGGER ireallyhateyourightnow AFTER U
DELIMITER |
CREATE TRIGGER ireallyhateyourightnow AFTER UPDATE ON watch_this_table
FOR EACH ROW BEGIN
IF (OLD.my_value != NEW.my_value) THEN
update
my_table
set
my_column = NEW.my_value;
END IF;
END|
DELIMITER ;
下面是一些可能有助于影响建议或答案的附加上下文。同样,我对语义/语法不太感兴趣,而更感兴趣的是看到MySQL运行查询,但无论如何,在这一点上,我对任何事情都持开放态度
- Strace不工作/显示查询
- 非复制环境,但如果bin日志显示触发器语句,我肯定会设置它
- “show full processlist”是否显示触发器执行和/或在中执行的语句(在以perl可以运行的速度运行show full processlist之后,我从未看到它们,但我可能只是错过了它)
- 常规查询日志不会显示这些查询(当然不会显示错误日志)
- 我不再使用别名了
- 创建触发器时没有语法错误
- IF语句有效
- 当我将新值插入一个“test/temp”表并手动运行更新查询时,它就可以工作了(我甚至还实际插入了整个更新查询)
- 我不能向您显示查询,但正如我刚才提到的,如果有帮助的话,当我手动运行时,它会工作
- 我已经删除了所有错误的字符、制表符、回车符、换行符等
- 我认为MySQL套接字只显示本地连接/数据,而不显示MySQL的内部工作
- MyISAM所以INNODB日志不是一个选项
- lsof似乎没有显示任何其他有用的东西
- 我在CentOS 5.5上使用MySQL 5.0.77
- 您可以使用。试试试用版
文档中详细描述了触发器调试过程:调试\调试存储例程\如何:启动触发器调试。MYSQL PROCEDURE=>incron=>tail-f'MYSQL\u dynamic.log' 存储过程可以在触发器内调用,但不能返回任何内容
CREATE PROCEDURE `DYN_LOG` (IN s VARCHAR(500))
BEGIN
SELECT s into outfile '/var/spool/incron/mysql_dynamic_spool/foo_file';
DO SLEEP(.1); // create a gap beetween multiple shuts
END
现在,您可以调用触发器中的任何位置
CREATE TRIGGER `trig_name` BEFORE UPDATE ON `tb_name`
FOR EACH ROW
BEGIN
CALL DYN_LOG(concat_ws('\t',NEW.col1,NEW.col2));
...
// rest of the code
END
对于Linux机器apt get install incron
创建mysql将在其中注入foo_文件的文件夹
mkdir -m 777 /var/spool/incron/mysql_dynamic_spool
incrontab -e
并添加以下incron作业
/var/spool/incron/mysql_dynamic_spool IN_CREATE /path/foo_file_procesor $@/$#
创建可执行脚本“/path/foo\u file\u procesor”
现在查看收集器文件
tail -f /var/log/mysql_dynamic.log
有一个。在这里的示例中,他们在自己的debug
数据库中创建它
步骤1:创建一个表
DROP TABLE IF EXISTS debug;
CREATE TABLE debug (
proc_id varchar(100) default NULL,
debug_output text,
line_id int(11) NOT NULL auto_increment,
PRIMARY KEY (line_id)
)
步骤2:创建调试SP以填充调试表
DELIMITER $$
DROP PROCEDURE IF EXISTS `debug_insert` $$
CREATE PROCEDURE `debug_insert`(in p_proc_id varchar(100),in p_debug_info text)
begin
insert into debug (proc_id,debug_output)
values (p_proc_id,p_debug_info);
end $$
DROP PROCEDURE IF EXISTS `debug_on` $$
CREATE PROCEDURE `debug_on`(in p_proc_id varchar(100))
begin
call debug_insert(p_proc_id,concat('Debug Started :',now()));
end $$
DROP PROCEDURE IF EXISTS `debug_off` $$
CREATE PROCEDURE `debug_off`(in p_proc_id varchar(100))
begin
call debug_insert(p_proc_id,concat('Debug Ended :',now()));
select debug_output from debug where proc_id = p_proc_id order by line_id;
delete from debug where proc_id = p_proc_id;
end $$
步骤3:在触发器中调用调试SP
像这样,
CREATE PROCEDURE test_debug()
begin
declare l_proc_id varchar(100) default 'test_debug';
call debug_on(l_proc_id);
call debug_insert(l_proc_id,'Testing Debug');
call debug_off(l_proc_id);
end $$
因此,调试表将填写如下:
+------------------------------------+
| debug_output |
+------------------------------------+
| Debug Started :2006-03-24 16:10:33 |
| Testing Debug |
| Debug Ended :2006-03-24 16:10:33 |
+------------------------------------+
是的,“踏入”显示为灰色。可能是因为这是一个试用版?必须从存储过程代码激活“单步执行”命令。您是否遵循了分步说明(如何:启动触发器调试)?谢谢Devart!非常好的一个软件。我还没有让它工作!当我在触发器(插入后触发器)中设置断点时,我调试我的insert语句,然后按ctrl+f5键跳转到断点,我发现触发器执行时有一个错误。我只是想确定,这意味着错误发生在我的断点之前?我是否正确设置/跳转到断点?您应该在过程中编写INSERT语句。然后开始调试该过程,并在INSERT语句中单击“单步执行”。请注意,在使用调试信息之前必须编译该触发器。除了debug_off()过程外,该过程在与触发器或函数一起使用时在select语句上失败,因为两者都不允许返回结果集。删除那个(以及后面的delete语句),就可以开始了。
+------------------------------------+
| debug_output |
+------------------------------------+
| Debug Started :2006-03-24 16:10:33 |
| Testing Debug |
| Debug Ended :2006-03-24 16:10:33 |
+------------------------------------+