MySQL saklı yordamlarında nasıl hata ayıklayabilirsiniz?


125

Mevcut saklı yordamlarda hata ayıklama sürecim çok basit. Çalışırken saklı yordamdan değişken değerleri eklediğim "debug" adlı bir tablo oluşturuyorum. Bu, komut dosyasında belirli bir noktada herhangi bir değişkenin değerini görmeme izin veriyor, ancak MySQL saklı yordamlarında hata ayıklamanın daha iyi bir yolu var mı?


2
Windows olmayan kullanıcılar için herhangi bir GUI seçeneği var mı? Sadece saklı yordamlarda hata ayıklamak için Windows'un bir kopyasını çalıştırmak zorunda kalmak biraz atlamadır. Ve geri almak üzere olduğunuz bir işlemdeyseniz, tablo ekleme seçeneklerinin çoğu başarısız olur.
Code Abominator

Yanıtlar:


44

Sana çok benzer bir şey yapıyorum.

Genellikle varsayılan olarak false olan bir DEBUG parametresi eklerim ve çalışma zamanında true olarak ayarlayabilirim. Sonra hata ayıklama deyimlerini bir "Eğer DEBUG" bloğuna sarın.

Ayrıca birçok işimde süreçleri ve zamanlamayı gözden geçirebilmek için bir kayıt tablosu kullanıyorum. Hata Ayıklama kodum da orada çıktı alır. Çağıran parametre adını, kısa bir açıklamayı, etkilenen satır sayılarını (uygunsa), bir yorum alanını ve bir zaman damgasını ekliyorum.

İyi hata ayıklama araçları, tüm SQL platformlarının üzücü başarısızlıklarından biridir.


3
Tüm platformlar @Bob Probst değil, sybase hata ayıklama araçları, tetikleme ve depolanan prosedürler için kesme noktası hata ayıklaması ile oldukça iyi
Anup

69

Aşağıdaki debug_msgprosedür basitçe konsola bir hata ayıklama mesajı göndermek için çağrılabilir:

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 ;

Ardından testi şu şekilde çalıştırın:

CALL test_procedure(1,2)

Aşağıdaki çıktıyla sonuçlanacaktır:

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

8
Bu, FONKSİYONLAR için işe yaramıyor gibi görünüyor ve neden olduğuna dair hiçbir fikrim yok. Her zaman "Hata Kodu: 1415. Bir işlevden bir sonuç kümesi döndürmeye izin verilmiyor" verir. Herhangi bir başvuru var mı?
Patrick M

1
@PatrickM Fonksiyonları, bu hata ayıklama prosedürü buna bağlıyken satırları ("sonuç") döndüremez (hata ayıklama mesajları, prosedür çağrısında döndürülen sonuç kümeleridir). İşlevlerde, yalnızca INSERT INTO my_log_table (message) VALUES (msg)işlev çağrıları bittikten sonra tüm hata ayıklama mesajlarını alabilirsiniz (yani: prosedüre geri döndünüz)
Xenos

Bu yaklaşım iyidir ancak konsola yazmak IDE'ler gibi MySQL Workbench üzerinde etkili değildir. çünkü her "select" ifadesi yeni sonuç bölmesini açar. Hata mesajlarını zaman damgası ve prosedür adıyla kaydetmek için geçici bir günlük tablosu oluşturmanın daha iyi olacağını düşünüyorum
mustafa kemal tuna

28

Evet, bu tür şeyler için özel araçlar var - MySQL Debugger .
görüntü açıklamasını buraya girin


5
denemek için çok hevesliydim. Ne yazık ki tam bir enkaz. Mysql'den temin edilen "işlev birleşmesi mevcut değil" hata mesajını alıyorum, bunun sonucunda GUI SP kodu aracılığıyla yanlış dallanıyor (MySQL bunu doğru çalıştırsa da). "DECLARE var DEFAULT değeri" yerel değişkenlerinden bahsetmiyorum bile. Açıkça olmadıklarında sadece NULL olarak görünürler. Oh, ve ayrıca "Bildirilmemiş tanımlayıcı: 'FETCH_RADIUS_DISTSORT" "burada derlenmiş bir ifadeydi. Tavsiye edilmez.
kellogs

