¿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?

Author: Cory House, 2008-11-07

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.

 38
Author: Bob Probst,
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
 52
Author: Brad Parks,
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.
introduzca la descripción de la imagen aquí

 26
Author: George,
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.

 21
Author: Josef Miran,
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:

  1. Cree una tabla llamada logtable con dos columnas, id INT y log VARCHAR(255).

  2. Haga que la columna id se incremente automáticamente.

  3. Utilice este procedimiento:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  4. 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.

 19
Author: Eric Leschinski,
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?

 8
Author: Jeremy S.,
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;
 8
Author: Tone Škoda,
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.

 7
Author: Ash Machine,
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.
 6
Author: Rahul Tripathi,
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:

escalonamiento del punto de interrupción del ocelote

 6
Author: Marcelo Amorim,
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

 4
Author: Zoitc2014,
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.

 4
Author: Fernando Gonzalez Sanchez,
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:

  1. dbForge - muchas GUI mysql funcionales.
  2. MyDebugger - herramienta especializada para la depuración ... herramienta práctica para la depuración.votación http://tinyurl.com/voteimg
 3
Author: GeoGo,
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 /

 1
Author: Joyce,
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
 1
Author: aniruddha,
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