如何启用MySQL查询日志?

如何启用logging从客户端收到的每个SQL查询语句的MySQL函数以及查询语句提交的时间? 我可以做到这一点在phpmyadmin或NaviCat? 我如何分析日志?

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

对于mysql <5.1.29:

要启用查询日志,请将其放在[mysqld]部分的/etc/my.cnf

 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选项已被弃用。 要指定日志文件并启用日志logging,请在my.cnf中的[mysqld]部分中使用:

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

另外,要打开来自MySQL控制台的日志logging(还必须以某种方式指定日志文件位置,或find默认位置):

 SET global general_log = 1; 

另请注意,还有其他选项可以只logging慢速查询,或者不使用索引的查询。

看看这个答案,以另一个相关的问题。 它显示如何启用,禁用和查看活动服务器上的日志,而无需重新启动。

在mysql中logging所有查询


这里是一个总结:

如果你不想或者不能重启MySQL服务器,你可以在运行的服务器上这样做:

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

  • 在数据库上启用查询日志logging(注意string“table”应该放在字面上,而不是被任何表名所替代)谢谢Nicholas Pickering )

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

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

logging到一个表

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

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

然后,我可以在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" 

这可以很容易地看到我可以尝试减less的查询。 我使用8秒的时间间隔来获取最近8秒内执行的查询。

您可以禁用或启用通用查询日志(logging所有查询)

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

这已经在一个评论,但值得自己的答案:在MySQL中,作为根,做

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

之后不要忘记closures它。

在MySQL 5.6版本中有bug。 即使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”

希望它能帮助别人。

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

我也想启用mysql日志文件来查看查询,我用下面的说明解决了这个问题

1 – 转到/etc/mysql/mysql.conf.d
2 – 打开mysqld.cnf
并启用下面的行

general_log_file = /var/log/mysql/mysql.log
general_log = 1

3 – 用这个命令/etc/init.d/mysql restart重新启动mysql
4 – 去/ var / log / mysql /并检查日志

对于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 

在MAC机器中启用查询日志:

打开以下文件:

 vi /private/etc/my.cnf 

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

 [mysqld] general_log_file=/Users/kumanan/Documents/mysql_query.log 

很less机器没有正确logging查询,所以这种情况下,你可以从MySQL控制台启用它

 mysql> SET global general_log = 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短暂的时间只是足够的logging,找出你想找出什么,然后把它关掉。

在phpMyAdmin 4.0,你去状态>监视器。 在那里,您可以启用慢查询日志和通用日志,查看实时监控器,select图的一部分,查看相关查询并分析它们。

我不得不一次性地删除和重新创build通用日志。 在娱乐期间,字符集搞砸了,我最终在日志中出现这个错误:

[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'

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