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

MySQL에서 디버깅 메시지를 stdout, temptable 또는 logfile로 인쇄하는 방법이 있습니까? 다음과 같은 것 :

  • print SQLServer에서
  • DBMS_OUTPUT.PUT_LINE Oracle에서



답변

옵션 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에서 임의의 명령을 실행할 수 있기 때문에 크래커가 상자를 루팅하는 것을 방지하기위한 것입니다.


답변

한 가지 해결 방법은 다른 절없이 select를 사용하는 것입니다.

http://lists.mysql.com/mysql/197901


답변

무언가를 인쇄하는 빠른 방법은 다음과 같습니다.

select '** Place your mesage here' AS '** DEBUG:';


답변

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

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


답변

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

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의 첫 번째 문이어야합니다.


답변