2008-11-07 59 views
94

Quy trình hiện tại của tôi để gỡ lỗi các thủ tục được lưu trữ rất đơn giản. Tôi tạo ra một bảng gọi là "gỡ lỗi", nơi tôi chèn các giá trị biến từ các thủ tục được lưu trữ khi nó chạy. Điều này cho phép tôi xem giá trị của bất kỳ biến nào tại một điểm nhất định trong tập lệnh, nhưng có cách nào tốt hơn để gỡ lỗi thủ tục lưu sẵn MySQL không?Làm thế nào để bạn gỡ lỗi thủ tục lưu trữ MySQL?

+1

Có tùy chọn GUI nào cho người dùng không thuộc Windows không? Có để chạy một bản sao của Windows chỉ để gỡ lỗi thủ tục được lưu trữ là một chút của một bước nhảy. Và hầu hết các tùy chọn chèn bảng không thành công nếu bạn đang ở trong một giao dịch mà bạn định quay trở lại. –

Trả lời

38

Tôi làm điều gì đó rất giống với bạn.

Tôi thường sẽ bao gồm thông số DEBUG mặc định là false và tôi có thể đặt thành true tại thời gian chạy. Sau đó, bọc các câu lệnh debug vào khối "Nếu DEBUG".

Tôi cũng sử dụng bảng ghi nhật ký với nhiều công việc của mình để tôi có thể xem lại quy trình và thời gian. Mã Debug của tôi cũng được xuất ở đó. Tôi bao gồm tên param gọi, mô tả ngắn gọn, số lượng hàng bị ảnh hưởng (nếu thích hợp), trường nhận xét và dấu thời gian.

Công cụ gỡ lỗi tốt là một trong những thất bại đáng buồn của tất cả các nền tảng SQL.

+2

Không phải tất cả nền tảng @Bob Probst, công cụ gỡ lỗi Sybase đều yên tĩnh với trình gỡ lỗi breakpoint để kích hoạt và lưu trữ các thủ tục – Anup

7

Tôi chỉ cần đặt câu lệnh chọn vào các vùng chính của thủ tục được lưu trữ để kiểm tra trạng thái hiện tại của tập dữ liệu và sau đó nhận xét chúng (--select ...) hoặc xóa chúng trước khi sản xuất.

23

Có, có một công cụ chuyên dụng cho loại điều này - MySQL Debugger.
enter image description here

+4

tôi đã rất háo hức thử nó. Thật không may nó là một đống đổ nát. Tôi nhận được "chức năng coalesce không tồn tại" thông báo lỗi suppsedly từ mysql, kết quả là các chi nhánh GUI không chính xác thông qua mã SP (mặc dù MySQL chạy nó một cách chính xác). Chưa kể đến các biến địa phương "DECLARE var DEFAULT". Họ chỉ hiển thị như NULL khi họ rõ ràng là không. Ồ, và cũng có thể là "Số nhận dạng không khai báo: 'FETCH_RADIUS_DISTSORT'", đây là câu lệnh được biên dịch. Không được khuyến khích. – kellogs

+2

Nó không hoàn hảo nhưng thử nghiệm của tôi với điều này đã được một kinh nghiệm rất khác nhau để báo cáo bởi @kellogs ở trên. Công cụ này đẹp và nhẹ và dường như chỉ làm công việc cần thiết mà không có bất kỳ sưng lên nào. Đó là một trải nghiệm tốt hơn cho tôi so với bất kỳ công cụ nào khác được thử nghiệm (ví dụ: Visual Studio, Toad và dbForge Studio, tất cả đều có những sai sót lớn - sẽ mô tả tất cả những thứ này như một "đống đổ nát" so với). Bạn không chắc chắn liệu điều này có phải là do hàm đang được gỡ lỗi không bao gồm bất kỳ cấu trúc bị lỗi nào hay các vấn đề đã được khắc phục. –

+0

Tôi cũng thấy công cụ này khá hữu ích để gỡ lỗi các thủ tục đã lưu của tôi. – ralfe

21