4
Mükemmel değil ama bununla ilgili denemem, yukarıda @kellogs tarafından bildirilenden çok farklı bir deneyim oldu. Araç güzel ve hafiftir ve herhangi bir şişkinlik olmadan gereken işi yapar gibi görünüyor. Benim için denenen diğer araçlardan (yani Visual Studio, Toad ve dbForge Studio, hepsinin büyük kusurları vardı - bunların hepsini kıyaslandığında "tam bir enkaz" olarak tanımlayacaktı) çok daha iyi bir deneyim oldu. Bunun nedeni, hata ayıklanmakta olan işlevin hatalı yapılardan herhangi birini içermediğinden veya sorunların çözülüp çözülmediğinden emin değil.
Steve Chambers

2
Ayrıca bu aracı, depolanan prosedürlerimde hata ayıklamak için oldukça yararlı buldum.
ralfe

22

MySQL saklı yordamında hata ayıklama.

Zavallı mans hata ayıklayıcı:

  1. İki sütun içeren logtable adlı bir tablo oluşturun id INTve log VARCHAR(255).

  2. Kimlik sütununu otomatik artırın.

  3. Bu prosedürü kullanın:

    delimiter //
    DROP PROCEDURE `log_msg`//
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
    BEGIN
        insert into logtable select 0, msg;
    END
    
  4. Bu kodu, tabloya bir mesaj kaydetmek istediğiniz herhangi bir yere koyun.

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

Neler olduğunu anlamak için hoş, hızlı ve kirli bir günlükçü.



10

Mysql için hata ayıklayıcı iyiydi, ancak ücretsiz değil. Şu an kullandığım şey bu:

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$

Depolanan yordamda kullanım:

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

saklı yordamın kullanımı:

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

8

Burada başka bir yol sunulmuştur

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

özel hata ayıklama mySql prosedürleri ve günlük tabloları ile.

Ayrıca kodunuza basit bir seçim yerleştirebilir ve çalıştırılıp çalıştırılmadığını görebilirsiniz.

SELECT 'Message Text' AS `Title`; 

Bu fikri nereden aldım

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

Ayrıca biri GitHub'da özel hata ayıklama prosedürleri için bir şablon oluşturdu.

Buraya bakın

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

Burada bahsedildi

Mysql için tetikleyicilerde herhangi bir istisna nasıl yakalanır ve prosedürler saklanır?


7

Veri kümelerinin mevcut durumunu kontrol etmek için yalnızca saklı yordamın önemli alanlarına select deyimleri yerleştiriyorum ve ardından bunları yorumluyorum (--select ...) veya üretimden önce kaldırıyorum.


7

Partiye geç kaldım ama biraz daha bira getirdim:

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

Denedim ve oldukça kararlı görünüyor, Kesme Noktaları ve Değişken denetimi destekliyor.

Tam bir paket değil (sadece 4,1 Mb) ama bana çok yardımcı oldu!

Nasıl çalışır: mysql istemcinizle bütünleşir (Ubuntu 14.04 kullanıyorum) ve siz çalıştırdıktan sonra:

$install
$setup yourFunctionName

Sunucunuza, hata ayıklama sürecini kontrol eden yeni bir veritabanı kurar. Yani:

$debug yourFunctionName('yourParameter')

size kodunuzu adım adım ilerletme şansı verir ve değişkenlerinizi "yenilemek", kodunuzun içinde neler olup bittiğini daha iyi görüntüleyebilirsiniz.

Önemli İpucu: hata ayıklama sırasında, belki değiştirirsiniz (prosedürü yeniden oluşturun). Yeniden oluşturduktan sonra, yeni bir $ hata ayıklamadan önce $ exit ve $ setup'ı yürütün.

Bu, "insert" ve "log" yöntemlerine bir alternatiftir. Kodunuz, ek "hata ayıklama" talimatları içermez.

Ekran görüntüsü:

ocelot kesme noktası adımlaması


6

MySQL Connector / Net 6.6, Depolanan Prosedür ve İşlevlerde Hata Ayıklama özelliğine sahiptir

Hata Ayıklayıcıyı Yükleme

