web-dev-qa-db-ja.com

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

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

115
Cory House

私はあなたに非常に似たようなことをします。

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

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

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

41
Bob Probst

次の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 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 ;

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

CALL test_procedure(1,2)

次の出力が生成されます。

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

はい、この種の専用ツールがあります- MySQL Debugger
enter image description here

28
George

ストアドプロシージャをデバッグするためのGUIツール /MySQLの関数とスクリプトがあります。 dbForge Studio for MySQLが提供する適切なツールは、豊富な機能と安定性を備えています。

21
Josef Miran

MySQLストアドプロシージャのデバッグ方法

貧乏人デバッガー:

  1. id INTlog VARCHAR(255)の2つの列を持つlogtableというテーブルを作成します。

  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));
    

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

19
Eric Leschinski

Debugger for 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;
9
Tone Škoda

別の方法をここに示します

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

カスタムデバッグmySqlプロシージャとログテーブル。

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

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のトリガーおよびストアプロシージャで例外をキャッチする方法

8
Jeremy S.

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

7
Ash Machine

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

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を実行します。

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

スクリーンショット:

ocelot breakpoint stepping

6
Marcelo Amorim

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

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

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

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

デバッガーの起動

デバッガーを開始するには、次の手順を実行します。

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

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の最初の安定したデバッガーは、dbForge Studio for MySQLにあります。

4
Zoitc2014

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

  1. dbForge-多くの機能的なmysql GUI。
  2. MyDebugger-デバッグ用の専用ツール...デバッグ用の便利なツール。 vote http://tinyurl.com/voteimg
3
GeoGo

@ -Brad Parksによる this に対応する回答

関数(プロシージャではなく)であり、テキスト(文字制限なし)を返す関数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
1
aniruddha

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

1
Joyce