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?
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.
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
Oui, il existe des outils spécialisés pour ce genre de choses - MySQL Debugger .
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é.
comment déboguer une procédure MySQL stockée.
Pauvres mans débogueur:
-
créez un tableau appelé logtable avec deux colonnes,
id INT
etlog VARCHAR(255)
. -
Faire la colonne id de type autoincrement.
-
utiliser cette procédure:
delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
-
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.
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?
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;
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.
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.
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:
le premier débogueur stable pour MySQL est en studio dbForge pour MySQL
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.
j'ai utilisé deux outils différents pour déboguer les procédures et les fonctions:
- dbForge - de nombreuses fonctions mysql GUI.
- MyDebugger-outil spécialisé pour le débogage ... outil pratique pour déboguer. vote http://tinyurl.com/voteimg
Crapaud mysql. Il y a une version freeware http://www.quest.com/toad-for-mysql/
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