如何启用 MySQL 查询日志?
Posted
技术标签:
【中文标题】如何启用 MySQL 查询日志?【英文标题】:How to enable MySQL Query Log? 【发布时间】:2011-09-22 16:10:54 【问题描述】:如何启用记录从客户端收到的每个 SQL 查询语句以及该查询语句提交时间的 mysql 功能? 我可以在 phpmyadmin 或 NaviCat 中这样做吗? 如何分析日志?
【问题讨论】:
【参考方案1】:我的操作系统 Win10、MySQL 服务器版本 - 5.7
my.ini 的路径
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
只需添加到 my.ini 文件中
general_log_file = C:/ProgramData/MySQL/MySQL Server 5.7/mysql.log
general_log = 1
【讨论】:
【参考方案2】:查看另一个相关问题的答案。它展示了如何在不重新启动的情况下启用、禁用和查看实时服务器上的日志。
Log all queries in mysql
总结如下:
如果您不想或无法重新启动 MySQL 服务器,您可以在正在运行的服务器上进行如下操作:
创建您的日志表(参见answer)
在数据库上启用查询日志记录 (请注意,字符串 '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
【讨论】:
应该注意的是,“表”是按字面意思输入的,而不是用数据库中的表名替换。 在 Mac OS X 上,MySQL 软件安装程序似乎已经自动创建了 general_log 表,其类型为 CSV。这意味着我也可以tail对应的CSV文件:sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV 设置后全局 log_output = 'table';慢查询会写入文件吗?我认为在 SET global general_log = 0; 之后你应该设置以前的'log_output'值,它可能是'FILE'【参考方案3】:这已经在评论中,但值得自己回答: 无需编辑配置文件:在 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;
【讨论】:
我发现在Linux systemd下,如果你尝试将文件登录到/tmp/
,它可能最终会出现在/tmp/systemd-private-...-mariadb.service-.../tmp/
这样的地方
@commonpike:如果可以的话,我会更频繁地投票......我发现自己大约每个月都会在谷歌上搜索你的答案 :)
只是为了让你知道,我又来了:)
嗨,伙计!我又来了:D。我很高兴你提供了这个答案!
@resi haha,我发现自己也在谷歌上搜索自己的答案:-D【参考方案4】:
// 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;
【讨论】:
【参考方案5】:我还想启用 MySQL 日志文件以查看查询,我已通过以下说明解决了这个问题
-
转到
/etc/mysql/mysql.conf.d
打开mysqld.cnf
并启用以下几行
general_log_file = /var/log/mysql/mysql.log
general_log = 1
-
用这个命令
/etc/init.d/mysql restart
重启MySQL
转到/var/log/mysql/
并查看日志
【讨论】:
可以将这些设置保存在 conf 文件中,以便在每次启动 MySQL 时应用,但您无需重新启动 MySQL 即可应用此配置。您可以像其他人所说的那样使用“SET global”进行设置。【参考方案6】:我不得不在某一时刻删除并重新创建常规日志。在游戏过程中,字符集搞砸了,我最终在日志中出现了这个错误:
[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'
因此,如果“检查以确保日志记录已开启”的标准答案对您不起作用,请检查以确保您的字段具有正确的字符集。
【讨论】:
【参考方案7】:首先,请记住,此日志文件在繁忙的服务器上可能会变得非常大。
对于 mysql
要启用查询日志,请将其放入 /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 5.6.19 中不起作用。他们又改了吗? general_log = on general_log_file=/path/to/query.log 为我工作 这对我有用(Windows 上的 MySQL 5.6.12):SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
确保mysql用户对日志文件的访问权限,否则在mysql控制台设置general_log参数时会返回'not found'错误
对于 5.6.22 @youen 完全正确。谢谢!唯一需要确定的是被写入的目录和文件存在并且可以被mysql写入。【参考方案8】:
不完全是该问题的答案,因为该问题已经有了很好的答案。这是一个侧面信息。启用 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
以记录足够多的日志以找出您要查找的内容,然后将其关闭。
【讨论】:
【参考方案9】:在 MAC 机器中启用查询日志:
打开以下文件:
vi /private/etc/my.cnf
在'mysqld'部分下设置查询日志url如下:
[mysqld]
general_log_file=/Users/kumanan/Documents/mysql_query.log
很少有机器没有正确记录查询,所以你可以从 MySQL 控制台启用它
mysql> SET global general_log = 1;
【讨论】:
【参考方案10】: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”
希望对某人有所帮助。
【讨论】:
是否有针对此错误的错误报告?【参考方案11】:for mysql>=5.5 仅用于慢查询(1 秒及以上) 我的.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
【讨论】:
这是不正确的 - 启用慢查询日志,而不是查询日志。 我认为你必须使用破折号。【参考方案12】:在 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
...
...
...
...
【讨论】:
【参考方案13】:当我想快速优化不同的页面加载时,我使用这种方法进行日志记录。 这是一个小提示...
记录到表
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 秒内执行的查询。
【讨论】:
【参考方案14】:在 phpMyAdmin 4.0 中,您转到状态 > 监控。在那里您可以启用慢查询日志和一般日志,查看实时监视器,选择图表的一部分,查看相关查询并分析它们。
【讨论】:
【参考方案15】:您可以使用
禁用或启用常规查询日志(记录所有查询)SET GLOBAL general_log = 1 # (or 0 to disable)
【讨论】:
就我而言,无法在共享主机服务器上启用通用查询日志。我只能开启慢查询日志,系统管理员可以根据要求提供我账号相关的条目。以上是关于如何启用 MySQL 查询日志?的主要内容,如果未能解决你的问题,请参考以下文章