¿Cómo depurar los procedimientos almacenados de MySQL?
Mi proceso actual para depurar procedimientos almacenados es muy simple. Creo una tabla llamada "debug" donde inserto valores variables del procedimiento almacenado a medida que se ejecuta. Esto me permite ver el valor de cualquier variable en un punto dado en el script, pero ¿hay una mejor manera de depurar los procedimientos almacenados de MySQL?
15 answers
Hago algo muy similar a ti.
Normalmente incluiré un parámetro de DEPURACIÓN que por defecto es false y puedo establecerlo en true en tiempo de ejecución. Luego envuelva las sentencias debug en un bloque "If DEBUG".
También uso una tabla de registro con muchos de mis trabajos para poder revisar los procesos y el tiempo. Mi código de depuración también obtiene la salida allí. Incluyo el nombre del parámetro de llamada, una breve descripción, recuentos de filas afectados (si es apropiado), un campo de comentarios y una marca de tiempo.
Bueno las herramientas de depuración son uno de los tristes fallos de todas las plataformas SQL.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-21 18:32:19
Se puede llamar al siguiente procedimiento debug_msg
para simplemente enviar un mensaje de depuración a la consola:
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 BEGIN
select concat("** ", msg) AS '** DEBUG:';
END; 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 ;
Luego ejecute la prueba de esta manera:
CALL test_procedure(1,2)
Dará como resultado la siguiente salida:
** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-16 14:21:10
Sí, hay herramientas especializadas para este tipo de cosas - MySQL Debugger.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 02:22:52
Existen herramientas GUI para depurar procedimientos almacenados / funciones y scripts en MySQL. Una herramienta decente que dbForge Studio para MySQL, tiene una rica funcionalidad y estabilidad.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-31 08:40:00
Cómo depurar un procedimiento almacenado de MySQL.
Pobre depurador de mans:
Cree una tabla llamada logtable con dos columnas,
id INT
ylog VARCHAR(255)
.Haga que la columna id se incremente automáticamente.
-
Utilice este procedimiento:
delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
-
Coloque este código en cualquier lugar que desee registrar un mensaje en la tabla.
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
Es un buen leñador rápido y sucio para averiguar qué está pasando.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-27 18:29:56
Aquí se presenta otra forma
Http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
Con procedimientos personalizados de depuración MySQL y tablas de registro.
También puede colocar una simple selección en su código y ver si se ejecuta.
SELECT 'Message Text' AS `Title`;
Tengo esta idea de
Http://forums.mysql.com/read.php?99, 78155, 78225#msg-78225
También alguien creó una plantilla para procedimientos de depuración personalizados en GitHub.
Ver aquí
Http://www.bluegecko.net/mysql/debugging-stored-procedures / https://github.com/CaptTofu/Stored-procedure-debugging-routines
Se mencionó aquí
¿Cómo detectar cualquier excepción en los disparadores y almacenar procedimientos para mysql?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:26
El depurador para mysql era bueno, pero no es gratis. Esto es lo que uso ahora:
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$
Uso en el procedimiento almacenado:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
Uso del procedimiento almacenado:
call resetLog ();
call stored_proc();
select * from log;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 21:01:00
Simplemente coloco instrucciones select en áreas clave del procedimiento almacenado para verificar el estado actual de los conjuntos de datos, y luego los comento (select select...) o quitarlos antes de la producción.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-07 20:24:47
MySQL Connector / Net 6.6 tiene una característica para Depurar Procedimientos y Funciones almacenados
Instalación del depurador
Para habilitar el depurador de procedimientos almacenados:
- Para Connector/Net 6.6: Instale Connector/Net 6.6 y elija la opción Completa.
- Para Connector/Net 6.7 y versiones posteriores: Instale el producto MySQL para Visual Studio, al que pertenece el depurador de procedimientos almacenados.
Iniciar el Depurador
Para iniciar el depurador, siga estos pasos:
- Elija una conexión en el Explorador de Visual Studio Server.
- Expanda la carpeta Procedimientos almacenados. Solo los procedimientos almacenados se pueden depurar directamente. Para depurar una función definida por el usuario, cree un
procedimiento que llama a la función.- Haga clic en un nodo de procedimiento almacenado, luego haga clic con el botón derecho y en el menú contextual elija Rutina de depuración.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 13:33:51
Llego tarde a la fiesta, pero traje más cerveza:
Http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger / y https://github.com/ocelot-inc/ocelotgui
Lo intenté, y parece bastante estable, soportando puntos de interrupción e inspección variable.
No es una suite completa (solo 4,1 Mb), pero me ayudó mucho!
Cómo funciona: Se integra con su cliente mysql (estoy usando Ubuntu 14.04), y después de ejecutar:
$install
$setup yourFunctionName
Se instala una nueva base de datos en su servidor, que controla el proceso de depuración. Entonces:
$debug yourFunctionName('yourParameter')
Le dará la oportunidad de caminar paso a paso su código, y "actualizar" sus variables puede ver mejor lo que está sucediendo dentro de su código.
Consejo importante: durante la depuración, tal vez cambie (vuelva a crear el procedimiento). Después de una recreación, ejecute :exit exit y setup setup antes de un nuevo deb debug
Esta es una alternativa a los métodos "insert" y "log". Su código permanece libre de instrucciones adicionales de "depuración".
Captura de pantalla:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 05:13:44
El primer y estable depurador para MySQL está en dbForge Studio para MySQL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-22 10:20:00
MySQL Connector / NET también incluye un depurador de procedimientos almacenados integrado en visual studio a partir de la versión 6.6, Puede obtener el instalador y la fuente aquí: http://dev.mysql.com/downloads/connector/net /
Alguna documentación / capturas de pantalla: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
Puede seguir los anuncios aquí: http://forums.mysql.com/read.php?38,561817,561817#msg-561817
ACTUALIZACIÓN: El MySQL para Visual Studio se dividió de Connector / NET en un producto separado, puede seleccionarlo (incluido el depurador) desde aquí https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (sigue siendo libre y de código abierto).
DESCARGO DE RESPONSABILIDAD: Yo fui el desarrollador que creó el motor de depuración de procedimientos almacenados para MySQL para el producto Visual Studio.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 23:04:01
Tuve que usar dos herramientas diferentes para depurar procedimientos y funciones:
- dbForge - muchas GUI mysql funcionales.
- MyDebugger - herramienta especializada para la depuración ... herramienta práctica para la depuración.votación http://tinyurl.com/voteimg
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-23 17:46:20
Toad mysql. Hay una versión gratuita http://www.quest.com/toad-for-mysql /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-28 17:51:46
Respuesta correspondiente a esto por @ Brad Parks No estoy seguro acerca de la versión de MySQL, pero la mía era 5.6, por lo tanto, un poco de retoque funciona:
Creé una función debug_msg
que es función (no procedimiento) y devuelve texto (sin límite de caracteres) y luego llamo a la función como SELECT debug_msg
(params) COMO my_res_set
, código como se muestra a continuación:
CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1
READS SQL DATA
BEGIN
IF enabled=1 THEN
return concat('** DEBUG:', "** ", msg);
END IF;
END
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`(
IN RegionID VARCHAR(20),
IN RepCurrency INT(11),
IN MGID INT(11),
IN VNC VARCHAR(255)
)
BEGIN
SET @enabled = TRUE;
SET @mainQuery = "SELECT * FROM Users u";
SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`;
SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30);
SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`;
END $$
DELIMITER
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 09:04:12