如何启用MySQL功能,记录来自客户端的每个SQL查询语句和提交该查询语句的时间? 我可以在phpmyadmin或NaviCat中实现吗? 如何分析日志?
首先,请记住在繁忙的服务器上,此日志文件可能会变得非常大。
对于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;
还请注意,有额外的选项可以仅记录慢查询或那些没有使用索引的查询。
看一下这个与之相关的问题的答案。它展示了如何在不重新启动服务器的情况下启用、禁用和查看实时服务器上的日志。
以下是摘要:
如果您不想或不能重新启动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
这已经在评论中提到过,但值得单独回答: 在不编辑配置文件的情况下,在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;
/tmp/
文件中,它可能会最终出现在类似于/tmp/systemd-private-...-mariadb.service-.../tmp/
的地方。 - mwfearnley当我想要快速优化不同页面的加载时,我使用这种记录日志方法。它是一个小技巧...
记录到表中
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秒内执行的查询。
您可以使用以下命令来禁用或启用通用查询日志(记录所有查询):
SET GLOBAL general_log = 1 # (or 0 to disable)
// 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;
我还想启用MySQL日志文件以查看查询,以下是我的解决方法:
/etc/mysql/mysql.conf.d
并启用以下行:
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
重启MySQL/var/log/mysql/
目录,检查日志记录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
...
...
...
...
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"
希望它能帮助到某些人。
[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
- youenSET GLOBAL general_log = 1; SET GLOBAL general_log_file='/var/log/mysql/mysql.log';
在8.0.27
中有效。似乎general_log_file
是必须的。 - Artfaith