MySQL 저장 프로 시저를 어떻게 디버깅합니까?


125

저장 프로 시저를 디버깅하는 현재 프로세스는 매우 간단합니다. 실행되는 저장 프로 시저의 변수 값을 삽입하는 "debug"라는 테이블을 만듭니다. 이렇게하면 스크립트의 지정된 지점에서 변수 값을 볼 수 있지만 MySQL 저장 프로 시저를 디버깅하는 더 좋은 방법이 있습니까?


2
비 Windows 사용자를위한 GUI 옵션이 있습니까? 저장 프로 시저를 디버그하기 위해 Windows 복사본을 실행해야하는 것은 약간의 점프입니다. 그리고 롤백하려는 트랜잭션에있는 경우 대부분의 테이블 삽입 옵션이 실패합니다.
코드 Abominator

답변:


44

나는 당신과 매우 비슷한 일을합니다.

일반적으로 기본적으로 false로 설정되고 런타임에 true로 설정할 수있는 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
이것은 기능에 대해 작동하지 않는 것 같으며 이유를 모르겠습니다. 항상 "오류 코드 : 1415. 함수에서 결과 집합을 반환 할 수 없습니다"를 제공합니다. 의지가 있습니까?
Patrick M

1
@PatrickM 함수는이 디버그 프로 시저가 이에 의존하는 동안 행 ( "결과")을 반환 할 수 없습니다 (디버그 메시지는 프로 시저 호출에서 반환 된 결과 집합 임). 함수에서 INSERT INTO my_log_table (message) VALUES (msg)함수 호출이 끝난 후에 만 모든 디버그 메시지를 검색 할 수 있습니다 (예 : 프로 시저로
돌아옴

이 aproach는 좋지만 콘솔에 쓰는 것은 IDE와 같은 MySQL Workbench에서 효과적이지 않습니다. 모든 "select"문이 새 결과 창을 열기 때문입니다. 타임 스탬프와 프로 시저 이름으로 오류 메시지를 기록하는 임시 로그 테이블을 만드는 것이 더 낫다고 생각합니다
mustafa kemal tuna

28

예, 이런 종류의 특수 도구 인 MySQL Debugger가 있습니다.
여기에 이미지 설명 입력


5
나는 그것을 시도하고 싶었다. 불행히도 그것은 전체 잔해입니다. mysql에서 "함수 병합이 존재하지 않습니다"라는 오류 메시지가 표시됩니다. 그 결과 GUI가 SP 코드를 통해 잘못 분기됩니다 (MySQL이 올바르게 실행되지만). "DECLARE var DEFAULT 값"지역 변수는 말할 것도 없습니다. 명확하지 않은 경우 NULL로 표시됩니다. 아, 그리고 "Undeclared identifier : '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. id 열을 자동 증가시킵니다.

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

무슨 일이 일어나고 있는지 알아내는 빠르고 더러운 작은 로거입니다.



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

저장 프로 시저의 주요 영역에 select 문을 배치하여 데이터 세트의 현재 상태를 확인한 다음 주석 처리 (--select ...)하거나 프로덕션 전에 제거합니다.


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

코드를 단계별로 살펴보고 변수를 "새로 고침"하면 코드 내부에서 일어나는 일을 더 잘 볼 수 있습니다.

중요 팁 : 디버깅하는 동안 변경 될 수 있습니다 (프로 시저 다시 작성). 다시 생성 한 후 새 $ debug 전에 $ exit 및 $ setup을 실행합니다.

이것은 "삽입"및 "로그"메소드의 대안입니다. 코드에 추가 "디버그"지침이 없습니다.

스크린 샷 :

오셀롯 중단 점 스테핑


6

MySQL Connector / Net 6.6에는 저장 프로 시저 및 함수디버그 하는 기능이 있습니다.

디버거 설치

저장 프로 시저 디버거를 사용하려면 다음을 수행하십시오.

  • Connector / Net 6.6의 경우 : Connector / Net 6.6을 설치하고 전체 옵션을 선택합니다.
  • Connector / Net 6.7 이상의 경우 : 스토어드 프로 시저 디버거가 속한 Visual Studio 용 MySQL 제품을 설치하십시오.

디버거 시작

디버거를 시작하려면 다음 단계를 수행하십시오.

  • Visual Studio 서버 탐색기에서 연결을 선택합니다.
  • 저장 프로 시저 폴더를 확장하십시오. 저장 프로 시저 만 직접 디버깅 할 수 있습니다. 사용자 정의 함수를 디버깅하려면 저장된
    를 호출 프로 시저를 .
  • 저장 프로 시저 노드를 클릭 한 다음 마우스 오른쪽 단추를 클릭하고 컨텍스트 메뉴에서 디버그 루틴을 선택합니다.

5

MySql Connector / NET에는 버전 6.6부터 Visual Studio에 통합 된 저장 프로 시저 디버거도 포함되어 있습니다. 여기에서 설치 프로그램과 소스를 얻을 수 있습니다. 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

업데이트 : Visual Studio 용 MySql은 Connector / NET에서 별도의 제품으로 분리되었습니다. 여기에서 선택할 수 있습니다 (디버거 포함). https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (여전히 무료 및 오픈 소스).

면책 조항 : 저는 Visual Studio 제품 용 MySQL 용 저장 프로 시저 디버거 엔진을 작성한 개발자였습니다.


MySQL 및 Connector .NET을 사용할 때 다중 호스트 연결 문자열에 문제가 있습니다. 나는 여기서 문제를 설명했다 . ... 누군가 이것을 조사 할 것인가? 이 ... MySQL을 사용하는 우리 닷넷 개발자의 많은 문제가 상당히 발생했습니다
Hooman Bahreini에게

1
유감입니다. 더 이상 Oracle에서 일하지 않으며 자유 시간도 많지 않습니다. MySQL 지원에 문의하는 것이 좋습니다.
Fernando Gonzalez Sanchez

4

MySQL을위한 최초의 안정적인 디버거는 MySQL 용 dbForge Studio에 있습니다.


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
수년간 Toad를 사용해 왔지만 sproc 디버깅을위한 특별한 기능이 있다는 것을 알지 못했습니다. Toad를 사용하여이를 수행하는 방법을 명확히 할 수 있습니까?
Cory House

지금 막 mysql 용 Toad 6.3을 살펴보면 중단 점과 모든 것이있는 디버그 기능이있는 것 같습니다. 디버그 기능이 작동하지 않는다는 의미입니까? 아니면 버전이 오래되어 디버그 기능이 포함되어 있지 않습니까?
Joyce

1

에 해당하는 답변 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.