Làm cách nào để kích hoạt Nhật ký truy vấn MySQL?


252

Làm cách nào để kích hoạt chức năng MySQL ghi lại từng câu lệnh truy vấn SQL nhận được từ máy khách và thời gian mà câu lệnh truy vấn đã gửi? Tôi có thể làm điều đó trong phpmyadmin hoặc NaviCat không? Làm thế nào để tôi phân tích nhật ký?

Câu trả lời:


301

Đầu tiên, hãy nhớ rằng logfile này có thể phát triển rất lớn trên một máy chủ bận rộn.

Đối với mysql <5.1,29:

Để kích hoạt tính năng đăng nhập truy vấn, đặt điều này trong /etc/my.cnftrong [mysqld]phần

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

Ngoài ra, để kích hoạt nó từ bảng điều khiển MySQL

SET general_log = 1;

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

Đối với mysql 5.1,29+

Với mysql 5.1.29+, logtùy chọn không được chấp nhận. Để chỉ định logfile và cho phép ghi nhật ký, hãy sử dụng điều này trong my.cnf trong [mysqld]phần:

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

Cách khác, để bật ghi nhật ký từ bảng điều khiển MySQL (cũng phải chỉ định vị trí tệp nhật ký bằng cách nào đó hoặc tìm vị trí mặc định):

SET global general_log = 1;

Cũng lưu ý rằng có các tùy chọn bổ sung để chỉ ghi nhật ký các truy vấn chậm hoặc những tùy chọn không sử dụng chỉ mục.


1
Điều này không hoạt động trong MySQL 5.6.19. Họ đã thay đổi nó một lần nữa?
Alex R

5
general_log = on general_log_file = / path / to / query.log đã làm việc cho tôi
Kiren Siva