GUI tools for debugging stored procedures/chức năng và tập lệnh trong MySQL. Một công cụ phong nha mà dbForge Studio cho MySQL, có chức năng phong phú và ổn định.

+0

Khó khăn để tìm thấy nền tảng mà công cụ gỡ lỗi chạy trên đó. Dường như chạy trên Windows. Còn gì nữa không? – Guy

4

Trình gỡ lỗi đầu tiên và ổn định cho MySQL nằm trong dbForge Studio cho MySQL

1

Toad mysql. Có một phiên bản phần mềm miễn phí http://www.quest.com/toad-for-mysql/

+1

Tôi đã sử dụng Toad trong nhiều năm nhưng không biết rằng nó có bất kỳ tính năng đặc biệt nào để gỡ lỗi sprocs. Bạn có thể làm rõ cách bạn sử dụng Toad để làm như vậy không? –

+0

Nhìn vào Toad 6.3 cho mysql vừa nãy, có vẻ như có tính năng gỡ lỗi với điểm ngắt và mọi thứ. Bạn có nghĩa là tính năng gỡ lỗi không hoạt động? Hoặc có thể phiên bản của bạn cũ hơn và không bao gồm tính năng gỡ lỗi? – Joyce

3

tôi đã sử dụng hai công cụ khác nhau để gỡ lỗi thủ tục và chức năng:

  1. dbForge - nhiều chức năng mysql GUI.
  2. MyDebugger - công cụ chuyên biệt để gỡ lỗi ... công cụ tiện dụng để gỡ lỗi. vote http://tinyurl.com/voteimg
8

Một cách khác được trình bày ở đây

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

với thủ tục MySQL tùy chỉnh debug và bảng đăng nhập.

Bạn cũng có thể chỉ cần đặt một lựa chọn đơn giản trong mã của bạn và xem liệu nó có được thực hiện hay không.

SELECT 'Message Text' AS `Title`; 

Tôi có ý tưởng này từ

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

Ngoài ra ai đó đã tạo ra một khuôn mẫu cho thủ tục hải quan debug trên GitHub.

Xem ở đây

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

Đã được đề cập ở đây

How to catch any exception in triggers and store procedures for mysql?

3

MySql Connector/NET cũng bao gồm một trình gỡ lỗi thủ tục lưu trữ tích hợp trong visual studio như các phiên bản 6.6, Bạn có thể lấy trình cài đặt và nguồn ở đây: http://dev.mysql.com/downloads/connector/net/

Một số tài liệu/ảnh chụp màn hình: https://dev.mysql.com/doc/connector-net/en/connector-net-visual-studio-debugger.html

Bạn có thể làm theo các annoucements đây: http://forums.mysql.com/read.php?38,561817,561817#msg-561817

DISCLAIMER: Tôi là nhà phát triển người là tác giả của các cơ thủ tục debugger lưu trữ cho MySQL cho sản phẩm Visual Studio.

48

Thủ tục debug_msg sau có thể được gọi là chỉ đơn giản là ra một thông điệp debug ra cửa sổ Console:

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 ; 

Sau đó chạy thử nghiệm như thế này:

CALL test_procedure(1,2) 

Nó sẽ cho kết quả đầu ra sau đây:

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

Điều này dường như không hoạt động cho FUNCTIONS và tôi không biết tại sao. Nó luôn cho "Mã lỗi: 1415. Không được phép trả về một tập kết quả từ một hàm". Có bất kỳ sự truy đòi nào không? –

+1

Tuyệt vời! Cảm ơn!! – akelec

+1

@PatrickM Các hàm không thể trả về các hàng ("kết quả") trong khi thủ tục gỡ lỗi này dựa vào nó (các thông báo gỡ lỗi là các resultsets được trả về trong cuộc gọi thủ tục). Trong các hàm, bạn chỉ có thể 'INSERT INTO my_log_table (message) VALUES (msg)' và có thể truy xuất tất cả các thông báo gỡ lỗi khi các cuộc gọi chức năng kết thúc (nghĩa là: bạn đã quay trở lại quy trình) – Xenos

