2012-01-25 34 views
11

Tôi yêu các trình kích hoạt vì một lý do - chúng chỉ hoạt động. Tôi ghét gây ra vì một lý do - khi chúng không hoạt động, hãy quên việc cố gỡ lỗi. O sự thất vọng ngọt ngào.Gỡ lỗi trình kích hoạt MySQL

Về cơ bản, tôi muốn xem truy vấn cập nhật, xóa, chèn, v.v. Tôi muốn thấy rằng truy vấn ... một nơi nào đó, trong thiết bị đầu cuối của tôi hoặc một bản ghi, chính xác như thế nào và khi nào MySQL thực hiện nó, và có thể bất kỳ đầu ra/lỗi tương ứng. Suy nghĩ/hack?

Tôi đang cố gắng gỡ lỗi truy vấn cập nhật với một vài lần tham gia và nội dung nào không. Truy vấn của tôi phức tạp hơn nhiều, nhưng ngắn gọn, đây là một ví dụ.

DELIMITER | 
CREATE TRIGGER ireallyhateyourightnow AFTER UPDATE ON watch_this_table 
FOR EACH ROW BEGIN 
IF (OLD.my_value != NEW.my_value) THEN 
    update 
    my_table 
    set 
    my_column = NEW.my_value; 
END IF; 
END| 
DELIMITER ; 

Dưới đây là một số ngữ cảnh bổ sung có thể giúp ảnh hưởng đến đề xuất hoặc câu trả lời. Một lần nữa, tôi ít quan tâm đến ngữ nghĩa/cú pháp và quan tâm hơn đến việc thấy MySQL chạy truy vấn nhưng bằng mọi cách, tôi mở cho bất cứ điều gì vào thời điểm này.

  • Strace không hoạt động/hiển thị truy vấn.
  • Môi trường không sao chép NHƯNG nếu nhật ký thùng hiển thị các câu lệnh kích hoạt, tôi chắc chắn sẽ thiết lập điều này.
  • "Hiển thị danh sách xử lý đầy đủ" hiển thị thực thi kích hoạt và/hoặc câu lệnh được thực thi bên trong (tôi không bao giờ thấy chúng sau khi chạy hiển thị danh sách xử lý đầy đủ nhanh như perl có thể chạy nó nhưng tôi có thể thiếu nó)?
  • Nhật ký truy vấn chung không hiển thị các truy vấn này (chắc chắn không phải nhật ký lỗi).
  • Tôi không sử dụng bí danh (nữa).
  • Không có lỗi cú pháp khi tạo trình kích hoạt.
  • Câu lệnh IF hoạt động.
  • Khi tôi chèn các giá trị MỚI vào bảng "kiểm tra/tạm thời" và chạy truy vấn cập nhật theo cách thủ công (tôi thậm chí đã thực sự chèn toàn bộ truy vấn cập nhật)
  • Tôi không thể hiển thị bạn truy vấn nhưng như tôi vừa đề cập, nó hoạt động khi tôi chạy thủ công nếu điều đó giúp.
  • Tôi đã gỡ bỏ tất cả các ký tự có sai sót, các tab, xuống dòng, dòng mới vv
  • Các ổ cắm MySQL sẽ chỉ hiển thị kết nối local/dữ liệu nhưng không MySQL hoạt động nội bộ, tôi nghĩ vậy.
  • MyISAM để nhật ký INNODB không phải là tùy chọn
  • lsof dường như không hiển thị bất kỳ mục đích nào khác để sử dụng.
  • Tôi đang sử dụng MySQL 5.0.77 trên CentOS 5.5.

Trả lời

3

Bạn có thể debug triggers sử dụng dbForge Studio for MySQL. Dùng thử phiên bản dùng thử.

Có mô tả chi tiết về quy trình gỡ lỗi trình kích hoạt trong tài liệu: Gỡ lỗi \ Gỡ lỗi các luồng được lưu trữ \ Cách thực hiện: Bắt đầu trình gỡ lỗi kích hoạt.

+0

Yea, bước vào chuyển sang màu xám. Có lẽ vì nó là một thử nghiệm? – Justin

+0

