MySQL 쿼리 로그를 활성화하는 방법?


252

클라이언트로부터받은 각 SQL 쿼리 문과 쿼리 문이 제출 된 시간을 기록하는 MySQL 기능을 어떻게 활성화합니까? phpmyadmin 또는 NaviCat에서 할 수 있습니까? 로그를 어떻게 분석합니까?

답변:


301

첫째, 이 로그 파일은 바쁜 서버에 매우 커질 수 있음을 기억하십시오.

mysql <5.1.29의 경우 :

쿼리 로그를 활성화하려면 섹션 /etc/my.cnf에 넣으십시오.[mysqld]

log   = /path/to/query.log  #works for mysql < 5.1.29

또한 MySQL 콘솔에서 활성화하려면

SET general_log = 1;

http://dev.mysql.com/doc/refman/5.1/en/query-log.html을 참조 하십시오

MySQL 5.1.29 이상

mysql 5.1.29+에서는 log옵션이 더 이상 사용되지 않습니다. 로그 파일을 지정하고 로깅을 활성화하려면 다음 [mysqld]섹션의 my.cnf에서이를 사용 하십시오.

general_log_file = /path/to/query.log
general_log      = 1

또는 MySQL 콘솔에서 로깅을 켜려면 (어쨌든 로그 파일 위치를 지정하거나 기본 위치를 찾아야 함) :

SET global general_log = 1;

또한 느린 쿼리 또는 인덱스를 사용하지 않는 쿼리 만 기록하는 추가 옵션이 있습니다.


1
MySQL 5.6.19에서는 작동하지 않습니다. 그들은 다시 그것을 바 꾸었습니까?
Alex R

5
general_log = on general_log_file = / path / to / query.log 나를 위해 일했습니다
Kiren Siva

27
이것은 나를 위해 일했습니다 (Windows의 MySQL 5.6.12) :SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen

로그 파일에 대한 mysql 사용자 액세스 권한이 있는지 확인하십시오. 그렇지 않으면 MySQL 콘솔에서 general_log 매개 변수를 설정할 때 '찾을 수 없음'오류가 리턴됩니다
Will R.

5.6.22 @youen은 정확히 맞았습니다. 감사! 확인해야 할 유일한 것은 작성중인 디렉토리와 파일이 존재하고 mysql에 의해 쓰기 가능하다는 것입니다.
NightOwlPrgmr

189

다른 관련 질문에 대한이 답변을 살펴보십시오. 다시 시작하지 않고 라이브 서버에서 로그를 활성화, 비활성화 및 확인하는 방법을 보여줍니다.

MySQL의 모든 쿼리를 기록


요약은 다음과 같습니다.

