MySQL의 모든 쿼리를 기록


답변:


166

--log 옵션으로 mysql을 시작하십시오 :

mysqld --log=log_file_name

또는 my.cnf파일에 다음을 배치 하십시오.

log = log_file_name

어느 쪽이든 모든 쿼리를 log_file_name에 기록합니다.

--log-slow-queries대신 옵션을 사용하여 느린 쿼리 만 기록 할 수도 있습니다 --log. 기본적으로 10 초 이상 걸리는 쿼리는 느리게 간주됩니다 long_query_time. 기록하기 전에 쿼리를 실행하는 데 걸리는 시간 (초) 으로 설정 하여 이를 변경할 수 있습니다 .


61
말할 필요도 없지만 프로덕션 박스에서이 기능을 켜두면 비 엔터테인먼트가 빠르게 진행됩니다. g
ceejayoz 2011

6
이런 방식으로 로깅을 활성화하는 데 문제가 있으면 mysql 사용자가 적절한 파일 위치에 쓸 수 있는지 확인하십시오.
Jon Topper

3
1 particuarl db / table에 대해서만 쿼리를 기록 할 수 있습니까?
Temujin

2
@Temujin phpmyadmin은 이제 로그 ( 'version')를 지정하는 테이블에 대한 '추적'옵션을 가지며 시간과 전체 쿼리에 대한 정보로 영향을받는 쿼리를 기록합니다.
gadget00

3
이 답변은 MySQL 5.6. +에서 작동하지 않는다는 사실을 반영하여 삭제되거나 편집되어야합니다.
itoctopus

233

( 참고 : mysql-5.6 +의 경우 작동하지 않습니다. 아래로 스크롤 하거나 여기를 클릭 하면 mysql-5.6 +에 적용되는 솔루션이 있습니다 .)

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

  • mysql데이터베이스 에서 로그 테이블 작성
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
  • 데이터베이스에서 쿼리 로깅 사용
SET global general_log = 1;
SET global log_output = 'table';
  • 로그보기
select * from mysql.general_log
  • 데이터베이스에서 쿼리 로깅 비활성화
SET global general_log = 0;

14
이것이 모든 MySQL 버전 (5.5에 있음)에 해당되는지 확실하지 않지만 테이블을 만들 필요는 없습니다. : 여기 나와있는 테이블을 만드는 같은 조언을 뺀, 다음 stackoverflow.com/a/678310/135101
타일러 콜리

어쩌면 그것은 이미 하나 또는 다른 이유로, @TylerCollier
Alexandre Marcondes

3
사용자가 만든 데이터베이스가 아니라 데이터베이스 에서 CREATE TABLE명령이 실행되어야합니다 (테이블이 존재하지 않는 경우) mysql. 아마도이를 반영하도록 SQL 문을 업데이트 할 수 있습니다.
Robert Rossmann

2
로그를 보는 SELECT * FROM mysql.general_log order by (event_time) desc것이 좋습니다. just
say

동의하지 마십시오 참고 - 서버 버전 5.6.37 작품을 완벽하게 제대로. 감사.
Dmitriy Olhovsky

215

내가 여기에 온 것 외에도 다음을 실행하면 다시 시작하지 않고 쿼리를 로그 파일에 덤프하는 가장 간단한 방법이었습니다

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

로 끌 수 있습니다

SET global general_log = 0;

6
절대적으로 이것을 좋아하고 DB의 기존 및 새로운 연결을 위해 작동합니다
Carlton

1
몇 가지 통계 항목이 있습니다. 통계 항목은 확실하지 않지만 실제로는 잘 작동합니다.
Snowcrash

이렇게하려면 사용자에게 글로벌 DB 권한 인 SUPER 권한이 있어야하며 특정 스키마 나 테이블로 제한 될 수 없습니다.GRANT SUPER ON *.* TO user1@localhost
RobM

할 수 있다면 한 번 이상 찬성했습니다. 여기에 북마크가 있습니다. :) 고마워요!
resi

125

mysql 5.6 이상에서는 최고 답변이 작동하지 않습니다. 대신 이것을 사용하십시오 :

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

my.cnf / my.ini 파일에

우분투 / 데비안 : /etc/mysql/my.cnf
Windows : c : \ ProgramData \ MySQL \ MySQL Server 5.x
wamp : c : \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c : \ xampp \ mysql \ bin \ my.ini.


1
이것을 사용했다면, 위의 성능에 영향을 줄 수 있습니까? 그렇게 로깅을 활성화하는 것이 현명합니까?
Ramesh Pareek

1
Ramesh 성능 영향은 성능이 약 5-15 % 감소한 것으로 보입니다. 자세한 정보는 여기 percona.com/blog/2009/02/10/…
Firze

1
Mysql 5.6이 로그 파일을 쿼리에서 설정할 수없는 이유를 이해하지 못합니까? 서버 디렉토리 트리에 액세스 할 수는 없지만 MySQL 5.6 이상에서 모든 쿼리를 기록하는 방법은 phpMyAdmin무엇입니까?
Vicky Dev

이 변경 후 xampp 제어판에서 mysql 서비스를 다시 시작하십시오.
Paramjeet

이것은 내 로컬 Xampp Apache 환경에서 나를 위해 일했지만 여전히 phpMyAdmin을 통해 로깅을 켜야했습니다. 또한 / usr / log 폴더에서 파일을 찾을 수 없거나 파일을 만들 수도 없었지만general_log_file=filename.log
JoeP

36

테이블에 로그를 사용하도록 설정

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

선택 쿼리로 로그보기

select * from mysql.general_log

모든 테이블을 기록하는 와일드 카드가 있습니까? (많은 것들이있다 : C)
RicardoE

고맙게도이 설정은 mysql-server를 중단 할 수 없으므로 매우 유용했습니다. 또한 로그가 로그 테이블에 표시되기를 원합니다
Gunnar Sigfusson

14

다시 시작하지 않고 MySQL 일반 쿼리 로그를 활성화하는 빠른 방법입니다.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

Homebrew, mysql 버전 : mySQL Ver 14.14 Distrib 5.7.15, EditLine 래퍼를 사용하여 osx10.11 (x86_64)을 통해 mysql을 설치했습니다.


6

기록을 위해 general_log 및 slow_log가 5.1.6에서 도입되었습니다.

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

5.2.1. 일반 쿼리 및 느린 쿼리 로그 출력 대상 선택

MySQL 5.1.6부터 MySQL 서버는 일반 쿼리 로그 및 느린 쿼리 로그에 대한 출력 대상이 활성화 된 경우 출력 대상을 유연하게 제어 할 수 있습니다. 로그 항목의 가능한 대상은 mysql 데이터베이스의 로그 파일 또는 general_log 및 slow_log 테이블입니다.


5

mysql 로그온은 실제로 성능에 영향을 미치지 만, 현명한 일이 될 수 있습니다.

나는 보통 dev 서버에 그대로 둡니다 (우리를 미치게 만들 때 제외 :))


2

OS / MySQL 버전 :

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

로깅 추가 (예 /var/log/...: Mac OS에서 가장 좋은 경로는 아니지만 생각 합니다.

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

MySQL을 다시 시작

결과:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

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