27
Điều này làm việc cho tôi (MySQL 5.6.12 trên Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen 7/07/2015

Đảm bảo rằng quyền truy cập của người dùng mysql cho tệp nhật ký, nếu không nó sẽ trả về lỗi 'không tìm thấy' khi đặt tham số general_log trong bảng điều khiển MySQL
Will R.

Cho 5.6,22 @ bạn đã hiểu chính xác. Cảm ơn! Điều duy nhất để chắc chắn là thư mục và tệp được ghi tồn tại và có thể ghi được bởi mysql.
NightOwlPrgmr

189

Hãy xem câu trả lời này cho một câu hỏi liên quan khác. Nó cho thấy cách bật, tắt và xem nhật ký trên các máy chủ trực tiếp mà không cần khởi động lại.

Đăng nhập tất cả các truy vấn trong mysql


Đây là một bản tóm tắt:

Nếu bạn không muốn hoặc không thể khởi động lại máy chủ MySQL, bạn có thể tiến hành như thế này trên máy chủ đang chạy của mình:

  • Tạo bảng nhật ký của bạn (xem câu trả lời )

  • Cho phép ghi nhật ký truy vấn trên cơ sở dữ liệu (Lưu ý rằng chuỗi 'bảng' phải được đặt theo nghĩa đen và không được thay thế bằng bất kỳ tên bảng nào. Cảm ơn Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Xem nhật ký
select * from mysql.general_log;
  • Vô hiệu hóa ghi nhật ký truy vấn trên cơ sở dữ liệu
SET global general_log = 0;

18
Cần lưu ý rằng 'bảng' có nghĩa là được nhập theo nghĩa đen và không được thay thế bằng tên bảng trong cơ sở dữ liệu của bạn.
Nicholas Pickering

1
Trên Mac OS X, trình cài đặt phần mềm MySQL dường như đã tự động tạo bảng general_log, với kiểu CSV. Điều này có nghĩa là tôi cũng có thể theo đuôi tệp CSV tương ứng: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

Sau khi thiết lập toàn cầu logDefput = 'bảng'; truy vấn chậm sẽ được ghi vào một tập tin? Tôi nghĩ sau khi SET toàn cầu general_log = 0; bạn nên đặt giá trị 'logDefput' trước đó, có thể là 'FILE'
user2602807

59

Tôi sử dụng phương pháp này để đăng nhập khi tôi muốn nhanh chóng tối ưu hóa các tải trang khác nhau. Đó là một mẹo nhỏ ...

Đăng nhập vào BẢNG

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

Sau đó, bạn có thể chọn từ mysql.general_logbảng của tôi để truy xuất các truy vấn gần đây.

Sau đó tôi có thể làm một cái gì đó tương tự như tail -ftrên mysql.log, nhưng với nhiều tinh chỉnh hơn ...

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"

Điều này giúp dễ dàng xem các truy vấn của tôi mà tôi có thể thử và cắt lại. Tôi sử dụng khoảng thời gian 8 giây để chỉ tìm nạp các truy vấn được thực hiện trong vòng 8 giây qua.


57

Điều này đã có trong một bình luận, nhưng xứng đáng có câu trả lời của riêng nó: Không cần chỉnh sửa các tệp cấu hình: trong mysql, với tư cách là root, do

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

Đừng quên tắt nó sau đó:

SET global general_log = off;

1
Tôi đã thấy rằng trong Linux systemd, nếu bạn cố gắng đăng nhập vào một tệp /tmp/, nó có thể kết thúc ở một nơi nào đó như/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

Bạn có thể vô hiệu hóa hoặc kích hoạt nhật ký truy vấn chung (ghi nhật ký tất cả các truy vấn) với

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

Trong trường hợp của tôi, nhật ký truy vấn chung không thể được bật trên các máy chủ lưu trữ được chia sẻ. Tôi chỉ có thể kích hoạt nhật ký truy vấn chậm và quản trị viên hệ thống có thể cung cấp các mục liên quan đến tài khoản của tôi theo yêu cầu.
Feng-Chun Ting

9

Tôi cũng muốn kích hoạt tệp nhật ký MySQL để xem các truy vấn và tôi đã giải quyết vấn đề này bằng các hướng dẫn bên dưới

  1. Đi đến /etc/mysql/mysql.conf.d
  2. mở mysqld.cnf

và kích hoạt các dòng dưới đây

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. khởi động lại MySQL bằng lệnh này /etc/init.d/mysql restart
  2. đi đến /var/log/mysql/và kiểm tra nhật ký

Bạn có thể lưu các cài đặt đó trong tệp conf để được áp dụng mỗi khi MySQL được khởi động, nhưng bạn không cần phải khởi động lại MySQL để áp dụng cấu hình này. Bạn có thể thiết lập nó bằng cách sử dụng 'SET global' như những người khác đã nói.
Thiên thần

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

Trên Windows, bạn có thể chỉ cần truy cập

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

Chèn dòng này vào my.ini

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

Tệp my.ini cuối cùng trông như thế này

...
...
...    
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

Có lỗi trong phiên bản MySQL 5.6. Ngay cả mysqld cũng hiển thị như:

    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 

Cài đặt thực sự đang đọc theo thứ tự sau:

    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

Kiểm tra tệp: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Hy vọng nó sẽ giúp được ai đó.


Có một báo cáo lỗi ở đâu đó cho lỗi này?
mwfearnley

1

chỉ dành cho mysql> = 5,5 cho các truy vấn chậm (1 giây trở lên) 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
Điều này không chính xác - cho phép nhật ký truy vấn chậm, không phải nhật ký truy vấn.
Sam Dufel

Tôi nghĩ bạn phải sử dụng dấu gạch ngang.
AFA Med

1

Để kích hoạt nhật ký truy vấn trong MAC Machine:

Mở tệp sau:

vi /private/etc/my.cnf

Đặt url nhật ký truy vấn trong phần 'mysqld' như sau:

[mysqld]

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

Rất ít máy không đăng nhập đúng truy vấn, vì vậy, trường hợp đó bạn có thể kích hoạt nó từ bảng điều khiển MySQL

mysql> SET global general_log = 1;

1

Không chính xác một câu trả lời cho câu hỏi vì câu hỏi đã có câu trả lời tuyệt vời. Đây là một thông tin bên. Việc kích hoạt general_log thực sự giúp cải thiện hiệu suất của MySQL. Tôi đã general_log =1vô tình rời khỏi một máy chủ sản xuất và dành hàng giờ để tìm hiểu tại sao hiệu suất không thể so sánh với một thiết lập tương tự trên các máy chủ khác. Sau đó, tôi tìm thấy điều này giải thích tác động của việc kích hoạt nhật ký chung. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Ý chính của câu chuyện, không đưa general_log=1vào .cnftập tin. Thay vào đó sử dụng set global general_log =1trong một thời gian ngắn chỉ để đăng nhập đủ để tìm hiểu những gì bạn đang cố gắng tìm hiểu và sau đó tắt nó.


0

Trong phpMyAdmin 4.0, bạn vào Status> Monitor. Trong đó bạn có thể kích hoạt nhật ký truy vấn chậm và nhật ký chung, xem màn hình trực tiếp, chọn một phần của biểu đồ, xem các truy vấn liên quan và phân tích chúng.


0

Tôi đã phải bỏ và tạo lại nhật ký chung tại một điểm. Trong quá trình giải trí, các bộ ký tự bị rối và cuối cùng tôi đã gặp lỗi này trong nhật ký:

[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'

Vì vậy, nếu câu trả lời chuẩn của "kiểm tra để đảm bảo đăng nhập được bật" không phù hợp với bạn, hãy kiểm tra để đảm bảo các trường của bạn có bộ ký tự phù hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.