คุณดีบักขั้นตอนการจัดเก็บ MySQL อย่างไร


125

ขั้นตอนปัจจุบันของฉันสำหรับการดีบักโพรซีเดอร์ที่จัดเก็บนั้นง่ายมาก ฉันสร้างตารางที่เรียกว่า "debug" ซึ่งฉันแทรกค่าตัวแปรจากโพรซีเดอร์ที่เก็บไว้ในขณะที่รัน สิ่งนี้ช่วยให้ฉันเห็นค่าของตัวแปรใด ๆ ณ จุดที่กำหนดในสคริปต์ แต่มีวิธีที่ดีกว่าในการดีบักขั้นตอนการจัดเก็บ MySQL หรือไม่


2
มีตัวเลือก GUI สำหรับผู้ใช้ที่ไม่ใช่ Windows หรือไม่? ต้องเรียกใช้สำเนาของ Windows เพียงเพื่อดีบักขั้นตอนที่จัดเก็บไว้เป็นเรื่องที่ต้องทำ และตัวเลือกการแทรกตารางส่วนใหญ่จะล้มเหลวหากคุณอยู่ในธุรกรรมที่คุณกำลังจะย้อนกลับ
Code Abominator

คำตอบ:


44

ฉันทำอะไรที่คล้ายกับคุณมาก

โดยปกติฉันจะรวมพารามิเตอร์ DEBUG ที่มีค่าเริ่มต้นเป็นเท็จและฉันสามารถตั้งค่าเป็นจริงได้ในขณะทำงาน จากนั้นรวมคำสั่ง debug ไว้ในบล็อก "If DEBUG"

ฉันยังใช้ตารางบันทึกกับงานหลาย ๆ งานของฉันเพื่อที่ฉันจะได้ตรวจสอบกระบวนการและระยะเวลา รหัสดีบักของฉันได้รับผลลัพธ์เช่นกัน ฉันรวมชื่อพารามิเตอร์การเรียกคำอธิบายสั้น ๆ จำนวนแถวที่ได้รับผลกระทบ (หากเหมาะสม) ฟิลด์ความคิดเห็นและการประทับเวลา

เครื่องมือดีบั๊กที่ดีเป็นหนึ่งในความล้มเหลวที่น่าเศร้าของแพลตฟอร์ม SQL ทั้งหมด


3
ไม่ใช่ทุกแพลตฟอร์ม @Bob Probst เครื่องมือดีบัก sybase นั้นเงียบพอสมควรกับการดีบักเบรกพอยต์สำหรับทริกเกอร์และโพรซีเดอร์ที่จัดเก็บ
Anup

69

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

จากนั้นทำการทดสอบดังนี้:

CALL test_procedure(1,2)

จะส่งผลให้เกิดผลลัพธ์ต่อไปนี้:

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

8
ดูเหมือนจะใช้ไม่ได้กับ FUNCTIONS และฉันไม่รู้ว่าทำไม มันจะให้ "Error Code: 1415. ไม่อนุญาตให้ส่งคืนชุดผลลัพธ์จากฟังก์ชัน" เสมอ มีการไล่เบี้ยหรือไม่?
Patrick M

1
ฟังก์ชั่น @PatrickM ไม่สามารถส่งคืนแถว ("ผลลัพธ์") ในขณะที่โพรซีเดอร์การดีบักนี้อาศัยอยู่ (ข้อความดีบักคือชุดผลลัพธ์ที่ส่งคืนในการเรียกโพรซีเดอร์) ในฟังก์ชันคุณสามารถINSERT INTO my_log_table (message) VALUES (msg)เรียกดูข้อความดีบักทั้งหมดได้เมื่อการเรียกใช้ฟังก์ชันสิ้นสุดลงเท่านั้น (กล่าวคือคุณกลับมาในขั้นตอน)
Xenos

aproach นี้ดี แต่การเขียนลงคอนโซลไม่ได้ผลกับ MySQL Workbench เช่น IDE เนื่องจากทุกคำสั่ง "select" จะเปิดบานหน้าต่างผลลัพธ์ใหม่ ฉันคิดว่าเป็นการดีกว่าที่จะสร้างตารางบันทึกชั่วคราวเพื่อบันทึกข้อความแสดงข้อผิดพลาดด้วยการประทับเวลาและชื่อขั้นตอน
ปลาทูน่า mustafa kemal

28

ใช่มีเครื่องมือพิเศษสำหรับชนิดของสิ่งนี้ - MySQL ดีบักเกอร์
ใส่คำอธิบายภาพที่นี่


