关于日志记录:在mysql中记录所有查询

Log all queries in mysql

我是否可以打开mysql数据库上的审计日志记录?

我基本上想监视所有查询一个小时,然后将日志转储到一个文件中。


(注:对于mysql-5.6+来说,这是行不通的。如果向下滚动或单击此处,有一个适用于MySQL-5.6+的解决方案。)

如果不想或无法重新启动MySQL服务器,可以在运行中的服务器上执行以下操作:

  • mysql数据库上创建日志表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  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'
1
2
3
4
5
6
7
8
9
  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'

  • 在数据库上启用查询日志记录
1
2
SET global general_log = 1;
SET global log_output = 'table';
  • 查看日志
1
select * from mysql.general_log

  • 禁用数据库上的查询日志记录
1
SET global general_log = 0;


除了我在这里看到的,运行以下命令是将查询转储到日志文件而不重新启动的最简单方法

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

可以用关闭

1
SET global general_log = 0;


使用--log选项启动mysql:

1
mysqld --log=log_file_name

或者将以下内容放入您的my.cnf文件中:

1
log = log_file_name

其中一个将记录所有查询以记录文件名。

也可以使用--log-slow-queries选项而不是--log选项只记录慢速查询。默认情况下,需要10秒或更长时间的查询被认为是缓慢的,您可以通过将long_query_time设置为记录查询之前必须执行的秒数来更改此设置。


在MySQL5.6+中,最佳答案不起作用。改为使用:

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

在my.cnf/my.ini文件中

ubuntu/debian:/etc/mysql/my.cnf版windows:c:programdatamysqlmysql服务器5.xwamp:c:wampinmysqlmysqlx.y.zmy.inixampp:c:xamppmysqlinmy.ini。


为表启用日志

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

按选择查询查看日志

1
select * from mysql.general_log


快速启用MySQL常规查询日志而不重新启动。

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

我已经通过自制安装了mysql,mysql版本:mysql ver 14.14 distrib 5.7.15,用于使用editline wrapper的osx10.11(x86_64)


关于记录,5.1.6中介绍了通用日志和慢日志:

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

5.2.1. Selecting General Query and Slow Query Log Output Destinations

As of MySQL 5.1.6, MySQL Server provides flexible control over the
destination of output to the general query log and the slow query log,
if those logs are enabled. Possible destinations for log entries are
log files or the the general_log and slow_log tables in the mysql
database


您应该知道,登录MySQL确实会影响性能,但这可能是一个明智的做法。

我通常把它放在dev服务器上(除非它把我们逼疯了:)


如果使用的是AWS RDS MySQL,请在这里逐步指导。

当设置为"文件"输出时,您可以直接从AWS RDS"日志"控制台查看日志。

aws-rds-mysql日志


OS/MySQL版本:

1
2
3
4
5
$ 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

添加日志记录(例如,我不认为/var/log/...是Mac OS上的最佳路径,但它起作用:

1
2
3
4
5
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

重新启动MySQL

结果:

1
2
3
4
5
6
7
8
9
10
$ 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