Como depura os procedimentos armazenados no MySQL?

o meu processo actual para depurar procedimentos armazenados é muito simples. Eu crio uma tabela chamada "debug" onde eu insiro valores variáveis do procedimento armazenado à medida que ele corre. Isto permite-me ver o valor de qualquer variável num dado ponto do script, mas existe uma maneira melhor de depurar os procedimentos armazenados no MySQL?

Author: Cory House, 2008-11-07

15 answers

Eu faço algo muito parecido contigo.

Normalmente incluo um programa de depuração que corresponde por omissão ao false e posso definir o true em tempo de execução. Em seguida, embrulhe as declarações de depuração num bloco "se depurar".

Eu também uso uma tabela de registro com muitos dos meus trabalhos para que eu possa rever processos e tempo. O meu código de depuração também sai lá. Eu incluo o nome chamador param, uma breve descrição, Contagem de linhas afetadas( se apropriado), um campo de comentários e um tempo carimbo.

Boas ferramentas de depuração é uma das falhas tristes de todas as plataformas SQL.

 38
Author: Bob Probst, 2008-11-21 18:32:19

O seguinte procedimento debug_msg pode ser chamado para simplesmente enviar uma mensagem de depuração para a 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 ;

Então faça o teste assim:

CALL test_procedure(1,2)

Resultará no seguinte resultado:

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up
 52
Author: Brad Parks, 2014-07-16 14:21:10

Sim, há ferramentas especializadas para este tipo de coisa - depurador MySQL.
enter image description here

 26
Author: George, 2012-11-16 02:22:52

Existem ferramentas GUI para depurar procedimentos armazenados / funções e programas no MySQL. Uma ferramenta decente que dbForge Studio para MySQL, tem rica funcionalidade e estabilidade.

 21
Author: Josef Miran, 2010-08-31 08:40:00

Como depurar um procedimento de armazenamento MySQL.

Pobre depurador de mans:

  1. Crie uma tabela chamada logtable com duas colunas, id INT e log VARCHAR(255).

  2. Faz A coluna de identificação autoincrement.

  3. Utilizar este procedimento:

    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 onde quiser para registar uma mensagem na tabela.

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
    
É um pequeno lenhador rápido e sujo para descobrir o que se passa.
 19
Author: Eric Leschinski, 2013-12-27 18:29:56

Outra maneira é apresentada aqui

Http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html

Com procedimentos personalizados de depuração mySql e tabelas de Registo.

Você também pode apenas colocar uma seleção simples no seu código e ver se ele é executado.

SELECT 'Message Text' AS `Title`; 
Tive esta ideia de

Http://forums.mysql.com/read.php?99,78155, 78225#msg-78225

Também alguém criou um modelo para procedimentos de depuração personalizados em GitHub.

Veja aqui

Http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines

Foi mencionado aqui

Como capturar qualquer exceção em gatilhos e procedimentos de armazenamento para mysql?

 8
Author: Jeremy S., 2017-05-23 12:26:26
O depurador para o mysql era bom, mas não é de graça. Isto é o que eu uso agora:
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$

Utilização no procedimento armazenado:

call dolog(concat_ws(': ','@simple_term_taxonomy_id',  @simple_term_taxonomy_id));

Utilização do procedimento armazenado:

call resetLog ();
call stored_proc();
select * from log;
 8
Author: Tone Škoda, 2015-02-23 21:01:00

Eu simplesmente coloco as declarações selecionadas em áreas-chave do procedimento armazenado para verificar o estado atual dos conjuntos de dados, e depois comentá-las (--select...) ou removê-los antes da produção.

 7
Author: Ash Machine, 2008-11-07 20:24:47

O conector MySQL / Net 6.6 tem uma funcionalidade para depurar procedimentos e funções armazenados

Instalar o depurador

Para activar o depurador de procedimentos armazenado:

  • para o conector / Net 6.6: Instale o conector / Net 6.6 e escolha a opção completa.
  • para o Connector / Net 6.7 e mais tarde: Instale o produto MySQL para o Visual Studio, ao qual pertence o depurador de procedimentos armazenado.

Iniciando a Depurador

Para iniciar o depurador, siga estes passos:

    Escolhe uma ligação no Visual Studio Server Explorer.
  • expandir a pasta de procedimentos armazenados. Só os procedimentos armazenados podem ser depurados directamente. Para depurar uma função definida pelo utilizador, crie um
    armazenado procedimento que chama a função.
  • carregue num nó de procedimento armazenado, depois carregue com o botão direito e, no menu de contexto, escolha a rotina de depuração.
 6
Author: Rahul Tripathi, 2015-12-24 13:33:51
Estou atrasado para a festa, mas trouxe mais Cerveja.

Http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ e https://github.com/ocelot-inc/ocelotgui

Eu tentei, e parece bastante estável, suportando pontos de paragem e inspecção variável. Não é uma suite completa (apenas 4,1 Mb), mas ajudou-me muito! Como funciona?: Integra-se com o seu cliente mysql( estou a usar o Ubuntu 14.04), e depois de executar:
$install
$setup yourFunctionName

It instala uma nova base de dados no seu servidor, que controla o processo de depuração. Então ...

$debug yourFunctionName('yourParameter')

Dar-lhe-á a oportunidade de andar passo a passo com o seu código, e "refrescando" as suas variáveis você pode ver melhor o que está a acontecer dentro do seu código.

dica importante: durante a depuração, talvez você mude (recriar o procedimento). Após uma recriação, execute: $exit e $setup antes de uma nova depuração $

Esta é uma alternativa aos métodos" inserir "e" log". O seu código continua livre. de instruções adicionais de "depuração".

Imagem:

ocelot breakpoint stepping

 6
Author: Marcelo Amorim, 2016-03-07 05:13:44
O primeiro depurador estável para o MySQL está no estúdio dbForge para o MySQL.
 4
Author: Zoitc2014, 2010-09-22 10:20:00

O conector MySql / NET também inclui um depurador de procedimentos armazenado Integrado em estúdio visual a partir da versão 6.6, Você pode obter o instalador e o código aqui: http://dev.mysql.com/downloads/connector/net/

Alguma documentação / imagens: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

Pode seguir as declarações aqui.: http://forums.mysql.com/read.php?38,561817, 561817#msg-561817

Actualização: a MySql for Visual Studio foi dividido a partir do conector/NET em um produto separado, você pode escolhê-lo (incluindo o depurador) a partir daqui {[[14]} https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (ainda livre e de código aberto).

DISCLAIMER: eu fui o desenvolvedor que foi o autor do motor de depurador de procedimentos armazenados para o MySQL para o Visual Studio product.

 4
Author: Fernando Gonzalez Sanchez, 2018-08-07 23:04:01

Usei duas ferramentas diferentes para depurar procedimentos e funções:

  1. dbForge-many functional mysql GUI.
  2. A ferramenta especializada do meu depurador para depuração ... ferramenta útil para depuração.Votação http://tinyurl.com/voteimg
 3
Author: GeoGo, 2011-12-23 17:46:20
Toad mysql. Existe uma versão de freeware http://www.quest.com/toad-for-mysql/
 1
Author: Joyce, 2011-03-28 17:51:46

Resposta correspondente a isto por @Brad Parks Não tenho certeza sobre a versão MySQL, mas a minha era 5.6, daí um pouco de ajustes funciona:

Criei uma função debug_msg que é a função (não o procedimento) e devolve o texto (sem limite de caracteres) e depois invoca a função como seleccionar debug_msg (parâmetros) como my_res_set, o código abaixo:

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, 2017-11-10 09:04:12