Drucken Sie Debugging-Informationen aus gespeicherten Prozeduren in MySQL


Antworten:


110

Option 1: Fügen Sie dies in Ihre Prozedur ein, um 'Kommentar' zu stdout zu drucken, wenn es ausgeführt wird.

SELECT 'Comment';

Option 2: Fügen Sie dies in Ihre Prozedur ein, um eine Variable damit zu stdout zu drucken:

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);

Dies wird myvar is 5bei Ausführung der Prozedur auf stdout gedruckt .

Option 3: Erstellen Sie eine Tabelle mit einer aufgerufenen tmptableTextspalte und senden Sie Nachrichten an diese:

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);

Sie könnten das Obige in eine gespeicherte Prozedur einfügen, sodass Sie nur Folgendes schreiben müssten:

CALL log(concat('the value is', myvar));

Das spart ein paar Tastenanschläge.

Option 4, Nachrichten in Datei protokollieren

select "penguin" as log into outfile '/tmp/result.txt';

Dieser Befehl unterliegt sehr starken Einschränkungen. Sie können die Outfile nur in Bereiche auf der Festplatte schreiben, die der Gruppe "Andere" Erstellungs- und Schreibberechtigungen erteilen. Es sollte funktionieren, wenn es im Verzeichnis / tmp gespeichert wird.

Auch wenn Sie das Outfile einmal geschrieben haben, können Sie es nicht mehr überschreiben. Dies soll verhindern, dass Cracker Ihre Box rooten, nur weil sie SQL in Ihre Website injiziert haben und beliebige Befehle in MySQL ausführen können.


3
MySQL beschwert sich Not allowed to return a result set from a trigger, eine Idee?
Jerry Chin

Wahrscheinlich haben Sie das Problem in fast 3 Jahren behoben, aber verwenden Sie die Ausgabe, um den Fehler zu beheben.
Gabriel Cliseru


5

Normalerweise erstelle ich eine Protokolltabelle mit einer gespeicherten Prozedur, um mich dort anzumelden. Rufen Sie die Protokollierungsprozedur auf, wo immer dies aus der in der Entwicklung befindlichen Prozedur erforderlich ist.

Wenn man sich andere Beiträge zu dieser Frage ansieht, scheint dies eine gängige Praxis zu sein, obwohl es einige Alternativen gibt.


5
Die Protokolltabelle sollte MyISAM oder eine andere nicht-transaktionale Speicher-Engine sein, damit Sie sogar zurückgesetzte Transaktionen
verfolgen


3

So werde ich debuggen:

CREATE PROCEDURE procedure_name() 
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;  --this is the only one which you need
        ROLLBACK;   
    END; 
    START TRANSACTION;
        --query 1
        --query 2
        --query 3
    COMMIT;
END 

Wenn Abfrage 1, 2 oder 3 einen Fehler auslösen, fängt HANDLER die SQLEXCEPTION ab und SHOW ERRORS zeigt Fehler für uns an. Hinweis: SHOW ERRORS sollte die erste Anweisung im HANDLER sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.