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


279

Tôi có thể bật đăng nhập kiểm toán trên cơ sở dữ liệu mysql của mình không?

Về cơ bản tôi muốn theo dõi tất cả các truy vấn trong một giờ và kết xuất nhật ký vào một tệp.


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

Đối với độc giả lợi ích: Đừng bỏ lỡ để đọc câu hỏi trong nhận xét trên.
móng vuốt

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

Câu trả lời:


165

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

mysqld --log=log_file_name

hoặc đặt các mục sau trong my.cnftệp của bạn :

log = log_file_name

Một trong hai sẽ đăng nhập tất cả các truy vấn vào log_file_name.

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


61
Nó nên đi mà không nói, nhưng để điều này bật trong một hộp sản xuất kết thúc là không giải trí rất nhanh. g
ceejayoz

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

3
Có thể đăng nhập truy vấn trên 1 particuarl db / bảng không?
Temujin

2
@Temujin phpmyadmin hiện có tùy chọn 'theo dõi' cho các bảng nơi bạn chỉ định nhật ký ('phiên bản') và nó sẽ ghi lại các truy vấn ảnh hưởng đến thông tin về thời gian và toàn bộ truy vấn.
gad00

3
Câu trả lời được chấp nhận này nên được xóa hoặc chỉnh sửa để phản ánh thực tế rằng nó không hoạt động với MySQL 5.6. +.
itoctopus

233

( Lưu ý : Đối với mysql-5.6 +, điều này sẽ không hoạt động. Có một giải pháp áp dụng cho mysql-5.6 + nếu bạn cuộn xuống hoặc nhấp vào đây .)

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 trên mysqlcơ 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'
  • Cho phép ghi nhật ký truy vấn trên cơ sở dữ liệu
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;

14
Tôi không chắc liệu điều này có đúng với mọi phiên bản của MySQL không (tôi trên 5.5), nhưng tôi không phải tạo các bảng. Tôi đã làm theo lời khuyên tương tự trừ việc tạo các bảng, được đề cập ở đây: stackoverflow.com/a/678310/135101
Tyler Collier

Có lẽ nó đã được tạo ra vì một hoặc lý do khác, @TylerCollier
Alexandre Marcondes

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

2
Để xem nhật ký SELECT * FROM mysql.general_log order by (event_time) descsẽ làm tốt hơn. chỉ cần nói. :-)
vinrav 8/12/2015

Không đồng ý với lưu ý - với phiên bản máy chủ 5.6.37 hoạt động hoàn toàn chính xác. Cảm ơn.
Dmitriy Olhovsky

215

Bên cạnh những gì tôi đã gặp ở đây, chạy sau đây là cách đơn giản nhất để kết xuất truy vấn vào tệp nhật ký 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;

6
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 đó là mục nào, nhưng, nếu không, hoạt động thực sự tốt.
Snowcrash

Để làm việc này, người dùng của bạn phải có đặc quyền SUPER là đặc quyền DB toàn cầu và do đó không thể giới hạn ở các lược đồ hoặc bảng cụ thể:GRANT SUPER ON *.* TO user1@localhost
RobM

Tôi sẽ nâng cao hơn một lần nếu tôi có thể, tôi có một dấu trang trỏ vào đây :) Cảm ơn rất nhiều!
resi

124

Câu trả lời hàng đầu không hoạt động trong mysql 5.6+. Sử dụng cái này thay thế:

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

trong tập tin my.cnf / my.ini của bạn

Ubuntu / Debian : /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.


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 những điều trên không, và liệu có nên cho phép đăng nhập theo cách này không?
Ramesh Pareek

1
Tác động hiệu suất của Ramesh dường như giảm khoảng 5-15% hiệu suất. Thêm thông tin tại đây percona.com/blog/2009/02/10/ trên
Firze

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

khởi động lại dịch vụ mysql từ bảng điều khiển xampp sau những thay đổi này.
Paramjeet

Điều này làm việc cho tôi trong môi trường Xampp Apache cục bộ của tôi, nhưng tôi vẫn phải bật đăng nhập thông qua phpMyAdmin. Ngoài ra, nó không thể định vị tệp trong thư mục / usr / log, cũng như không tạo tệp, nhưng nó hoạt động tốt nhưgeneral_log_file=filename.log
JoeP

36

Kích hoạt nhật ký 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

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

Cảm ơn, cài đặt này rất hữu ích cho tôi vì tôi không thể gỡ xuống máy chủ mysql. Tôi cũng muốn nhật ký xuất hiện trong bảng nhật ký
Gunnar Sigfusson

14

Cách nhanh chóng để kích hoạ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 thông qua homebrew, phiên bản mysql: mysql Ver 14,14 Phân phối 5.7.15, cho osx10.11 (x86_64) bằng cách sử dụng trình bao bọc EditLine


6

Đối với bản ghi, general_log và Slow_log đã được giới thiệu trong 5.1.6:

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

5.2.1. Chọn Truy vấn chung và Truy vấn Nhật ký 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 đối với đích đầu ra của 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ác đích có thể cho các mục nhật ký là các tệp nhật ký hoặc các bảng general_log và Slow_log trong cơ sở dữ liệu mysql


5

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

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


2

Phiên bản hệ điều hành / 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

Thêm ghi nhật ký (ví dụ, tôi không nghĩ /var/log/...là đường dẫn tốt nhất trên Mac OS nhưng nó đã hoạt động:

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

Đã khởi động lại Mysql

Kết quả:

$ 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

1

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

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

Ghi nhật ký MYSQL AWS RDS

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.