5
ฉันกระตือรือร้นที่จะทดลองใช้ น่าเสียดายที่มันเป็นซากปรักหักพังทั้งหมด ฉันได้รับข้อความแสดงข้อผิดพลาด "function coalesce ไม่มีอยู่จริง" จาก mysql ซึ่งส่งผลให้ GUI แตกกิ่งก้านอย่างไม่ถูกต้องผ่านรหัส SP (แม้ว่า MySQL จะรันอย่างถูกต้อง) ไม่ต้องพูดถึงตัวแปรโลคัล "DECLARE var DEFAULT value" พวกเขาจะแสดงเป็น NULL เมื่อไม่ชัดเจน อ้อและ "ตัวระบุที่ไม่ได้ประกาศ:" FETCH_RADIUS_DISTSORT "ซึ่งเป็นคำสั่งที่รวบรวม ไม่แนะนำ.
kellogs

4
มันไม่สมบูรณ์แบบ แต่การทดลองของฉันกับสิ่งนี้เป็นประสบการณ์ที่แตกต่างจากที่รายงานโดย @kellogs ด้านบน เครื่องมือนี้ดีและมีน้ำหนักเบาและดูเหมือนจะทำงานได้ตามต้องการโดยไม่ต้องบวม มันเป็นประสบการณ์ที่ดีสำหรับฉันมากกว่าเครื่องมืออื่น ๆ ที่ทดลองใช้ (เช่น Visual Studio, Toad และ dbForge Studio ซึ่งทั้งหมดนี้มีข้อบกพร่องที่สำคัญ - จะอธิบายทั้งหมดนี้ว่าเป็น "ซากปรักหักพังทั้งหมด" ในการเปรียบเทียบ) ไม่แน่ใจว่าเป็นเพราะฟังก์ชันที่ถูกดีบักไม่ได้รวมโครงสร้างที่ผิดพลาดหรือไม่หรือว่าปัญหาได้รับการแก้ไขแล้ว
Steve Chambers

2
ฉันยังพบว่าเครื่องมือนี้มีประโยชน์มากสำหรับการดีบักกระบวนงานที่เก็บไว้ของฉัน
ralfe

22

วิธีการดีบักขั้นตอนการจัดเก็บ MySQL

ดีบั๊กเกอร์ผู้น่าสงสาร:

  1. สร้างตารางที่เรียกว่า logtable ที่มีสองคอลัมน์id INTและlog VARCHAR(255).

  2. สร้างคอลัมน์รหัสอัตโนมัติ

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

เป็นคนตัดไม้ตัวเล็ก ๆ ที่รวดเร็วและสกปรกพอที่จะคิดออกว่าเกิดอะไรขึ้น


21

มีเครื่องมือ GUI สำหรับการดีบักโพรซีเดอร์ / ฟังก์ชันและสคริปต์ที่เก็บไว้ใน MySQL เครื่องมือที่ดีที่ dbForge Studio สำหรับ MySQL มีฟังก์ชันและความเสถียรที่หลากหลาย


ยากที่จะค้นหาว่าเครื่องมือดีบักทำงานบนแพลตฟอร์มใด ดูเหมือนว่าจะทำงานบน Windows มีอะไรอีกไหม
Guy

10

ดีบักเกอร์สำหรับ 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;

8

อีกวิธีหนึ่งจะถูกนำเสนอที่นี่

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

ด้วยขั้นตอนการดีบัก mySql ที่กำหนดเองและตารางการบันทึก

คุณยังสามารถเลือกง่ายๆในโค้ดของคุณและดูว่ามีการดำเนินการหรือไม่

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 ได้อย่างไร?


7

ฉันเพียงแค่วางคำสั่งที่เลือกไว้ในส่วนสำคัญของขั้นตอนการจัดเก็บเพื่อตรวจสอบสถานะปัจจุบันของชุดข้อมูลจากนั้นแสดงความคิดเห็น (- เลือก ... ) หรือลบออกก่อนการผลิต


7

ฉันไปงานปาร์ตี้สาย แต่เอาเบียร์มาให้มากขึ้น:

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

จะให้โอกาสคุณในการเดินโค้ดทีละขั้นตอนและ "รีเฟรช" ตัวแปรของคุณคุณจะสามารถดูสิ่งที่เกิดขึ้นภายในโค้ดของคุณได้ดีขึ้น

เคล็ดลับสำคัญ: ในขณะที่ดีบักคุณอาจจะเปลี่ยน (สร้างขั้นตอนใหม่) หลังจากสร้างใหม่แล้วให้ดำเนินการ: $ exit และ $ setup ก่อน $ debug ใหม่

นี่เป็นอีกทางเลือกหนึ่งของวิธีการ "แทรก" และ "บันทึก" โค้ดของคุณยังคงไม่มีคำแนะนำ "การแก้ไขข้อบกพร่อง" เพิ่มเติม

ภาพหน้าจอ:

เบรกพอยต์ ocelot ก้าว


6

MySQL Connector / Net 6.6 มีคุณสมบัติในการดีบักขั้นตอนและฟังก์ชันที่จัดเก็บไว้

การติดตั้ง Debugger