Lệnh 'Bước vào' phải hoạt động từ mã thủ tục được lưu trữ. Bạn đã làm theo hướng dẫn từng bước (Làm thế nào để: Bắt đầu kích hoạt gỡ lỗi)? – Devart

+0

Cảm ơn bạn Devart! Phần mềm rất đẹp. – Justin

0

MYSQL PROCEDURE => incron => tail -f 'mysql_dynamic.log'

một stored procedure có thể được gọi bên trong một kích hoạt nhưng phải trả lại không có gì

CREATE PROCEDURE `DYN_LOG` (IN s VARCHAR(500)) 
BEGIN 
SELECT s into outfile '/var/spool/incron/mysql_dynamic_spool/foo_file'; 
DO SLEEP(.1); // create a gap beetween multiple shuts 
END 

Bây giờ bất cứ nơi nào trong một kích hoạt bạn có thể gọi

CREATE TRIGGER `trig_name` BEFORE UPDATE ON `tb_name` 
FOR EACH ROW 
BEGIN 
CALL DYN_LOG(concat_ws('\t',NEW.col1,NEW.col2)); 
... 
// rest of the code 
END 

cho máy Linux apt-get install incron(debian incron tutorial)

Tạo thư mục mà mysql sẽ tiêm foo_file

mkdir -m 777 /var/spool/incron/mysql_dynamic_spool 
incrontab -e 

và thêm sau việc incron

/var/spool/incron/mysql_dynamic_spool IN_CREATE /path/foo_file_procesor [email protected]/$# 

Tạo kịch bản thực thi "/ path/foo_file_procesor"

#!/bin/sh 
# // $1 is the foo_file absolute addres 
body="$(cat $1)" // read file content 
rm $1 
log=/var/log/mysql_dynamic.log // message collector 
echo "`date "+%y%m%d %H:%M:%S"`\t== dyn_log ==\t$body">>$log 
exit 0 

Bây giờ xem các tập tin thu

tail -f /var/log/mysql_dynamic.log 
2

an alternate way of testing it by having a temporary debug table. Trong ví dụ ở đây, họ tạo nó trong cơ sở dữ liệu riêng của debug.

Bước 1: Tạo một bảng

DROP TABLE IF EXISTS debug; 
CREATE TABLE debug (
    proc_id varchar(100) default NULL, 
    debug_output text, 
    line_id int(11) NOT NULL auto_increment, 
    PRIMARY KEY (line_id) 
) 

Bước 2: Tạo SPs debug để điền vào bảng debug

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `debug_insert` $$ 
CREATE PROCEDURE `debug_insert`(in p_proc_id varchar(100),in p_debug_info text) 
begin 
    insert into debug (proc_id,debug_output) 
    values (p_proc_id,p_debug_info); 
end $$ 

DROP PROCEDURE IF EXISTS `debug_on` $$ 
CREATE PROCEDURE `debug_on`(in p_proc_id varchar(100)) 
begin 
    call debug_insert(p_proc_id,concat('Debug Started :',now())); 
end $$ 

DROP PROCEDURE IF EXISTS `debug_off` $$ 
CREATE PROCEDURE `debug_off`(in p_proc_id varchar(100)) 
begin 
    call debug_insert(p_proc_id,concat('Debug Ended :',now())); 
    select debug_output from debug where proc_id = p_proc_id order by line_id; 
    delete from debug where proc_id = p_proc_id; 
end $$ 

Bước 3: Gọi các SPs debug trong của bạn trigger

Như thế này,

CREATE PROCEDURE test_debug() 
begin 
declare l_proc_id varchar(100) default 'test_debug'; 
    call debug_on(l_proc_id); 
    call debug_insert(l_proc_id,'Testing Debug'); 
    call debug_off(l_proc_id); 
end $$ 

Kết quả là bảng debug sẽ được lấp đầy như sau,

+------------------------------------+ 
| debug_output      | 
+------------------------------------+ 
| Debug Started :2006-03-24 16:10:33 | 
| Testing Debug      | 
| Debug Ended :2006-03-24 16:10:33 | 
+------------------------------------+ 
Các vấn đề liên quan