In thông tin gỡ lỗi từ quy trình được lưu trữ trong MySQL


Câu trả lời:


113

Tùy chọn 1: Đặt điều này vào thủ tục của bạn để in 'nhận xét' ra stdout khi nó chạy.

SELECT 'Comment';

Tùy chọn 2: Đặt điều này trong thủ tục của bạn để in một biến với nó thành stdout:

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

Điều này in myvar is 5thành stdout khi thủ tục chạy.

Tùy chọn 3, Tạo một bảng với một cột văn bản được gọi tmptablevà đẩy các thông báo vào đó:

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

Bạn có thể đặt ở trên trong một thủ tục được lưu trữ, vì vậy tất cả những gì bạn sẽ phải viết là:

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

Điều này giúp tiết kiệm một vài lần nhấn phím.

Tùy chọn 4, Ghi tin nhắn vào tệp

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

Có những hạn chế rất nặng đối với lệnh này. Bạn chỉ có thể ghi outfile vào các vùng trên đĩa cấp cho nhóm 'những người khác' quyền tạo và ghi. Nó sẽ hoạt động khi lưu nó vào thư mục / tmp.

Ngoài ra, một khi bạn ghi ra tệp tin, bạn không thể ghi đè nó. Điều này là để ngăn những kẻ bẻ khóa không root hộp của bạn chỉ vì chúng đã chèn SQL vào trang web của bạn và có thể chạy các lệnh tùy ý trong MySQL.


3
mysql phàn nàn Not allowed to return a result set from a trigger, bất kỳ ý tưởng?
Jerry Chin

Có thể bạn đã giải quyết vấn đề trong gần 3 năm, nhưng sử dụng đầu ra thành tệp để loại bỏ lỗi.
Gabriel Cliseru


5

Tôi thường tạo bảng nhật ký với một thủ tục được lưu trữ để đăng nhập vào nó. Gọi thủ tục ghi nhật ký bất cứ nơi nào cần thiết từ thủ tục đang được phát triển.

Nhìn vào các bài đăng khác về cùng câu hỏi này, nó có vẻ như là một thực tế phổ biến, mặc dù có một số lựa chọn thay thế.


5
Bảng đăng nhập nên MyISAM, hoặc công cụ lưu trữ không giao dịch khác, vì vậy bạn có thể theo dõi các giao dịch thậm chí cuộn lại,
gaborsch

5

Cách nhanh chóng để in thứ gì đó là:

select '** Place your mesage here' AS '** DEBUG:';

3

Đây là cách tôi sẽ gỡ lỗi:

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 

Nếu truy vấn 1, 2 hoặc 3 xuất hiện lỗi, HANDLER sẽ bắt lỗi SQLEXCEPTION và SHOW ERRORS sẽ hiển thị lỗi cho chúng tôi. Lưu ý: HIỂN THỊ LỖI phải là câu lệnh đầu tiên trong HANDLER.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.