Drucken Sie Debugging-Informationen aus gespeicherten Prozeduren in MySQL

82

Gibt es in MySQL eine Möglichkeit, Debugging-Nachrichten in Standard, Versuchung oder Protokolldatei zu drucken? Etwas wie:

  • print in SQLServer
  • DBMS_OUTPUT.PUT_LINE in Oracle
Erdnuss
quelle
Protokollieren Sie von überall mit incron stackoverflow.com/a/41766032/953374
bortunac

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.

Patrick
quelle
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.

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

Der schnelle Weg, etwas zu drucken, ist:

select '** Place your mesage here' AS '** DEBUG:';
Roberto Rodriguez
quelle
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.

Mohan Munisifreddy
quelle