《SQL》
-- 创建调试日志表
CREATE TABLE debug_log (
id INT AUTO_INCREMENT PRIMARY KEY,
proc_name VARCHAR(50),
step_desc VARCHAR(255),
var_values TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 在存储过程中插入跟踪点
DELIMITER //
CREATE PROCEDURE sample_proc(IN input INT)
BEGIN
DECLARE counter INT DEFAULT 0;
-- IF分支跟踪
INSERT INTO debug_log(proc_name, step_desc, var_values)
VALUES ('sample_proc', '进入IF判断前', CONCAT('input=', input));
IF input > 10 THEN
INSERT INTO debug_log VALUES (NULL, 'sample_proc', '进入IF分支', '条件成立', NOW());
-- 业务逻辑...
ELSE
INSERT INTO debug_log VALUES (NULL, 'sample_proc', '进入ELSE分支', '条件不成立', NOW());
END IF;
-- LOOP循环跟踪
WHILE counter < 5 DO
SET counter = counter + 1;
INSERT INTO debug_log VALUES (NULL, 'sample_proc',
CONCAT('第', counter, '次循环开始'),
CONCAT('当前counter=', counter), NOW());
-- 业务逻辑...
END WHILE;
END//
DELIMITER ;
-- 查看执行轨迹
SELECT * FROM debug_log WHERE proc_name = 'sample_proc' ORDER BY id;
输出示例:
| 1 | sample_proc | 进入IF判断前 | input=15 | 2023-08-20 09:30:00 |
| 2 | sample_proc | 进入IF分支 | 条件成立 | 2023-08-20 09:30:01 |
| 3 | sample_proc | 第1次循环开始 | counter=1| 2023-08-20 09:30:02 |
```[^1]
2. SELECT实时输出法
《SQL》
CREATE PROCEDURE loop_demo()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 3 DO
SELECT CONCAT('循环执行中,i=', i) AS debug_output; -- 实时输出
SET i = i + 1;
END WHILE;
END;
-- 命令行调用观察输出
CALL loop_demo();
输出效果:
+-----------------------+
| debug_output |
+-----------------------+
| 循环执行中,i=0 |
+-----------------------+
1 row in set (0.00 sec)
DEBUG
选项:《SQL》
CREATE PROCEDURE test_proc() SQL SECURITY INVOKER DEBUG
BEGIN
-- 过程体
END
《SQL》
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE'; -- 日志存入mysql.general_log表
CALL your_procedure();
-- 查询执行细节
SELECT argument FROM mysql.general_log
WHERE command_type = 'Query'
AND user_host LIKE '%your_user%'
ORDER BY event_time DESC;
日志片段示例:
| SET @input=20 |
| IF @input>10 THEN |
| INSERT INTO orders... | -- 实际执行的动态SQL
```[^1]
2. 慢查询日志分析
《SQL》
-- 设置阈值(单位:秒)
SET GLOBAL long_query_time = 0.1;
SET GLOBAL slow_query_log = 1;
-- 查看慢日志路径
SHOW VARIABLES LIKE 'slow_query_log_file';
《SQL》
CREATE PROCEDURE conditional_debug()
BEGIN
DECLARE var1 INT DEFAULT 0;
-- 只在特定条件下触发日志
IF var1 > 5 THEN
INSERT INTO debug_log VALUES (NULL, 'conditional_debug',
'var1超过阈值', CONCAT('var1=', var1), NOW());
END IF;
END
2. 动态SQL追踪
《SQL》
SET @sql = CONCAT('SELECT * FROM ', @table_name, ' WHERE id=', @input);
PREPARE stmt FROM @sql;
-- 记录动态SQL语句
INSERT INTO debug_log VALUES (NULL, 'dynamic_sql',
'准备执行的动态SQL', @sql, NOW());
EXECUTE stmt;
3. 错误堆栈跟踪
《SQL》
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@errno = MYSQL_ERRNO,
@msg = MESSAGE_TEXT;
INSERT INTO error_log VALUES (NULL, @errno, @msg, NOW());
END;
控制结构 | 调试方法 | 验证重点 |
---|---|---|
IF | 在THEN/ELSE分支插入不同标识日志 | 条件判断逻辑是否正确 |
CASE | 每个WHEN子句添加跟踪点 | 分支覆盖是否完整 |
WHILE | 记录每次循环初始/结束时的变量值 | 终止条件是否有效 |
REPEAT | 跟踪UNTIL条件变化过程 | 循环退出时机是否准确 |
LOOP | 设置最大迭代次数防止死循环 | 中断机制是否生效 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。