MySQL 서버를 원하지 않거나 재시작 할 수없는 경우 실행중인 서버에서 다음과 같이 진행할 수 있습니다.

  • 로그 테이블 만들기 ( 답변 참조 )

  • 데이터베이스에서 쿼리 로깅을 사용하도록 설정하십시오 (문자열 'table'은 문자 그대로 입력해야하며 테이블 이름으로 대체하지 않아야합니다. Thanks Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • 로그보기
select * from mysql.general_log;
  • 데이터베이스에서 쿼리 로깅 비활성화
SET global general_log = 0;

18
'table'은 문자 그대로 입력해야하며 데이터베이스의 테이블 이름으로 바뀌지 않아야합니다.
Nicholas Pickering

1
Mac OS X에서 MySQL 소프트웨어 설치 프로그램은 CSV 유형으로 general_log 테이블을 자동으로 생성 한 것으로 보입니다. 이것은 또한 해당 CSV 파일을 테일링 할 수 있음을 의미합니다. sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

SETing 전역 log_output = 'table'; 쿼리가 파일에 기록됩니까? SET global general_log = 0 이후에 생각합니다. 이전 'log_output'값을 설정해야합니다. 'FILE'일 가능성이 있습니다.
user2602807

59

다른 페이지로드를 빠르게 최적화하려는 경우이 방법을 사용하여 로깅합니다. 조금 팁입니다 ...

테이블에 로깅

SET global general_log = 1;
SET global log_output = 'table';

그런 다음 내 mysql.general_log테이블 에서 선택하여 최근 쿼리를 검색 할 수 있습니다 .

그런 다음 tail -fmysql.log 와 비슷한 것을 할 수 있지만 더 세밀하게 조정할 수 있습니다 ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

이를 통해 시도하고 줄일 수있는 쿼리를 쉽게 볼 수 있습니다. 8 초 간격을 사용하여 마지막 8 초 내에 실행 된 쿼리 만 가져옵니다.


57

이것은 이미 주석에 있지만 자체 답변이 필요합니다. 구성 파일을 편집하지 않고 : mysql에서 루트로 수행하십시오.

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

나중에 끄는 것을 잊지 마십시오 :

SET global general_log = off;

1
Linux systemd에서 파일에 로그인하려고하면 다음 /tmp/과 같은 위치에있을 수 있습니다./tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

다음을 사용하여 일반 쿼리 로그 (모든 쿼리를 기록)를 비활성화하거나 활성화 할 수 있습니다.

SET GLOBAL general_log = 1 # (or 0 to disable)

제 경우에는 공유 호스팅 서버에서 일반 쿼리 로그를 사용할 수 없습니다. 느린 쿼리 로그 만 활성화 할 수 있으며 시스템 관리자는 요청시 내 계정과 관련된 항목을 제공 할 수 있습니다.
Feng-Chun Ting

9

또한 MySQL 로그 파일을 사용하여 쿼리를 볼 수 있기를 원했고 아래 지침 으로이 문제를 해결했습니다.

  1. 이동 /etc/mysql/mysql.conf.d
  2. mysqld.cnf를여십시오

아래 줄을 활성화하십시오.

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. 이 명령으로 MySQL을 다시 시작하십시오. /etc/init.d/mysql restart
  2. 가서 /var/log/mysql/로그를 확인하십시오

MySQL이 시작될 때마다 적용되도록 해당 설정을 conf 파일에 저장해도되지만이 구성을 적용하기 위해 MySQL을 다시 시작할 필요는 없습니다. 다른 사람들이 말한 것처럼 'SET global'을 사용하여 설정할 수 있습니다.
Angel

6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 

3

Windows에서는 간단하게 이동할 수 있습니다.

C:\wamp\bin\mysql\mysql5.1.53\my.ini

이 줄을 my.ini에 삽입하십시오

general_log_file = c:/wamp/logs/mysql_query_log.log

의 my.ini 파일은 마지막으로 다음과 같습니다

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

MySQL 5.6 버전에는 버그가 있습니다. mysqld조차도 다음과 같이 표시됩니다.

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

실제 설정은 다음 순서로 읽습니다.

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

파일 확인 : "C : \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

누군가를 돕기를 바랍니다.


이 버그에 대한 버그 리포트가 있습니까?
mwfearnley

1

에 대한 > = 5.5 MySQL의 유일한 느린 쿼리 (1 초 이상) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
이것은 올바르지 않습니다-쿼리 로그가 아닌 느린 쿼리 로그를 활성화합니다.
Sam Dufel

대시를 사용해야한다고 생각합니다.
AFA Med

1

MAC 컴퓨터에서 쿼리 로그를 활성화하려면

다음 파일을여십시오 :

vi /private/etc/my.cnf

다음과 같이 'mysqld'섹션에서 쿼리 로그 URL을 설정하십시오.

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

기계가 쿼리를 올바르게 기록하지 않는 경우가 거의 없으므로 MySQL 콘솔에서 활성화 할 수 있습니다

mysql> SET global general_log = 1;

1

질문에 이미 큰 답변이 있으므로 질문에 대한 정확한 답변이 아닙니다. 이것은 부가 정보입니다. general_log를 활성화하면 실제로 MySQL 성능에 흠집이 생깁니다. general_log =1실수로 프로덕션 서버에 두고 성능이 다른 서버의 유사한 설정과 비교할 수없는 이유를 찾는 데 몇 시간을 보냈습니다. 그런 다음 일반 로그 사용으로 인한 영향을 설명하는 이것을 발견했습니다. http://www.fromdual.com/general_query_log_vs_mysql_performance .

이야기의 요지 general_log=1, .cnf파일에 넣지 마십시오 . 대신 set global general_log =1잠깐 동안 사용 하여 찾으려는 정보를 찾은 다음 끄십시오.


0

phpMyAdmin 4.0에서는 상태> 모니터로 이동합니다. 여기에서 느린 쿼리 로그 및 일반 로그를 활성화하고, 실시간 모니터를보고, 그래프의 일부를 선택하고, 관련 쿼리를보고 분석 할 수 있습니다.


0

한 시점에서 일반 로그를 삭제하고 다시 만들어야했습니다. 레크 리 에이션 중에 문자 세트가 엉망이되어 로그 에이 오류가 발생했습니다.

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

따라서 "로깅이 켜져 있는지 확인하십시오"라는 표준 답변이 효과가 없으면 필드에 올바른 문자 세트가 있는지 확인하십시오.

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