Depolanan yordam hata ayıklayıcısını etkinleştirmek için:

  • Connector / Net 6.6 için: Connector / Net 6.6'yı kurun ve Complete seçeneğini seçin.
  • Connector / Net 6.7 ve sonrası için: Depolanan yordam hata ayıklayıcısının ait olduğu Visual Studio için MySQL ürününü yükleyin.

Hata Ayıklayıcıyı Başlatma

Hata ayıklayıcıyı başlatmak için şu adımları izleyin:

  • Visual Studio Sunucu Gezgini'nde bir bağlantı seçin.
  • Depolanan Prosedürler klasörünü genişletin. Yalnızca saklı yordamlarda doğrudan hata ayıklanabilir. Kullanıcı tanımlı bir işlevde hata ayıklamak için
    , işlevi çağıran bir saklı yordam oluşturun .
  • Bir saklı yordam düğümüne tıklayın, ardından sağ tıklayın ve içerik menüsünden Hata Ayıklama Rutini'ni seçin.

5

MySql Bağlayıcısı / NET ayrıca 6.6 sürümünden itibaren visual Studio'ya entegre edilmiş bir saklı yordam hata ayıklayıcı içerir, Yükleyiciyi ve kaynağı buradan edinebilirsiniz: http://dev.mysql.com/downloads/connector/net/

Bazı belgeler / ekran görüntüleri: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html

Duyuruları buradan takip edebilirsiniz: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

GÜNCELLEME: Visual Studio için MySql, Bağlayıcı / NET'ten ayrı bir ürüne ayrıldı, buradan (hata ayıklayıcı dahil) https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (hala ücretsiz ve açık kaynak).

SORUMLULUK REDDİ: Visual Studio ürünü için MySQL için Depolanan yordam hata ayıklayıcı motorunu yazan geliştiriciydim.


MySQL ve Connector .NET kullanılırken çoklu ana bilgisayar bağlantı dizesiyle ilgili bir sorun var. Konuyu burada anlattım .. .Bununla ilgilenecek biri var mı acaba? Bu, MySQL kullanan çoğumuz .Net geliştiricileri için oldukça fazla soruna neden oldu ...
Hooman Bahreini

1
Bunu duyduğuma üzüldüm, artık Oracle'da çalışmıyorum ve çok boş vaktim yok, MySQL desteğiyle iletişime geçmenizi öneririm.
Fernando Gonzalez Sanchez

4

MySQL için ilk ve kararlı hata ayıklayıcı, MySQL için dbForge Studio'da


3

Prosedürlerde ve işlevlerde hata ayıklamak için iki farklı araç kullandım:

  1. dbForge - birçok işlevsel mysql GUI.
  2. MyDebugger - hata ayıklama için özel araç ... hata ayıklama için kullanışlı bir araç. oy http://tinyurl.com/voteimg

3

MySQL kullanıcı tanımlı değişken (oturumda paylaşılan) günlük çıktısı olarak kullanılabilir:

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;

çıktı:

SELECT * FROM foo

1

Kurbağa mysql. Ücretsiz bir sürüm http://www.quest.com/toad-for-mysql/


1
Toad'ı yıllarca kullandım, ancak zincir dişlilerinin hatalarını ayıklamak için herhangi bir özel özelliği olduğunun farkında değildim. Bunu yapmak için Kurbağa'yı nasıl kullandığınızı açıklayabilir misiniz?
Cory Evi

Az önce mysql için Toad 6.3'e bakıldığında, kesme noktaları ve her şeyle hata ayıklama özelliği var gibi görünüyor. Hata ayıklama özelliğinin çalışmadığını mı söylüyorsunuz? Ya da belki sürümünüz daha eski ve hata ayıklama özelliği içermiyor mu?
Joyce

1

Tekabül Yanıt Bu MySQL sürümü hakkında emin değil @Brad Parks tarafından, ama benim 5.6, dolayısıyla biraz ince ayar işleri oldu:

debug_msgİşlev (prosedür değil) olan ve metin döndüren (karakter sınırı olmayan) bir işlev oluşturdum ve ardından işlevi aşağıdaki gibi SELECT debug_msg(params) AS my_res_setolarak çağırdım:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.