Làm thế nào để hiển thị các truy vấn cuối cùng được thực hiện trên MySQL?


471

Có bất kỳ truy vấn / cách để hiển thị các truy vấn cuối cùng được thực hiện trên TẤT CẢ các máy chủ không?

Câu trả lời:


793

Đối với những người may mắn có MySQL> = 5.1.12, bạn có thể kiểm soát tùy chọn này trên toàn cầu khi chạy:

  1. Hành hình SET GLOBAL log_output = 'TABLE';
  2. Hành hình SET GLOBAL general_log = 'ON';
  3. Hãy nhìn vào bảng mysql.general_log

Nếu bạn muốn xuất ra một tệp thay vì bảng:

  1. SET GLOBAL log_output = "FILE"; mặc định .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Tôi thích phương pháp này để chỉnh sửa các tệp .cnf vì:

  1. bạn không chỉnh sửa my.cnf tệp và có khả năng bật đăng nhập vĩnh viễn
  2. bạn không câu cá xung quanh hệ thống tập tin đang tìm kiếm nhật ký truy vấn - hoặc thậm chí tệ hơn, bị phân tâm bởi nhu cầu về đích hoàn hảo. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Bạn không phải khởi động lại máy chủ và làm gián đoạn mọi kết nối hiện tại với nó.
  4. khởi động lại máy chủ sẽ đưa bạn đến nơi bạn bắt đầu (đăng nhập theo mặc định vẫn tắt)

Để biết thêm thông tin, hãy xem Hướng dẫn tham khảo MySQL 5.1 - Biến hệ thống máy chủ - general_log


4
Thiết kế giao diện người dùng tuyệt vời. Dù sao, các bảng nhật ký MySQL thực sự đang sử dụng công cụ CSV để bạn có thể thực hiện tất cả những gì FlipMcF đã nói trong câu trả lời về việc cho phép đăng nhập vào bảng general_log và có đuôi -f của general_log như thế này: tail -f / var / lib / mysql / mysql / general_log.CSV

2
chết tiệt, tài liệu mysql cho điều này thậm chí không bắn tham số bảng. cảm ơn rất nhiều.
Abhishek Dujari


6
nhớ xóa bảng nhật ký chung của bạn khi bạn kết thúc: "cắt ngắn bảng mysql.general_log"
pdwalker

1
Tôi đã nhận được kết quả theo cách này, nhưng các tham số được trình bày bằng dấu chấm hỏi, ví dụ: chọn foo từ thanh trong đó x =?. Làm thế nào tôi có thể nhận được truy vấn đầy đủ?
okwap

43

Bạn có thể kích hoạt nhật ký truy vấn chung cho loại chẩn đoán đó. Nói chung, bạn không đăng nhập tất cả các truy vấn CHỌN trên máy chủ sản xuất, đó là một kẻ giết người hiệu suất.

Chỉnh sửa cấu hình MySQL của bạn, ví dụ /etc/mysql/my.cnf - tìm kiếm hoặc thêm một dòng như thế này

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

Khởi động lại mysql để nhận thay đổi đó, bây giờ bạn có thể

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

Xin chào, bạn có thể xem các truy vấn khi chúng đến.


4
general_log_file và general_log trong my.cnf của tôi
Martin Thoma

Điều này đang hoạt động nếu bạn muốn biết khởi động lại mysql Askubfox.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar

1
Các phiên bản mới hơn của Mac OS X (ít nhất là trên Mac OS X) yêu cầu các tùy chọn general_log_file và general_log thay vì chỉ "log =". Mặt khác, bạn gặp một lỗi như thế này: ERROR / usr / local / mysql / bin / mysqld: tùy chọn mơ hồ '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth

@JaySheth, tôi đã gặp lỗi đó trên Mariadb 10.2, vì vậy tôi không chắc Mac OS chỉ liên quan.
dùng10089632

16

Bạn có thể làm điều lưu chuyển để theo dõi nhật ký truy vấn mysql.

Mở tập tin cấu hình mysql my.cnf

sudo nano /etc/mysql/my.cnf

Tìm kiếm các dòng dưới [mysqld]tiêu đề và bỏ ghi chú những dòng này để kích hoạt nhật ký

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

