在mysql中记录所有查询


279

我可以在mysql数据库上打开审核日志记录吗?

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



为了给读者带来好处:不要错过阅读上面评论中的问题。
爪子

您可以在此处引用我的现有答案dba.stackexchange.com/a/62477/6037
Peter Venderberghe 2014年

Answers:


165

使用--log选项启动mysql:

mysqld --log=log_file_name

或在my.cnf文件中放置以下内容:

log = log_file_name

任何一种都将所有查询记录到log_file_name。

您还可以使用--log-slow-queries选项代替来仅记录慢速查询--log。默认情况下,花费10秒或更长时间的查询被认为是缓慢的,您可以通过设置long_query_time为在记录日志之前执行查询所必须花费的秒数来更改它。


61
不用说,但是在生产环境中保持打开状态很快就会变得很有趣。g
ceejayoz

6
如果您无法以这种方式启用日志记录,请双重检查mysql用户是否可以写入适当的文件位置。
乔恩·托珀

3
是否可以仅在1个partdb /表上记录查询?
铁木真

2
@Temujin phpmyadmin现在为表提供了“跟踪”选项,您可以在其中指定日志(“版本”),并且它将记录有关影响时间的查询,包括有关时间和整个查询的信息。
gadget00 2013年

3
应该删除或编辑此可接受的答案,以反映它不适用于MySQL 5.6。+的事实。
itoctopus

233

注意:对于mysql-5.6 +,它将无法使用。如果您向下滚动单击此处,则有一种解决方案适用于mysql-5.6 + 。)

如果您不希望或无法重新启动MySQL服务器,则可以在正在运行的服务器上进行以下操作:

  • mysql数据库上创建日志表
  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'
  • 在数据库上启用查询日志记录
SET global general_log = 1;
SET global log_output = 'table';
  • 查看日志
select * from mysql.general_log
  • 在数据库上禁用查询日志记录
SET global general_log = 0;

14
我不确定每个版本的MySQL是否都适用(我使用的是5.5),但我不必创建表。我遵循相同的建议,减去了创建表的注意事项,在这里提到了它:stackoverflow.com/a/678310/135101
Tyler Collier 2014年

@TylerCollier
Alexandre Marcondes

3
应该注意的是,CREATE TABLE命令(如果表不存在)应该在mysql数据库上执行,而不是在任何用户创建的数据库上执行。也许可以对SQL语句进行更新以反映这一点。
罗伯特·罗斯曼

2
对于查看日志SELECT * FROM mysql.general_log order by (event_time) desc会更好。:-)
vinrav 2015年

不同意注释 -服务器版本5.6.37完全可以正常工作。谢谢。
德米特里·奥尔霍夫斯基

215

除了我在这里遇到的问题之外,运行以下命令是将查询转储到日志文件而无需重新启动的最简单方法

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

可以用关闭

SET global general_log = 0;

6
绝对喜欢这个,适用于现有的和在DB新的连接
卡尔顿

1
有一些统计信息条目-不确定它们是什么,否则,效果很好。
Snowcrash 2015年

为此,您的用户必须具有SUPER特权,该特权是全局DB特权,因此不能仅限于特定的模式或表:GRANT SUPER ON *.* TO user1@localhost
RobM,

如果可以的话,我将不止一次投票,我在这里有一个书签:)非常感谢!
resi

124

最佳答案在mysql 5.6+中不起作用。使用此代替:

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

在您的my.cnf / my.ini文件中

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。


如果您使用过它,能否告诉我以上内容对性能的影响,以这种方式启用日志记录是否明智?
拉梅什·帕里克

1
Ramesh对性能的影响似乎降低了5-15%。这里更多信息percona.com/blog/2009/02/10/...
Firze

1
我不明白为什么Mysql 5.6不允许从查询中设置日志文件?当您无权访问服务器目录树时,如何在MySQL 5.6和更高版本中记录所有查询phpMyAdmin
Vicky Dev

这些更改后,请从xampp控制面板重新启动mysql服务。
Paramjeet

这在我的本地Xampp Apache环境中对我有用,但是我仍然必须通过phpMyAdmin打开登录。另外,它无法在/ usr / log文件夹中找到该文件,也无法创建该文件,但效果很好general_log_file=filename.log
JoeP

36

启用表的日志

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

通过选择查询查看日志

select * from mysql.general_log

是否有通配符记录所有表?(有很多:C)
RicardoE

谢谢,此设置对我非常有用,因为我无法删除mysql服务器。我也希望该日志显示在日志表中
Gunnar Sigfusson,

14

快速启用MySQL常规查询日志而无需重新启动的方法。

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包装器针对osx10.11(x86_64)



5

您应该意识到,mysql登录确实会影响性能,但这是明智的选择。

我通常将其保留在开发服务器上(除非它使我们疯狂:)


2

OS / 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

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

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

结果:

$ 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.