如何启用MySQL查询日志?


252

如何启用MySQL功能,该功能记录从客户端收到的每个SQL查询语句以及该查询语句提交的时间?我可以在phpmyadmin或NaviCat中做到吗?如何分析日志?

Answers:


301

首先,请记住,该日志文件在繁忙的服务器上可能会变得非常大。

对于mysql <5.1.29:

要启用查询日志,把这个/etc/my.cnf[mysqld]

log   = /path/to/query.log  #works for mysql < 5.1.29

另外,要从MySQL控制台启用它

SET general_log = 1;

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

对于MySQL 5.1.29+

在mysql 5.1.29+中,该log选项已被弃用。要指定日志文件并启用日志记录,请在my.cnf [mysqld]部分中使用此文件:

general_log_file = /path/to/query.log
general_log      = 1

或者,要从MySQL控制台打开日志记录(还必须以某种方式指定日志文件位置,或找到默认位置):

SET global general_log = 1;

还要注意,还有其他选项可以仅记录慢速查询或不使用索引的记录。


1
这在MySQL 5.6.19中不起作用。他们又改变了吗?
Alex R

5
general_log = on general_log_file = / path / to / query.log对我
有用

27
这对我SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
有用

确保对日志文件有mysql用户访问权限,否则在MySQL控制台中设置general_log参数时将返回“未找到”错误
Will

对于5.6.22,@ youen完全正确。谢谢!唯一要确保的是要写入的目录和文件存在并且可以被mysql写入。
NightOwlPrgmr

189

看看这个对另一个相关问题的答案。它显示了如何在不重新启动的情况下启用,禁用和查看活动服务器上的日志。

在mysql中记录所有查询


总结如下:

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

  • 创建您的日志表(请参阅答案

  • 在数据库上启用查询日志记录(请注意,字符串“ table”应原样放置,而不用任何表名替代。谢谢Nicholas Pickering

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

18
应该注意的是,“表”是按原样输入的,而不是用数据库中的表名代替。
Nicholas Pickering

1
在Mac OS X上,MySQL软件安装程序似乎已自动创建了CSV类型的general_log表。这意味着我也可以拖尾相应的CSV文件:sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth 2014年

设置之后,全局log_output ='table'; 是慢查询将写入文件?我认为在SET全局general_log = 0之后;你应该设置之前的“log_output的价值,它可能是“文件”
user2602807

59

当我想快速优化不同的页面加载时,我使用这种方法进行记录。这是一个小提示...

登录到表

SET global general_log = 1;
SET global log_output = 'table';

然后,您可以从我的mysql.general_log表中进行选择以检索最近的查询。

然后,我可以tail -f在mysql.log上执行类似的操作,但有更多改进...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

这样可以轻松查看我可以尝试减少的查询。我使用8秒间隔仅提取最近8秒内执行的查询。


57

这已经在注释中了,但是应该得到自己的答案:不编辑配置文件:在mysql中,以root身份执行

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

不要忘了之后将其关闭:

SET global general_log = off;

1
我发现在Linux systemd下,如果您尝试将文件登录到/tmp/,则它可能最终会像/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

您可以使用以下命令禁用或启用常规查询日志(记录所有查询)

SET GLOBAL general_log = 1 # (or 0 to disable)

就我而言,无法在共享托管服务器上启用常规查询日志。我只能启用慢速查询日志,并且系统管理员可以应要求提供与我的帐户相关的条目。
凤春亭

9

我还想启用MySQL日志文件以查看查询,并且已按照以下说明解决了该问题

  1. /etc/mysql/mysql.conf.d
  2. 打开mysqld.cnf

并启用以下行

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. 使用此命令重启MySQL /etc/init.d/mysql restart
  2. /var/log/mysql/查看日志

可以将这些设置保存在conf文件中,以便在每次启动MySQL时应用,但您无需重新启动MySQL即可应用此配置。您可以像其他人一样使用“ SET global”进行设置。
天使


3

在Windows上,您只需转到

C:\wamp\bin\mysql\mysql5.1.53\my.ini

将此行插入my.ini中

general_log_file = c:/wamp/logs/mysql_query_log.log

my.ini的文件终于看起来像这样

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

MySQL 5.6版本中有错误。甚至mysqld显示为:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Realy设置按以下顺序读取:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

检查文件:“ C:\ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini”

希望对别人有帮助。


是否在某个地方有关于此错误的错误报告?
mwfearnley

1

对于mysql> = 5.5仅适用于慢速查询(1秒或更长时间) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
这是不正确的-启用慢查询日志,而不是查询日志。
Sam Dufel 2014年

我认为您必须使用破折号。
AFA Med

1

要在MAC Machine中启用查询日志:

打开以下文件:

vi /private/etc/my.cnf

在“ mysqld”部分下设置查询日志URL,如下所示:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

很少有机器无法正确记录查询,因此您可以从MySQL控制台启用它

mysql> SET global general_log = 1;

1

不完全是问题的答案,因为该问题已经有了很好的答案。这是附加信息。启用general_log确实会降低MySQL性能。我general_log =1不小心离开了生产服务器,花了几个小时找出为什么性能无法与其他服务器上的类似设置相提并论。然后,我发现了这一点,它解释了启用常规日志的影响。http://www.fromdual.com/general_query_log_vs_mysql_performance

故事的要点,不要把general_log=1.cnf文件。而是使用set global general_log =1短暂的时间来记录足够的信息,以找出您要查找的内容,然后将其关闭。


0

在phpMyAdmin 4.0中,转到状态>监视器。您可以在其中启用慢速查询日志和常规日志,查看实时监控器,选择图形的一部分,查看相关查询并进行分析。


0

我不得不删除并重新创建一般日志。在重新创建过程中,字符集被弄乱了,我最终在日志中遇到了此错误:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

因此,如果“检查以确保登录已打开”的标准答案对您不起作用,请检查以确保您的字段具有正确的字符集。

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.