저장 프로 시저를 디버깅하는 현재 프로세스는 매우 간단합니다. 실행되는 저장 프로 시저의 변수 값을 삽입하는 "debug"라는 테이블을 만듭니다. 이렇게하면 스크립트의 지정된 지점에서 변수 값을 볼 수 있지만 MySQL 저장 프로 시저를 디버깅하는 더 좋은 방법이 있습니까?
저장 프로 시저를 디버깅하는 현재 프로세스는 매우 간단합니다. 실행되는 저장 프로 시저의 변수 값을 삽입하는 "debug"라는 테이블을 만듭니다. 이렇게하면 스크립트의 지정된 지점에서 변수 값을 볼 수 있지만 MySQL 저장 프로 시저를 디버깅하는 더 좋은 방법이 있습니까?
답변:
나는 당신과 매우 비슷한 일을합니다.
일반적으로 기본적으로 false로 설정되고 런타임에 true로 설정할 수있는 DEBUG 매개 변수를 포함합니다. 그런 다음 디버그 문을 "If DEBUG"블록으로 래핑합니다.
또한 프로세스와 타이밍을 검토 할 수 있도록 많은 작업에 로깅 테이블을 사용합니다. 내 디버그 코드도 출력됩니다. 호출 매개 변수 이름, 간단한 설명, 영향을받는 행 수 (해당하는 경우), 설명 필드 및 타임 스탬프를 포함합니다.
좋은 디버깅 도구는 모든 SQL 플랫폼의 슬픈 실패 중 하나입니다.
다음 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
INSERT INTO my_log_table (message) VALUES (msg)
함수 호출이 끝난 후에 만 모든 디버그 메시지를 검색 할 수 있습니다 (예 : 프로 시저로
예, 이런 종류의 특수 도구 인 MySQL Debugger가 있습니다.
MySQL 저장 프로 시저를 디버깅하는 방법.
가난한 사람의 디버거 :
두 개의 열이있는 logtable이라는 테이블을 id INT
만들고 log VARCHAR(255)
.
id 열을 자동 증가시킵니다.
이 절차를 사용하십시오.
delimiter //
DROP PROCEDURE `log_msg`//
CREATE PROCEDURE `log_msg`(msg VARCHAR(255))
BEGIN
insert into logtable select 0, msg;
END
테이블에 메시지를 기록하려는 곳에이 코드를 넣으십시오.
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
무슨 일이 일어나고 있는지 알아내는 빠르고 더러운 작은 로거입니다.
MySQL의 저장 프로 시저 / 함수 및 스크립트 를 디버깅하기위한 GUI 도구 가 있습니다 . dbForge Studio for MySQL은 풍부한 기능과 안정성을 갖춘 괜찮은 도구입니다.
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;
여기에 또 다른 방법이 제시됩니다.
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
여기에 언급 됨
나는 파티에 늦었지만 맥주를 더 가져 왔습니다.
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을 실행합니다.
이것은 "삽입"및 "로그"메소드의 대안입니다. 코드에 추가 "디버그"지침이 없습니다.
스크린 샷 :
MySQL Connector / Net 6.6에는 저장 프로 시저 및 함수 를 디버그 하는 기능이 있습니다.
디버거 설치
저장 프로 시저 디버거를 사용하려면 다음을 수행하십시오.
- Connector / Net 6.6의 경우 : Connector / Net 6.6을 설치하고 전체 옵션을 선택합니다.
- Connector / Net 6.7 이상의 경우 : 스토어드 프로 시저 디버거가 속한 Visual Studio 용 MySQL 제품을 설치하십시오.
디버거 시작
디버거를 시작하려면 다음 단계를 수행하십시오.
- Visual Studio 서버 탐색기에서 연결을 선택합니다.
- 저장 프로 시저 폴더를 확장하십시오. 저장 프로 시저 만 직접 디버깅 할 수 있습니다. 사용자 정의 함수를 디버깅하려면 저장된
를 호출 프로 시저를 .- 저장 프로 시저 노드를 클릭 한 다음 마우스 오른쪽 단추를 클릭하고 컨텍스트 메뉴에서 디버그 루틴을 선택합니다.
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 사용자 정의 변수 (세션에서 공유)를 로깅 출력으로 사용할 수 있습니다.
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
두꺼비 mysql. 프리웨어 버전 http://www.quest.com/toad-for-mysql/이 있습니다.
에 해당하는 답변 이 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