MySQLのストアドプロシージャからデバッグ情報を出力します


回答:


113

オプション1:これをプロシージャに入れて、実行時に「コメント」をstdoutに出力します。

SELECT 'Comment';

オプション2:これをプロシージャに入れて、変数を標準出力に出力します。

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

これmyvar is 5は、プロシージャの実行時にstdoutに出力されます。

オプション3、と呼ばれる1つのテキスト列を持つテーブルを作成しtmptable、それにメッセージをプッシュします。

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

上記をストアドプロシージャに入れることができるので、書く必要があるのはこれだけです。

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

これにより、いくつかのキーストロークが節約されます。

オプション4、メッセージをファイルに記録する

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

このコマンドには非常に厳しい制限があります。「others」グループに作成および書き込み権限を付与するディスク上の領域にのみ、出力ファイルを書き込むことができます。/ tmpディレクトリに保存すると機能するはずです。

また、一度出力ファイルを書き込むと、それを上書きすることはできません。これは、クラッカーがWebサイトにSQLを挿入し、MySQLで任意のコマンドを実行できるという理由だけで、クラッカーがボックスをルート化するのを防ぐためです。


3
mysqlは文句を言いますNot allowed to return a result set from a trigger、何か考えはありますか?
ジェリーチン2017年

おそらく3年近くで問題を解決しましたが、出力をファイルに使用してエラーを取り除きます。
ガブリエルクリセル


5

私は通常、それにログを記録するためのストアドプロシージャを使用してログテーブルを作成します。開発中のプロシージャから必要に応じてロギングプロシージャを呼び出します。

この同じ質問に関する他の投稿を見ると、いくつかの選択肢がありますが、それは一般的な方法のようです。


5
ログテーブルはMyISAMまたはその他の非トランザクションストレージエンジンである必要があります。これにより、ロールバックされたトランザクションも追跡できます
gaborsch 2014


3

これが私がデバッグする方法です:

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 

クエリ1、2、または3がエラーをスローする場合、HANDLERはSQLEXCEPTIONをキャッチし、SHOWERRORSはエラーを表示します。注:SHOW ERRORSは、HANDLERの最初のステートメントである必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.