MySQL에서 마지막으로 실행 된 쿼리를 표시하는 방법은 무엇입니까?


471

모든 서버 에서 마지막으로 실행 된 쿼리를 표시하는 쿼리 / 방법이 있습니까?

답변:


793

MySQL> = 5.1.12를 사용하는 사용자는 런타임에이 옵션을 전체적으로 제어 할 수 있습니다.

  1. 실행 SET GLOBAL log_output = 'TABLE';
  2. 실행 SET GLOBAL general_log = 'ON';
  3. 테이블 좀 봐 mysql.general_log

테이블 대신 파일로 출력하려는 ​​경우 :

  1. SET GLOBAL log_output = "FILE"; 기본값 입니다.
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

다음과 같은 이유로 .cnf 파일을 편집하는 것보다이 방법을 선호합니다.

  1. my.cnf파일을 편집하지 않고 잠재적으로 로깅을 켤 수 있습니다
  2. 당신은 파일 시스템을 돌아 다니며 쿼리 로그를 찾고 있지 않습니다. /var/log /var/data/log /opt /home/mysql_savior/var
  3. 서버를 다시 시작하거나 현재 연결을 중단 할 필요는 없습니다.
  4. 서버를 다시 시작하면 시작한 위치가 그대로 남습니다 (기본적으로 로그는 여전히 꺼져 있음)

자세한 내용은 MySQL 5.1 참조 설명서-서버 시스템 변수-general_log를 참조 하십시오.


4
훌륭한 UI 디자인. 어쨌든 MySQL 로그 테이블은 실제로 CSV 엔진을 사용하므로 flip_cF가 general_log 테이블에 로깅을 활성화하는 것에 대한 답변에서 말한 모든 것을 수행 할 수 있으며 다음과 같이 general_log의 tail -f를 가질 수 있습니다 : tail -f / var / lib / mysql / mysql / general_log.CSV

2
젠장, 이것에 대한 mysql 문서는 심지어 테이블 매개 변수를 촬영하지 않았습니다. 고마워
Abhishek Dujari


6
"truncate table mysql.general_log"
pdwalker

1
이 방법으로 결과를 얻었지만 매개 변수는 물음표로 표시됩니다 (예 : x =?에서 bar에서 foo 선택). 완전한 쿼리를 얻으려면 어떻게해야합니까?
okwap

43

해당 종류의 진단에 일반 쿼리 로그 를 활성화 할 수 있습니다 . 일반적으로 프로덕션 서버에 모든 SELECT 쿼리를 기록하지는 않지만 성능을 저하시킵니다.

MySQL 설정을 편집하십시오 (예 : /etc/mysql/my.cnf)-이와 같은 줄을 찾거나 추가하십시오

[mysqld]
log = /var/log/mysql/mysql.log

변경 사항을 적용하려면 mysql을 다시 시작하십시오.

tail -f /var/log/mysql/mysql.log

이봐, 당신은 그들이 들어오는 쿼리를 볼 수 있습니다.


4
my.cnf의 general_log_file 및 general_log
Martin Thoma


1
최신 버전의 Mac OS X (적어도 Mac OS X에서는)에는 "log ="대신 general_log_file 및 general_log 옵션이 필요합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다. ERROR / usr / local / mysql / bin / mysqld : 모호한 옵션 '--log = / tmp / mysql_queries.log'(log-bin, log_slave_updates)
Jay Sheth

@JaySheth, Mariadb 10.2에서 오류가 발생했기 때문에 Mac OS와 관련이 있는지 확실하지 않습니다.
user10089632

16

mysql 쿼리 로그를 모니터링하기 위해 흐르는 작업을 수행 할 수 있습니다.

mysql 구성 파일 my.cnf를 엽니 다.

sudo nano /etc/mysql/my.cnf

[mysqld]제목 아래에서 다음 줄을 검색 하고 주석을 해제하여 로그를 활성화하십시오.

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

변경 사항을 반영하기위한 MySQL 서버를 다시 시작

