MySQLストアドプロシージャをどのようにデバッグしますか?


125

ストアドプロシージャをデバッグするための現在のプロセスは非常に単純です。"debug"と呼ばれるテーブルを作成し、実行時にストアドプロシージャから変数値を挿入します。これにより、スクリプトの特定のポイントで変数の値を確認できますが、MySQLストアドプロシージャをデバッグするより良い方法はありますか?


2
Windows以外のユーザー向けのGUIオプションはありますか?ストアドプロシージャをデバッグするためだけにWindowsのコピーを実行する必要があるのは、ちょっとしたジャンプです。また、ロールバックしようとしているトランザクションにいる場合、ほとんどのテーブル挿入オプションは失敗します。
コード嫌悪者2015年

回答:


44

私はあなたにとても似ています。

通常はデフォルトでfalseに設定され、実行時にtrueに設定できるDEBUGパラメータを含めます。次に、デバッグステートメントを「If DEBUG」ブロックにラップします。

また、プロセスとタイミングを確認できるように、多くのジョブでロギングテーブルを使用しています。私のデバッグコードもそこに出力を取得します。呼び出し元のパラメーター名、簡単な説明、影響を受ける行数(該当する場合)、コメントフィールド、およびタイムスタンプを含めます。

優れたデバッグツールは、すべてのSQLプラットフォームの悲しい失敗の1つです。


3
ないデバッグツールSYBASEすべてのプラットフォーム@Bobプロプストは、トリガーやストアド・プロシージャのブレークポイントデバッグと静かまともです
Anup

69

次のdebug_msgプロシージャを呼び出すと、デバッグメッセージをコンソールに出力できます。

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
    select concat('** ', msg) AS '** DEBUG:';
  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 ;

次に、次のようにテストを実行します。

CALL test_procedure(1,2)

結果は次のようになります。

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up

8
これはFUNCTIONSでは機能しないようで、理由はわかりません。常に「エラーコード:1415。関数から結果セットを返すことはできません」と表示されます。頼りになることはありますか?
Patrick M

1
@PatrickM関数は、このデバッグプロシージャがそれに依存している間は行( "結果")を返すことができません(デバッグメッセージは、プロシージャコールで返される結果セットです)。関数では、INSERT INTO my_log_table (message) VALUES (msg)関数呼び出しが終了したら(つまり、手順に戻ったら)すべてのデバッグメッセージを取得できます
Xenos

このアプローチは良いですが、コンソールへの書き込みはIDEのようなMySQL Workbenchでは効果的ではありません。すべての「select」ステートメントが新しい結果ペインを開くためです。タイムスタンプとプロシージャ名を含むエラーメッセージを記録する一時ログテーブルを作成する方がよいと思います
mustafaケマルマグロ

28

はい、この種のものに特化したツールがあります-MySQLデバッガー
ここに画像の説明を入力してください


5
私はそれを試してみることにとても熱心でした。残念ながらそれは完全な残骸です。mysqlから「関数結合は存在しません」というエラーメッセージが表示されます。その結果、GUIはSPコードを介して誤って分岐します(MySQLは正しく実行します)。「DECLARE var DEFAULT value」ローカル変数は言うまでもありません。それらが明らかにそうでない場合、それらは単にNULLとして表示されます。ああ、それも「宣言されていない識別子: 'FETCH_RADIUS_DISTSORT'」で、これはコンパイルされたステートメントです。推奨されません。
kellogs 2013年

4
それは完璧ではありませんが、これを使った私の試練は、上記の@kellogsによって報告されたものとは非常に異なる経験でした。ツールは素晴らしく、軽量で、肥大化することなく必要な仕事だけを行うようです。これは、試した他のどのツールよりもはるかに優れたエクスペリエンスでした(つまり、Visual Studio、Toad、dbForge Studioのすべてに重大な欠陥があり、これらをすべて「全体的な残骸」と比較して説明しました)。これは、デバッグ中の関数に欠陥のある構成が含まれていないためか、問題が修正されているためかは不明です。
Steve Chambers

2
このツールは、ストアドプロシージャのデバッグにも非常に役立つことがわかりました。
ralfe

22

MySQLストアドプロシージャをデバッグする方法。

貧乏人デバッガ:

  1. 2列のログ表と呼ばれるテーブルを作成し、id INTそしてlog VARCHAR(255)

  2. id列を自動インクリメントにします。

  3. この手順を使用します。

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
  4. このコードを、メッセージをテーブルに記録する場所に配置します。

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

何が起こっているのかを理解するのは、素晴らしくて汚い小さなロガーです。



10

mysqlのデバッガーは優れていましたが、無料ではありませんでした。これは私が今使っているものです:

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$

ストアドプロシージャでの使用:

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

ストアドプロシージャの使用法:

call resetLog ();
call stored_proc();
select * from log;

8

別の方法がここに示されています

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

カスタムデバッグmySqlプロシージャとログテーブルを使用します。

コードに単純な選択を配置して、それが実行されるかどうかを確認することもできます。

SELECT 'Message Text' AS `Title`; 

このアイデアは

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

また、誰かがカスタムデバッグ手順のテンプレートをGitHubで作成しました。

