MySQL의 저장 프로 시저에서 디버깅 정보 인쇄


답변:


117

옵션 1 : 실행될 때 stdout에 '주석'을 인쇄하려면이를 프로 시저에 넣으십시오.

SELECT 'Comment';

옵션 2 : 이것을 프로 시저에 넣어 변수와 함께 stdout에 인쇄합니다.

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

myvar is 5프로 시저가 실행될 때 stdout에 인쇄 됩니다.

옵션 3,이라는 하나의 텍스트 열이있는 테이블을 tmptable만들고 메시지를 푸시합니다.

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

위의 내용을 저장 프로 시저에 넣을 수 있으므로 작성해야하는 것은 다음과 같습니다.

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

몇 가지 키 입력을 저장합니다.

옵션 4, 파일에 메시지 기록

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

이 명령에는 매우 엄격한 제한이 있습니다. 'others'그룹에 생성 및 쓰기 권한을 부여하는 디스크의 영역에만 outfile을 쓸 수 있습니다. / tmp 디렉토리에 저장하면 작동합니다.

또한 일단 outfile을 작성하면 덮어 쓸 수 없습니다. 이는 크래커가 웹 사이트에 SQL을 주입하고 MySQL에서 임의의 명령을 실행할 수 있기 때문에 크래커가 상자를 루팅하는 것을 방지하기위한 것입니다.


3
mysql이 불평 Not allowed to return a result set from a trigger, 어떤 생각?
Jerry Chin

아마도 거의 3 년 만에 문제를 해결했지만 출력을 파일로 사용하여 오류를 제거하십시오.
Gabriel Cliseru



5

일반적으로 저장 프로 시저가있는 로그 테이블을 만들어 로그에 기록합니다. 개발중인 프로 시저에서 필요할 때마다 로깅 프로 시저를 호출합니다.

이 같은 질문에 대한 다른 게시물 을 보면 몇 가지 대안이 있지만 일반적인 관행처럼 보입니다.


5
로그 테이블은 MyISAM 또는 기타 비 트랜잭션 스토리지 엔진이어야하므로 롤백 된 트랜잭션도 추적 할 수 있습니다.
gaborsch 2014 년

4

이것이 내가 디버깅하는 방법입니다.

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 

쿼리 1, 2 또는 3에서 오류가 발생하면 HANDLER는 SQLEXCEPTION을 포착하고 SHOW ERRORS는 오류를 표시합니다. 참고 : SHOW ERRORS는 HANDLER의 첫 번째 문이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.