sudo service mysql start

터미널에서 다음 명령으로 MySQL 서버 로그 모니터링

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1) 일반 mysql 로깅이 활성화되면 구성에서 언급 한 내용을 기반으로 로그 파일 또는 테이블의 쿼리를 확인할 수 있습니다. 다음 명령으로 활성화 된 것을 확인하십시오

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

테이블에 쿼리 기록이 필요한 경우

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

mysql.general_log 테이블을 살펴보십시오.

당신은 파일에 출력을 원하는 경우 :

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) .mysql_history 파일 cat ~ / .mysql_history에서 쿼리를 확인할 수도 있습니다.



4

mysql binlog 가 활성화 된 경우 mysql binlog 디렉토리를 찾아 Linux 콘솔에서 다음 명령을 실행하여 사용자가 실행 한 명령을 확인할 수 있습니다.

mysqlbinlog binlog.000001 >  /tmp/statements.sql

가능

[mysqld]
log = /var/log/mysql/mysql.log

또는 일반 로그는 mysql의 성능에 영향을 미칩니다


가능하지만 고통 스럽습니다. 과거에 일어난 일을보고자하는 경우 더 유용합니다.
pdwalker


2

Paul의 답변을 읽은 후 https://dev.mysql.com/doc/refman/5.7/en/query-log.html 에 대한 자세한 정보를 찾기 위해 계속 파고 들었습니다.

사람이 실제로 유용한 코드를 찾았습니다. 다음은 컨텍스트 요약입니다.

(참고 : 다음 코드는 내 코드가 아닙니다)

이 스크립트는 테이블 크기를 줄이는 데 도움이되는 테이블을 깨끗하게 유지하는 예제입니다. 하루가 지나면 약 180k 개의 로그 쿼리가 발생합니다. (파일에서 하루 30MB입니다.)

추가 열 (event_unix)을 추가 한 다음이 스크립트를 사용하여 로그를 깨끗하게 유지할 수 있습니다. 타임 스탬프를 Unix-timestamp로 업데이트하고 1 일보다 오래된 로그를 삭제 한 다음 event_time을 Timestamp로 업데이트합니다 event_unix에서 ... 조금 혼란스럽게 들리지만 훌륭하게 작동합니다.

새 열에 대한 명령 :

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

정리 스크립트 :

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

크레딧은 Sebastian Kaiser (코드의 원저자)에게 전달됩니다.

누군가가 내가했던 것처럼 유용 할 수 있기를 바랍니다.


흥미 롭군 모든 DB를 먼저 잠그지 않으면 정리하는 동안 쿼리가 누락됩니다. 여기서 발생할 수있는 다른 문제가 있습니다. 우리가이 '연속적인'로깅의 시점에 있다면, 파일 로깅이나 bin 로그 및 상용 로그 로테이터를 사용할 것입니다.
FlipMcF

1

리눅스에서 다음을 볼 수 있습니다

cd /root

ls -al

vi .mysql_history 도움이 될 수 있습니다


6
이것은 공식적인 커맨드 라인 mysql 클라이언트와 루트 사용자가 실행 한 쿼리에 대해서만 작동하는 것처럼 보입니다.
golimar

질문에 '모든 서버'라고 표시되어 있어이 답변이 잘못되었습니다. 단일 클라이언트가 실행 한 모든 쿼리가 표시됩니다.
FlipMcF

mysql binlog가 사용 가능한 경우 mysql binlog 디렉토리를 찾아 Linux 콘솔에서 다음 명령을 실행하여 사용자가 실행 한 명령을 확인할 수 있습니다. mysqlbinlog binlog.000001> /tmp/statements.sql enabled [mysqld] log = / var / log / mysql / mysql.log 또는 일반 로그는 mysql의 성능에 영향을 미칩니다
Avinash Singh

예를 들어 "password"를 포함하는 문자열 인 경우이 항목의 일부 항목은 기본적으로 억제됩니다.
mckenzm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.