2008-11-20 56 views
209

Tôi có thể bật tính năng ghi nhật ký kiểm tra trên cơ sở dữ liệu mysql của mình không?Đăng nhập tất cả các truy vấn trong mysql

Tôi về cơ bản muốn giám sát tất cả các truy vấn trong một giờ và đổ nhật ký vào một tệp.

+8

Câu hỏi trùng lặp http://stackoverflow.com/q/650238/684229 – TMS

+0

Đối với độc giả lợi ích: Đừng bỏ lỡ để đọc câu hỏi trong bình luận ở trên. – claws

+0

Bạn có thể tham khảo câu trả lời hiện có của tôi được đăng tại đây http://dba.stackexchange.com/a/62477/6037 –

Trả lời

140

Bắt đầu mysql với các tùy chọn --log:

mysqld --log=log_file_name 

hoặc đặt dòng sau vào tập tin my.cnf của bạn:

log = log_file_name 

Hoặc ai sẽ ghi lại tất cả các truy vấn để log_file_name.

Bạn cũng có thể chỉ ghi lại các truy vấn chậm bằng cách sử dụng tùy chọn --log-slow-queries thay vì --log. Theo mặc định, các truy vấn mất 10 giây trở lên được coi là chậm, bạn có thể thay đổi điều này bằng cách đặt long_query_time thành số giây mà truy vấn phải thực hiện trước khi được ghi nhật ký.

+0

+1 vì không biết điều đó. Đã sử dụng trình kích hoạt được sử dụng thay thế. –

+37

Nó sẽ đi mà không nói, nhưng để lại điều này bật trong một hộp sản xuất gió lên là không giải trí rất nhanh chóng. * g * – ceejayoz

+3

Nếu bạn gặp sự cố khi bật đăng nhập theo cách này, hãy kiểm tra kỹ xem người dùng mysql có thể ghi vào vị trí tệp thích hợp không. –

4

Bạn nên lưu ý rằng việc ghi nhật ký mysql thực sự tác động đến hiệu suất, nhưng nó có thể là một điều khôn ngoan để thực hiện.

tôi thường để lại nó trên trên máy chủ dev (trừ khi nó khiến chúng tôi điên :))

193

(Note: Đối với mysql-5.6 + này sẽ không hoạt Có một giải pháp áp dụng cho mysql. -5.6+ nếu bạn scroll down hay click here)

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 bạn:.

  • Tạo bảng đăng nhập của bạn trên.210 cơ sở dữ liệu
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' 
  • Enable Query đăng nhập vào cơ sở dữ liệu
SET global general_log = 1; 
SET global log_output = 'table'; 
  • Xem nhật ký
select * from mysql.general_log 
  • Disable Query khai thác gỗ trên cơ sở dữ liệu
SET global general_log = 0; 
+11

Tôi không chắc chắn nếu điều này là đúng cho mỗi phiên bản của MySQL (tôi đang trên 5,5), nhưng tôi không phải tạo ra các bảng. Tôi theo cùng một lời khuyên trừ khi tạo ra các bảng, được đề cập ở đây: http://stackoverflow.com/a/678310/135101 –

+0

Có thể nó đã được tạo ra vì một lý do nào đó, @TylerCollier –

+2

Cần lưu ý rằng ' Lệnh CREATE TABLE' (nếu các bảng không tồn tại) được thực hiện trên cơ sở dữ liệu 'mysql', không phải trên bất kỳ cơ sở dữ liệu do người dùng tạo nào. Có lẽ các câu lệnh SQL có thể được cập nhật để phản ánh điều đó. –

6

Đối với hồ sơ, general_log và slow_log đã được giới thiệu trong 5.1.6:

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

5.2.1. Chọn Truy vấn chung và Điểm đến đầu ra của truy vấn chậm

Kể từ MySQL 5.1.6, Máy chủ MySQL cung cấp khả năng kiểm soát linh hoạt trên điểm đến của đầu ra vào nhật ký truy vấn chung và nhật ký truy vấn chậm, nếu các nhật ký đó được bật. Có thể đến cho các entry bản ghi là file log hoặc các bảng general_log và slow_log trong mysql cơ sở dữ liệu

146

Bên cạnh những gì tôi đã xem qua ở đây, chạy sau đây là cách đơn giản nhất để đổ truy vấn vào một tập tin bản ghi mà không cần khởi động lại

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

có thể được tắt với

SET global general_log = 0; 
+3

Hoàn toàn thích điều này, hoạt động cho các kết nối hiện có và mới trên DB – Carlton

+1

Có một số mục thống kê - không chắc chắn những gì đang có nhưng, nếu không, hoạt động thực sự tốt. – Snowcrash

84

Lên trên câu trả lời không làm việc trong mysql 5.6+. Sử dụng điều này thay vì:

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

trong my.cnf/file my.ini bạn

Ubuntu/Debian: /etc/mysql/my.cnf
của Windows: c: \ ProgramData \ MySQL \ MySQL server 5.x
wamp: c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp: c: \ xampp \ mysql \ bin \ my.ini.

+0

Nếu bạn đã sử dụng nó, bạn có thể cho tôi biết tác động hiệu suất của các bên trên, và nó sẽ là khôn ngoan để cho phép đăng nhập theo cách này? –

+0

Tác động hiệu suất của Ramesh dường như giảm khoảng 5-15% hiệu suất. Thông tin thêm tại đây https://www.percona.com/blog/2009/02/10/impact-of-logging-on-mysql%E2%80%99s-performance/ – Firze

+0

Tôi không hiểu tại sao Mysql 5.6 không ' t cho phép đặt tệp nhật ký từ truy vấn? Làm thế nào để đăng nhập tất cả các truy vấn trong MySQL 5.6 và sau này khi bạn không có quyền truy cập vào cây thư mục máy chủ nhưng chỉ 'phpMyAdmin'? –

9

Cách nhanh để bật Nhật ký truy vấn chung của MySQL mà không cần khởi động lại.

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

Tôi đã cài đặt mysql qua homebrew, phiên bản mysql: mysql Ver 14,14 distrib 5.7.15, cho osx10.11 (x86_64) sử dụng EditLine bao bọc

1

Trong trường hợp sử dụng AWS RDS MYSQL, từng hướng dẫn từng bước tại đây.

Khi được đặt làm đầu ra 'tệp', bạn có thể xem nhật ký trực tiếp từ Bảng điều khiển "Đăng nhập" AWS RDS.

AWS RDS MYSQL Logging

17

Kích hoạt tính năng đăng nhập cho bảng

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

Xem nhật ký bằng cách chọn truy vấn

select * from mysql.general_log 
+0

có ký tự đại diện để đăng nhập tất cả các bảng không? (có khá nhiều: C) – RicardoE

Các vấn đề liên quan