如何启用MySQL查询日志?

Fen*_*ing 240 mysql logging

如何启用MySQL函数来记录从客户端收到的每个SQL查询语句以及查询语句提交的时间?我可以在phpmyadmin或NaviCat中执行此操作吗?我如何分析日志?

Gry*_*ius 291

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

对于mysql <5.1.29:

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

log   = /path/to/query.log  #works for mysql < 5.1.29
Run Code Online (Sandbox Code Playgroud)

另外,从MySQL控制台启用它

SET general_log = 1;
Run Code Online (Sandbox Code Playgroud)

请参阅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
Run Code Online (Sandbox Code Playgroud)

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

SET global general_log = 1;
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用(Windows上的MySQL 5.6.12):`SET global general_log_file ='c:/Temp/mysql.log';``SET global general_log = on;``SET global log_output ='file';` (25认同)
  • general_log = on general_log_file =/path/to/query.log为我工作 (5认同)
  • `设置全局 General_log = 1; SET GLOBAL General_log_file='/var/log/mysql/mysql.log';` 适用于 `8.0.27`。看来“general_log_file”是强制性的。 (2认同)

Ale*_*des 177

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

在mysql中记录所有查询


以下是摘要:

如果您不想或无法重新启动MySQL服务器,可以在运行的服务器上继续这样操作:

  • 创建日志表(参见答案)

  • 启用数据库上的查询日志记录(请注意,字符串'table'应按字面意思放置,而不是由任何表名替换.感谢Nicholas Pickering)

SET global general_log = 1;
SET global log_output = 'table';
Run Code Online (Sandbox Code Playgroud)
  • 查看日志
select * from mysql.general_log;
Run Code Online (Sandbox Code Playgroud)
  • 禁用数据库的查询日志记录
SET global general_log = 0;
Run Code Online (Sandbox Code Playgroud)

  • 应注意,'table'应按字面输入,而不是用数据库中的表名替换. (17认同)

Lay*_*yke 59

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

记录到TABLE

SET global general_log = 1;
SET global log_output = 'table';
Run Code Online (Sandbox Code Playgroud)

然后,您可以从我的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"
Run Code Online (Sandbox Code Playgroud)

这样可以很容易地查看我可以尝试并减少的查询.我使用8秒间隔来仅获取在最后8秒内执行的查询.


com*_*ike 50

这已经在评论中,但值得回答:没有编辑配置文件:在mysql中,以root身份执行

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;
Run Code Online (Sandbox Code Playgroud)

不要忘记事后关掉它.

  • 我发现在 Linux systemd 下,如果您尝试将文件登录到 `/tmp/`,它可能最终会出现在 `/tmp/systemd-private-...-mariadb.service-... /tmp/` (2认同)
  • 嗨伙计!我又来了:D。我很高兴您提供了这个答案! (2认同)
  • @resi哈哈,我发现自己也在谷歌搜索自己的答案:-D (2认同)

Jon*_*Jon 14

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

SET GLOBAL general_log = 1 # (or 0 to disable)
Run Code Online (Sandbox Code Playgroud)


小智 9

我还想启用MySQL日志文件来查看查询,我已通过以下说明解决了这个问题

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

并启用以下行

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
Run Code Online (Sandbox Code Playgroud)
  1. 使用此命令重启MySQL /etc/init.d/mysql restart
  2. /var/log/mysql/检查日志


小智 5

// 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; 
Run Code Online (Sandbox Code Playgroud)