MySQL 서버에서 실행되는 쿼리를 캡처하는 방법은 무엇입니까?


14

우리는 일부 서버 성능 디버깅을 시도하고 있으며 몇 분 동안 MySQL 서버에서 실행되는 쿼리의 스냅 샷을 캡처하고 싶습니다.

MySQL에 익숙 SHOW FULL PROCESSLIST하지만 명령 줄을 통해이를 실행하여 파일로 덤프하고 처리 할 수 ​​있기를 원합니다.

이 쿼리를 파일로 출력하고 매 초마다 실행하는 방법이 있습니까?

실행중인 모든 쿼리를 캡처하는 더 좋은 방법이 있습니까?

느린 쿼리에만 관심이 없습니다 (저속 쿼리 로그에 익숙합니다).


어떤 OS를 사용하고 있습니까? 이것은 리눅스에서 수행하기가 매우 쉽기 때문에 창문을 추측하고 있습니까?
Patrick

@Patrick Linux에서 쉽게 들리게되어 기쁘다! 불을 멀리 ...
hafichuk

1
대부분의 쿼리는 1 초 이내에 실행 및 종료되며 목록에 표시되지 않습니다.
Joel Coel

또한 더 긴 쿼리는 각 루프마다 한 번씩 여러 번 나타나지만 bash에서 루프에서 echo show full processlist | mysql또는 더 나은 것을 원한다면 확실합니다 SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root". 몇 줄을 추가하면 다음과 같은 쿼리 기능을 innotop사용할 수 있습니다. pt-kill
theist

답변:


10

느린 쿼리 로그를 사용합니다. long_query_time = 0으로 설정하면 느린 쿼리뿐만 아니라 모든 쿼리를 캡처합니다.

또한 여기에 언급 된 TCP 스니핑 기술에 해당되지 않는 모든 쿼리를 캡처합니다. 소켓을 통해 실행 된 쿼리는 캡처하지 않습니다. SHOW PROCESSLIST를 시청하기위한 Ditto; 빠른 실행 쿼리를 놓치게됩니다.

프로세스 목록 또는 TCP 트래픽을 통해 쿼리를 캡처하려면 Percona Toolkit의 pt-query-digest를 사용하는 것이 좋습니다. 프로세스 목록을 폴링 할 수 있으며 결과를 이해하면 많은 샘플을 캡처하는 경우 수행하기가 매우 어려워집니다 .MySQL의 TCP 프로토콜을 해석 할 수 있으므로 일부 TCP를 가져올 수 있습니다 소통하고 분석하십시오. 물론, 그것은 최고의 쿼리 애그리 게이터 / 프로파일 러 / 리포터이기도하지만 쿼리를 캡처 한 후 쿼리로 무엇을하고 싶은지 말하지 않았습니다.


13

가장 강력한 방법은 "일반 쿼리 로그"를 사용하여 모든 쿼리를 캡처하는 것입니다. http://dev.mysql.com/doc/refman/5.1/en/query-log.html

MySQL 서버 버전을 지정하지 않았지만 5.1.12 이상이있는 경우 SQL을 통해 전역 변수를 사용하여이를 활성화 및 비활성화 할 수 있습니다. 자세한 내용은 설명서를 참조하십시오.


감사합니다 @Daniel. 이 기능을 설정했지만 로그에 타임 스탬프 정보가 없습니다. 타임 스탬프를 얻는 방법에 대한 아이디어가 있습니까?
hafichuk

죄송합니다. 설명서를 가리키는 것 외에는 아무것도 없습니다.
Daniel Pittman

2
long_query_time = 0 인 느린 쿼리 로그가 더 나은 옵션입니다. 여전히 모든 쿼리를 캡처합니다.
Baron Schwartz

남작의 경우 +1 : 일반 쿼리 로그에 필요한 성능 지표가 포함되어 있지 않습니다. 느린 쿼리 로그를 분석하기 위해 MySQL 서버와 함께 제공되는 perl 스크립트도 있습니다 (조건 자에서 리터럴 값 제거). 그러나 이전 버전의 MySQL은 1 초 미만의 long_query_time을 지원하지 않습니다.이 경우 업그레이드하는 경우 최신 버전에서 성능이 훨씬 향상되었습니다.
symcbean


4

확실한:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

건배


아 ... mysqladmin. 감사합니다. @ HTTP500
hafichuk

1
실제로는 1 초마다 processlist 명령을 실행합니다. 매우 빠른 쿼리는 여전히 캡처를 피할 수 있습니다. 로드가 몇 개의 큰 쿼리로 구성되면 작동하지만 많은 작은 쿼리로 구성되어 있으면 작동하지 않을 수 있습니다.
LSerni

@Isemi, OP는 "매 초마다"를 요구했습니다.
HTTP500

4

이것은 Mysql 프록시 의 장소 일 수 있습니다 . 기본적으로 전송되는 쿼리를 캡처하고 조작 할 수 있습니다. 가로 채기위한 기본 설정은 매우 쉽습니다. 그런 다음 프록시를 가리 키도록 클라이언트 구성을 변경하면 모든 요청을 캡처 할 수 있습니다.


4

터미널 기반 Wireshark 프로그램 tshark 가 도움이 될 수 있습니다.

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkAmazon Linux에서 sudo apt-get install tsharktshark를 제공하고 Ubuntu 14 이상에서 tshark를 제공합니다


3

나는 'Rui Pedro Bernardino의 솔루션을 사용했습니다. 첫 번째 줄에서 몇 가지 사항을 변경 한 것을 제외하고는 훌륭하게 작동합니다 ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

검색하고 검색하고 마침내 mysql 서버에서 실행되는 모든 쿼리를 실시간으로 모니터링하기 위해 MONyog 에 도착했습니다 . 유일하게 주목할 것은 "Performance_schema"및 "statements_digest"테이블 만 활성화하고 Performance_schema는 MySQL 5.6.14 이상에서 사용 가능합니다.

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