Comment déboguer les procédures stockées MySQL?

mon processus actuel de débogage des procédures stockées est très simple. Je crée une table appelée "debug" où j'insère les valeurs variables de la procédure stockée pendant qu'elle tourne. Cela me permet de voir la valeur de n'importe quelle variable à un point donné dans le script, mais y a-t-il une meilleure façon de déboguer les procédures stockées MySQL?

103
demandé sur Cory House 2008-11-07 22:58:12

15 réponses

je vous fais quelque chose de très similaire.

je vais généralement inclure un param de débogage qui est par défaut à false et je peux définir à true au moment de l'exécution. Ensuite, enveloppez les déclarations de débogage dans un bloc" If DEBUG".

j'utilise également une table de journalisation avec beaucoup de mes travaux afin que je puisse examiner les processus et le calendrier. Mon Déboguer le code de sortie. - Je inclure l'appel param nom, une brève description, le nombre de lignes affectées (le cas échéant), un commentaires champ et un horodatage.

de bons outils de débogage est l'un des tristes défauts de toutes les plateformes SQL.

38
répondu Bob Probst 2008-11-21 18:32:19

la procédure suivante debug_msg peut être appelée pour simplement afficher un message de débogage sur la console:

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 ;

puis exécuter le test comme ceci:

CALL test_procedure(1,2)

il en résultera la sortie suivante:

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

Oui, il existe des outils spécialisés pour ce genre de choses - MySQL Debugger .

enter image description here

26
répondu George 2012-11-16 02:22:52

Il y a outils d'interface graphique pour le débogage des procédures stockées / fonctions et scripts MySQL. Un outil décent que dbForge Studio pour MySQL, a une fonctionnalité riche et la stabilité.

21
répondu Josef Miran 2010-08-31 08:40:00

comment déboguer une procédure MySQL stockée.

Pauvres mans débogueur:

  1. créez un tableau appelé logtable avec deux colonnes, id INT et log VARCHAR(255) .

  2. Faire la colonne id de type autoincrement.

  3. utiliser cette procédure:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  4. Mettez ce code n'importe où vous voulez enregistrer un message à la table.

    call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
    

c'est un bon petit logger rapide et sale pour comprendre ce qui se passe.

19
répondu Eric Leschinski 2013-12-27 18:29:56

une autre voie est présentée ici

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

avec des procédures de débogage mySql personnalisées et des tables de journalisation.

vous pouvez aussi simplement placer un simple select dans votre code et voir s'il est exécuté.

SELECT 'Message Text' AS `Title`; 

j'ai eu cette idée de

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

quelqu'un a aussi créé un modèle pour les procédures de débogage personnalisées sur GitHub.

voir ici

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

a été mentionné ici

Comment saisir toute exception dans les triggers et stocker des procédures pour mysql?

8
répondu Jeremy S. 2017-05-23 12:26:26

débogueur pour mysql était bon mais pas libre. C'est ce que j'utilise actuellement:

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$

l'Utilisation dans une procédure stockée:

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

usage de la procédure stockée:

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

je place simplement les instructions select dans les zones clés de la procédure stockée pour vérifier l'état actuel des ensembles de données, puis les commenter (--select...) ou les retirer avant la production.

7
répondu Ash Machine 2008-11-07 20:24:47

Connecteur MySQL / Net 6.6 possède une caractéristique pour déboguer les procédures et les fonctions stockées

installation du Débogueur

pour activer le débogueur de procédure stocké:

  • pour connecteur/Net 6.6: installer Connecteur/Net 6.6 et choisir l'option complète.
  • pour connecteur / réseau 6.7 et supérieur: installer le produit MySQL pour Visual Studio, auquel appartient le débogueur de procédure stocké.

démarrage du Débogueur

pour démarrer le débogueur, suivez les étapes suivantes:

  • Choisissez une connexion dans le Visual Studio Server Explorer.
  • étendre le dossier des procédures stockées. Seules les procédures stockées peuvent être débogué directement. Pour déboguer une fonction définie par l'utilisateur, créer un stocké

    procédure qui appelle la fonction.
  • cliquez sur un noeud de procédure stocké, puis faites un clic droit et dans le menu contextuel choisissez la Routine de débogage.
6
répondu Rahul Tripathi 2015-12-24 13:33:51

je suis en retard à la fête, mais j'ai apporté plus de bière:

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

j'ai essayé, et il semble assez stable, supportant les points de rupture et l'inspection Variable.

ce n'est pas une suite complète (seulement 4,1 Mo) mais m'a beaucoup aidé!

comment ça marche: Il s'intègre avec votre client mysql (J'utilise Ubuntu 14.04), et après avoir exécuté:

$install
$setup yourFunctionName

il installe une nouvelle base de données sur votre serveur, qui contrôle le processus de débogage. So:

$debug yourFunctionName('yourParameter')

vous donnera une chance de marcher pas à pas votre code, et" rafraîchir " vos variables, vous pouvez mieux voir ce qui se passe à l'intérieur de votre code.

conseil Important: pendant le débogage, peut-être que vous changerez (re-créer procédure.) Après une re-création, exécutez: $exit et $setup avant un nouveau $ debug

il s'agit d'une alternative aux méthodes" insérer "et" enregistrer". Votre code reste libre d'instructions supplémentaires de" débogage".

Capture d'écran:

ocelot breakpoint stepping

6
répondu Marcelo Amorim 2016-03-07 05:13:44

le premier débogueur stable pour MySQL est en studio dbForge pour MySQL

4
répondu Zoitc2014 2010-09-22 10:20:00

Connecteur MySql / NET inclut également un débogueur de procédure stocké intégré dans visual studio à partir de la version 6.6, Vous pouvez obtenir l'installateur et la source ici: http://dev.mysql.com/downloads/connector/net/

quelques documents / captures d'écran: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

, Vous pouvez suivre les annonces ici: http://forums.mysql.com/read.php?38,561817, 561817#msg-561817

mise à jour: le MySql pour Visual Studio a été séparé du connecteur / NET dans un produit séparé, vous pouvez le choisir (y compris le débogueur) d'ici https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (still free & open source).

avertissement: j'étais le développeur qui a écrit le moteur de débogueur de procédures stockées pour MySQL pour Visual Studio produit.

4
répondu Fernando Gonzalez Sanchez 2018-08-07 23:04:01

j'ai utilisé deux outils différents pour déboguer les procédures et les fonctions:

  1. dbForge - de nombreuses fonctions mysql GUI.
  2. MyDebugger-outil spécialisé pour le débogage ... outil pratique pour déboguer. vote http://tinyurl.com/voteimg
3
répondu GeoGo 2011-12-23 17:46:20

Crapaud mysql. Il y a une version freeware http://www.quest.com/toad-for-mysql/

1
répondu Joyce 2011-03-28 17:51:46

réponse correspondant à ce par @Brad Parks Pas sûr de la version MySQL, mais la mienne était 5.6, donc un peu de peaufinage fonctionne:

j'ai créé une fonction debug_msg qui est fonction (pas procédure) et renvoie du texte(pas de limite de caractères) et ensuite appeler la fonction comme sélectionner debug_msg (params) comme my_res_set , code comme ci-dessous:

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
répondu aniruddha 2017-11-10 09:04:12