こちらをご覧ください

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

ここで言及されました

mysqlのトリガーとストアプロシージャで例外をキャッチする方法は?


7

ストアドプロシージャの主要な領域にselectステートメントを配置して、データセットの現在のステータスを確認し、コメントアウト(--select ...)するか、プロダクション前に削除するだけです。


7

私はパーティーに遅れましたが、ビールをもっと持ってきました:

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

私が試したところ、かなり安定しており、ブレークポイントと変数の検査をサポートしています。

これは完全なスイート(わずか4,1 Mb)ではありませんが、非常に役立ちました。

仕組み:mysqlクライアント(私はUbuntu 14.04を使用しています)と統合し、実行後:

$install
$setup yourFunctionName

デバッグプロセスを制御する新しいデータベースをサーバーにインストールします。そう:

$debug yourFunctionName('yourParameter')

ステップバイステップでコードを実行し、変数を「更新」する機会が与えられます。これにより、コード内で何が行われているのかをよりよく確認できます。

重要なヒント:デバッグ中に変更する可能性があります(手順を再作成)。再作成後、新しい$ debugの前に$ exitおよび$ setupを実行します。

これは、「挿入」および「ログ」メソッドの代替手段です。コードには、追加の「デバッグ」命令がありません。

スクリーンショット:

オセロットブレークポイントのステッピング


6

MySQL Connector / Net 6.6には、ストアドプロシージャと関数デバッグする機能があります。

デバッガーのインストール

ストアドプロシージャデバッガーを有効にするには:

  • Connector / Net 6.6の場合:Connector / Net 6.6をインストールし、[完全]オプションを選択します。
  • Connector / Net 6.7以降の場合:ストアドプロシージャデバッガーが属するVisual Studio用の製品MySQLをインストールします。

デバッガーの開始

デバッガーを起動するには、次の手順に従います。

  • Visual Studioサーバーエクスプローラーで接続を選択します。
  • ストアドプロシージャフォルダーを展開します。直接デバッグできるのは、ストアドプロシージャだけです。ユーザー定義関数をデバッグするに
    は、関数を呼び出すストアドプロシージャを作成します。
  • ストアドプロシージャノードをクリックして右クリックし、コンテキストメニューから[デバッグルーチン]を選択します。

5

MySql Connector / NETには、バージョン6.6の時点でVisual Studioに統合されたストアドプロシージャデバッガーも含まれています。インストーラーとソースは、http//dev.mysql.com/downloads/connector/net/から入手できます。

いくつかのドキュメント/スクリーンショット:https : //dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

ここのアナウンスに従うことができます:http ://forums.mysql.com/read.php?38,561817,561817#msg-561817

更新:Visual StudioのMySqlはConnector / NETから別の製品に分割されました。https://dev.mysql.com/downloads/windows/visualstudio/1.2.htmlからそれを選択できます (デバッガーを含む)。フリー&オープンソース)。

免責事項:私はMySQL for Visual Studio製品のストアドプロシージャデバッガエンジンを作成した開発者でした。


MySQLとConnector .NETを使用する場合、マルチホスト接続文字列に問題があります。私はここで問題を説明しました ..。誰かがこれを調査するつもりかどうか疑問に思っていましたか?これは、MySQLを使用する多くの.Net開発者にかなりの問題を引き起こしています...
Hooman Bahreini

1
申し訳ありませんが、私はOracleに勤務しておらず、暇な時間があまりないので、MySQLのサポートに連絡することをお勧めします。
フェルナンドゴンザレスサンチェス

4

MySQLの最初の安定したデバッガは、dbForge Studio for MySQLにあります


3

手順と機能をデバッグするために2つの異なるツールを使用しました。

  1. dbForge-多くの機能的なmysql GUI。
  2. MyDebugger-デバッグに特化したツール...デバッグに便利なツール。投票http://tinyurl.com/voteimg

3

MySQLユーザー定義変数(セッションで共有)をログ出力として使用できます。

DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
  SET @stmt = CONCAT('SELECT * FROM ', tableName);
  PREPARE pStmt FROM @stmt;
  EXECUTE pStmt;
  DEALLOCATE PREPARE pStmt;
  -- uncomment after debugging to cleanup
  -- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;

出力されます:

SELECT * FROM foo

1

ヒキガエルmysql。フリーウェアのバージョンがあり ますhttp://www.quest.com/toad-for-mysql/


1
私は長年Toadを使用してきましたが、sprocをデバッグするための特別な機能があることに気づいていませんでした。Toadをどのように使用しているかを明確にできますか?
Cory House

mysqlのToad 6.3を今見たところ、ブレークポイントとすべてを備えたデバッグ機能があるようです。デバッグ機能が動作していないということですか?または、バージョンが古く、デバッグ機能が含まれていない可能性がありますか?
Joyce

1

@Brad Parksによるこれに対応する回答MySQLのバージョンは不明ですが、私のバージョンは5.6でした。

debug_msg(プロシージャではなく)関数であり、テキスト(文字数制限なし)を返す関数を作成し、その関数をSELECT debug_msg(params)AS として呼び出し、my_res_set以下のようにコード化します。

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