14

Cách gỡ lỗi một MySQL thủ tục lưu trữ.

Poor Mans debugger:

  1. Tạo một bảng gọi là logtable với hai cột, id INTlog VARCHAR(255).

  2. Thực hiện tự động cột id.

  3. Sử dụng thủ tục này:

    delimiter // 
    DROP PROCEDURE `log_msg`// 
    CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) 
    BEGIN 
        insert into logtable select 0, msg; 
    END 
    
  4. Đặt mã này bất cứ nơi nào bạn muốn đăng nhập một thông điệp tới bàn.

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

Đó là một đẹp logger chút nhanh chóng và dơ bẩn để tìm ra những gì đang xảy ra.

7

Trình gỡ lỗi cho mysql là tốt nhưng không miễn phí.Đây là những gì tôi sử dụng bây giờ:

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$ 

Cách sử dụng trong thủ tục lưu trữ:

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

sử dụng thủ tục lưu trữ:

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

MySQL Connector/Net 6.6 có một tính năng để Debug Stored Procedures and Functions

Cài đặt Debugger

Để kích hoạt trình gỡ lỗi thủ tục lưu trữ:

  • Đối Connector/Net 6.6: Cài đặt kết nối/Net 6.6 và chọn tùy chọn Complete.
  • Đối với Trình kết nối/Mạng 6.7 trở lên: Cài đặt sản phẩm MySQL cho Visual Studio, mà trình gỡ rối thủ tục được lưu trữ thuộc về.

Bắt đầu Debugger

Để bắt đầu gỡ rối, hãy làm theo các bước sau:

  • Chọn một kết nối trong Visual Studio Server Explorer.
  • Mở rộng thư mục Thủ tục được lưu trữ. Chỉ các thủ tục được lưu trữ mới có thể được gỡ lỗi trực tiếp. Để gỡ lỗi một hàm do người dùng xác định, hãy tạo một thủ tục được lưu trữ
    gọi hàm này.
  • Nhấp vào nút thủ tục được lưu trữ, sau đó nhấp chuột phải và từ trình đơn ngữ cảnh chọn Gỡ lỗi định tuyến.
5

Tôi muộn để đảng, nhưng mang bia hơn:

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

tôi đã cố gắng, và nó có vẻ khá ổn định, hỗ trợ Breakpoints và kiểm tra biến.

Nó không phải là một bộ hoàn chỉnh (chỉ 4,1 Mb) nhưng đã giúp tôi rất nhiều!

Cách hoạt động: Nó tích hợp với khách hàng mysql của bạn (Tôi đang sử dụng Ubuntu 14.04), và sau khi bạn thực hiện:

$install 
$setup yourFunctionName 

Nó cài đặt cơ sở dữ liệu mới tại máy chủ của bạn, kiểm soát quá trình gỡ lỗi . Vì vậy:

$debug yourFunctionName('yourParameter') 

sẽ cung cấp cho bạn cơ hội từng bước để tạo mã và "làm mới" các biến bạn có thể xem tốt hơn những gì đang diễn ra bên trong mã của bạn.

Mẹo quan trọng: khi gỡ lỗi, có thể bạn sẽ thay đổi (tạo lại quy trình).Sau khi tạo lại, hãy thực thi: $ exit và $ setup trước $ debug mới

Đây là phương án thay thế cho phương thức "chèn" và "nhật ký". Mã của bạn vẫn không có các hướng dẫn "gỡ rối" bổ sung.

Ảnh chụp màn hình:

ocelot breakpoint stepping

0

trả lời tương ứng với this bởi Parks @Brad Không chắc về phiên bản MySQL, nhưng tôi là 5,6, do đó một chút tinh chỉnh nhỏ hoạt động:

Tôi tạo ra một chức năng debug_msg là chức năng (không phải thủ tục) và trả về văn bản (không có giới hạn ký tự) và sau đó gọi hàm là SELECT debug_msg (params) AS my_res_set, mã như sau:

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 
Các vấn đề liên quan