如何启用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已打开”的标准答案不适用于您,请检查以确保您的字段具有正确的字符集。