ในการเปิดใช้งานโปรแกรมดีบักเกอร์กระบวนงานที่เก็บไว้:

  • สำหรับ Connector / Net 6.6: ติดตั้ง Connector / Net 6.6 และเลือกตัวเลือก Complete
  • สำหรับ Connector / Net 6.7 และใหม่กว่า: ติดตั้งผลิตภัณฑ์ MySQL สำหรับ Visual Studio ซึ่งเป็นของดีบักเกอร์กระบวนงานที่เก็บไว้

เริ่มต้นตัวดีบักเกอร์

ในการเริ่มการดีบักเกอร์ให้ทำตามขั้นตอนเหล่านี้:

  • เลือกการเชื่อมต่อใน Visual Studio Server Explorer
  • ขยายโฟลเดอร์ Stored Procedures เฉพาะโพรซีเดอร์ที่เก็บไว้เท่านั้นที่สามารถดีบักได้โดยตรง ในการดีบักฟังก์ชันที่ผู้ใช้กำหนดเองให้สร้าง
    กระบวนงานที่เก็บไว้ซึ่งเรียกใช้ฟังก์ชัน
  • คลิกที่โหนดโพรซีเดอร์ที่เก็บไว้จากนั้นคลิกขวาและจากเมนูบริบทให้เลือก Debug Routine

5

MySql Connector / NET ยังมีโปรแกรมดีบักขั้นตอนที่เก็บไว้ซึ่งรวมอยู่ใน Visual Studio ในเวอร์ชัน 6.6 คุณสามารถรับตัวติดตั้งและแหล่งที่มาได้ที่นี่: 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

อัปเดต: MySql สำหรับ Visual Studio ถูกแยกจาก Connector / NET เป็นผลิตภัณฑ์แยกต่างหากคุณสามารถเลือกได้ (รวมถึงดีบักเกอร์) จากที่นี่https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (ยัง ฟรีและโอเพ่นซอร์ส)

การปฏิเสธความรับผิด: ฉันเป็นผู้พัฒนาที่เขียนโปรแกรมดีบักเกอร์ขั้นตอนที่เก็บไว้สำหรับผลิตภัณฑ์ MySQL สำหรับ Visual Studio


มีปัญหากับสตริงการเชื่อมต่อแบบหลายโฮสต์เมื่อใช้ MySQL และ Connector .NET ฉันได้อธิบายปัญหาที่นี่แล้ว .. . ฉันสงสัยว่ามีใครจะมองเข้าไปในนี้? สิ่งนี้ทำให้เกิดปัญหาไม่น้อยสำหรับพวกเราหลายคนนักพัฒนา. Net ที่ใช้ MySQL ...
Hooman Bahreini

1
เสียใจที่ได้ทราบว่าฉันไม่ได้ทำงานที่ Oracle อีกต่อไปและไม่มีเวลาว่างมากนักฉันขอแนะนำให้ติดต่อฝ่ายสนับสนุน MySQL
Fernando Gonzalez Sanchez

4

ตัวดีบักเกอร์ตัวแรกและเสถียรสำหรับ MySQL อยู่ใน dbForge Studio สำหรับ MySQL


3

ฉันใช้เครื่องมือสองอย่างในการดีบักโพรซีเดอร์และฟังก์ชัน:

  1. dbForge - mysql GUI ที่ใช้งานได้มากมาย
  2. MyDebugger - เครื่องมือพิเศษสำหรับการดีบัก ... เครื่องมือที่มีประโยชน์สำหรับการดีบัก โหวต http://tinyurl.com/voteimg

3

ตัวแปรที่กำหนดโดยผู้ใช้ MySQL (แชร์ในเซสชัน) สามารถใช้เป็นเอาต์พุตการบันทึก:

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;

จะส่งออก:

SELECT * FROM foo

1

คางคก mysql. มีเวอร์ชันฟรีแวร์ http://www.quest.com/toad-for-mysql/


1
ฉันใช้คางคกมาหลายปีแล้ว แต่ไม่รู้ว่ามันมีคุณสมบัติพิเศษสำหรับการดีบัก sprocs คุณสามารถอธิบายวิธีการใช้คางคกได้หรือไม่?
Cory House

ดู Toad 6.3 สำหรับ mysql ตอนนี้ดูเหมือนว่ามีคุณสมบัติการดีบักพร้อมจุดพักและทุกอย่าง คุณหมายความว่าคุณลักษณะการดีบักไม่ทำงานหรือไม่? หรือเวอร์ชันของคุณอาจเก่ากว่าและไม่มีคุณลักษณะการดีบัก?
Joyce

1

คำตอบที่สอดคล้องกับสิ่งนี้โดย @Brad Parks ไม่แน่ใจเกี่ยวกับเวอร์ชัน MySQL แต่ของฉันคือ 5.6 ดังนั้นการปรับแต่งเล็กน้อยจึงทำงานได้:

ฉันสร้างฟังก์ชัน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.