본문 바로가기
IT 실무/서버 관리

prepare를 사용할 때 최종 실행된 sql문 로그로 기록하여 확인

by 지식id 2014. 2. 22.
반응형

prepare을 사용 할 경우, 명령 구문과 변수가 excute시 합쳐지기 때문에 PHP에서는 최종적으로 실행된 sql문이 어떤 것인지 확인 할 수 없다.

보안상 안전하긴 하지만 한번씩 디버깅이 힘들 때가 있다.


이럴땐 mysql의 로그 기능을 이용하여, mysqld가 동작 중일때 실행 되었던 모든 sql statement를 기록시켜서 확인 해야 한다.


여러 방법이 있지만.. 가장 default한 설정을 건들지 않고 간단하게 확인 할 수 있는 방법은 아래와 같다.


shell > set global log_output = 'TABLE';

mysql Database 테이블에 저장 할 수도 있고 파일로 저장 할 수도 있다. default가 table이므로 설정을 건든적이 없다면 굳이 이 명령은 실행시키지 않아도 된다. 

mysql 버전이 낮거나, 낮은 버전에서 update를 거친 경우 로그 저장을 위한 table이 생성이 안되어 있을 수도 있다. 그럴땐 


http://c0desway.tistory.com/59 를 참고 하길 바란다. 


shell > set global general_log = 1;

로깅을 시작한다. 명심 해 줘야 될건 이 명령은 디버깅을 마친 후 반드시 꺼줘야 한다는 것이다. 실제로 웹서비스를 운영 할 경우 금방 수만개의 레코드가 쌓여 버린다.


shell > use mysql;

로그는 mysql database에 있는 table에 기록된다. 일단 mysql database에 접근한다. 디버깅 도중 phpmyadmin은 사용하지 않길 바란다. 클릭 한두번만 해도 phpmyadmin에서 실행시키는 쿼리만 수십개가 쌓여 버려 실제로 필요한 구문을 찾기 힘들어진다.


shell > select * from general_log;

쉘에서 직접 select를 하여 방금 실행한 쿼리 statement가 무엇인지 확인 할 수 있다. (브라우저 상에서 확인을 원하는 쿼리를 실행시키고 쉘에서 이렇게 확인한다.)


shell > set global general_log = 0;

디버깅이 완료 되었으면 다시 꺼준다. 까먹으면 몇일 후에 DB용량이 두배로 늘어나 있는 모습을 확인 할 수 있을 것이다.


shell > turncate general_log;

임시 디버깅용으로 사용된 테이블이므로, 다음 사용을 위해 비워준다. 계속 사용되므로 drop을 하면 안된다..


더 제대로 활용하고 싶다면 google에 "mysql general log" 라고 검색해 보자

반응형

댓글