如何启用MySQL查询日志?

313

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

16个回答

343

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

对于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选项已弃用。若要指定日志文件并启用日志记录,请在[mysqld]部分的my.cnf中使用以下方法:

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 这些配置对我有用。 - Kiren S
41
这对我很有用(在Windows上使用MySQL 5.6.12): SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file'; - youen
确保MySQL用户对日志文件具有访问权限,否则在MySQL控制台中设置general_log参数时会返回“未找到”错误。 - Will R.
2
SET GLOBAL general_log = 1; SET GLOBAL general_log_file='/var/log/mysql/mysql.log';8.0.27 中有效。似乎 general_log_file 是必须的。 - Artfaith
显示剩余2条评论

237

看一下这个与之相关的问题的答案。它展示了如何在不重新启动服务器的情况下启用、禁用和查看实时服务器上的日志。

记录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;
  • 清除查询日志而不禁用
TRUNCATE mysql.general_log

27
需要注意的是,“table”应该按照字面意思输入,而不是用你的数据库中的表名代替它。 - Nick Pickering
1
在Mac OS X上,MySQL软件安装程序似乎已自动创建了类型为CSV的general_log表。这意味着我也可以tail相应的CSV文件:sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV。 - Jay Sheth
在设置全局变量log_output = 'table'之后,慢查询会写入文件吗?我认为在设置全局变量general_log = 0之后,您应该将先前的'log_output'值设置回'FILE'。 - user2602807

95

这已经在评论中提到过,但值得单独回答: 在不编辑配置文件的情况下,在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;

2
我发现在Linux systemd下,如果你尝试将日志记录到/tmp/文件中,它可能会最终出现在类似于/tmp/systemd-private-...-mariadb.service-.../tmp/的地方。 - mwfearnley
@commonpike:如果可以的话,我会更经常点赞这个回答……我发现自己每个月都要谷歌一次你的答案 :) - resi
1
只是让你知道,我又回来了 :) - resi
2
嗨,伙计!我又来了:D。你提供这个答案让我非常高兴! - resi
2
@resi 哈哈,我发现自己也会谷歌搜索自己的答案 :-D - commonpike
@commonpike 我也是,这个联系将会很难打破 ;) 尽管我显然在你的答案和链接的答案之间切换。希望你不介意!https://dev59.com/FXVC5IYBdhLWcg3wZwXj#20485975 - resi

62

当我想要快速优化不同页面的加载时,我使用这种记录日志方法。它是一个小技巧...

记录到表中

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

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

然后我可以类似于对mysql.log执行tail -f,但带有更多的细化处理...

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秒内执行的查询。


15

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

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

在我的情况下,共享主机服务器上无法启用常规查询日志。我只能启用慢查询日志,并且系统管理员可以根据请求提供与我的帐户相关的条目。 - Feng-Chun Ting

14
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 

10

我还想启用MySQL日志文件以查看查询,以下是我的解决方法:

  1. 进入/etc/mysql/mysql.conf.d
  2. 打开mysqld.cnf文件

并启用以下行:

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. 使用命令/etc/init.d/mysql restart重启MySQL
  2. 前往/var/log/mysql/目录,检查日志记录

把这些设置保存在conf文件中,以便每次启动MySQL时应用它们是没问题的,但你不需要重新启动MySQL来应用此配置。你可以使用“SET全局”来设置它,就像其他人所说的那样。 - Angel

4
在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 

实际的设置按以下顺序进行读取:

    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"

希望它能帮助到某些人。


这个 bug 是否有任何错误报告呢? - mwfearnley

2
仅适用于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
我认为你必须使用破折号。 - AFA Med

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接