Khởi động lại máy chủ mysql của bạn để phản ánh các thay đổi

sudo service mysql start

Theo dõi nhật ký máy chủ mysql bằng lệnh sau trong terminal

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

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

9

1) Nếu ghi nhật ký mysql chung được bật thì chúng ta có thể kiểm tra các truy vấn trong tệp nhật ký hoặc bảng dựa trên những gì chúng ta đã đề cập trong cấu hình. Kiểm tra những gì được kích hoạt bằng lệnh sau

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

Nếu chúng ta cần lịch sử truy vấn trong bảng thì

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

Hãy nhìn vào bảng mysql.general_log

Nếu bạn muốn xuất ra một tệp:

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) Chúng tôi cũng có thể kiểm tra các truy vấn trong tệp .mysql_history cat ~ / .mysql_history



4

Nếu myslog binlog được bật, bạn có thể kiểm tra các lệnh được chạy bởi người dùng bằng cách thực hiện lệnh sau trong bảng điều khiển linux bằng cách duyệt đến thư mục myslog binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

cho phép

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

hoặc nhật ký chung sẽ có ảnh hưởng đến hiệu suất của mysql


có thể, nhưng đau đớn. hữu ích hơn nếu bạn đang muốn xem những gì đã xảy ra trong quá khứ.
pdwalker


2

Sau khi đọc câu trả lời của Paul, tôi tiếp tục đào để biết thêm thông tin về https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Tôi tìm thấy một mã thực sự hữu ích bởi một người. Đây là tóm tắt của bối cảnh.

(Lưu ý: Đoạn mã sau không phải của tôi)

Kịch bản này là một ví dụ để giữ cho bảng sạch sẽ giúp bạn giảm kích thước bảng. Như sau một ngày, sẽ có khoảng 180k truy vấn đăng nhập. (trong một tệp, nó sẽ là 30 MB mỗi ngày)

Bạn cần thêm một cột bổ sung (event_unix) và sau đó bạn có thể sử dụng tập lệnh này để giữ nhật ký sạch sẽ ... nó sẽ cập nhật dấu thời gian thành dấu thời gian Unix, xóa nhật ký cũ hơn 1 ngày và sau đó cập nhật event_time vào Dấu thời gian từ event_unix ... nghe có vẻ hơi khó hiểu, nhưng nó hoạt động rất tốt.

Các lệnh cho cột mới:

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

Kịch bản dọn dẹp:

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

Tín dụng cho Sebastian Kaiser (tác giả gốc của mã).

Hy vọng ai đó sẽ tìm thấy nó hữu ích như tôi đã làm.


Hấp dẫn. Bạn sẽ bỏ lỡ các truy vấn trong quá trình dọn dẹp trừ khi bạn khóa tất cả các db trước. Có những vấn đề khác có thể phát sinh ở đây. Nếu chúng ta đang ở thời điểm ghi nhật ký 'liên tục', tôi sẽ sử dụng ghi nhật ký tệp hoặc nhật ký bin và công cụ quay vòng nhật ký.
FlipMcF

1

Bạn có thể xem những điều sau đây trong linux

cd /root

ls -al

vi .mysql_history Nó có thể giúp


6
Điều này có vẻ như nó sẽ chỉ hoạt động cho máy khách mysql dòng lệnh chính thức và chỉ cho các truy vấn được thực thi bởi người dùng root
golimar

Câu hỏi cho biết 'tất cả các máy chủ' làm cho câu trả lời này không chính xác. Điều này sẽ hiển thị tất cả các truy vấn được thực hiện bởi một khách hàng.
FlipMcF

Nếu myslog binlog được bật, bạn có thể kiểm tra các lệnh được chạy bởi người dùng bằng cách thực hiện lệnh sau trong bảng điều khiển linux bằng cách duyệt đến thư mục mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql cho phép [mysqld] log = / var / log / mysql / mysql.log hoặc nhật ký genral sẽ có ảnh hưởng đến hiệu suất của mysql
Avinash Singh

Một số mục trong này bị chặn theo mặc định, dù sao, chuỗi chứa "mật khẩu" chẳng hạn.
mckenzm
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.