MySQL如何开启记录从客户端收到的每条SQL查询语句和提交时间的功能? 我可以在phpmyadmin或NaviCat中这样做吗? 如何分析日志?
当前回答
看看另一个相关问题的答案。它展示了如何在不重新启动的情况下启用、禁用和查看活动服务器上的日志。
在mysql中记录所有查询
以下是摘要:
如果你不想或者不能重新启动MySQL服务器,你可以在你正在运行的服务器上这样做:
创建日志表(见答案) 启用数据库的查询日志 (注意,字符串'table'应该按字面意思放置,而不是用任何表名代替。感谢尼古拉斯·皮克林)
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中记录所有查询
以下是摘要:
如果你不想或者不能重新启动MySQL服务器,你可以在你正在运行的服务器上这样做:
创建日志表(见答案) 启用数据库的查询日志 (注意,字符串'table'应该按字面意思放置,而不是用任何表名代替。感谢尼古拉斯·皮克林)
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> select * from mysql.general_log LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
1 row in set (0.00 sec)
所以为了让它更具可读性,只需使用:
select a.*, convert(a.argument using utf8) from mysql.general_log a;
返回值是这样的:
mysql> select a.*, convert(a.argument using utf8) from mysql.general_log a LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
convert(a.argument using utf8): select * from users
1 row in set, 1 warning (0.00 sec)
Ps:我在例子中使用了LIMIT 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
在phpMyAdmin 4.0,你去状态>监视器。在那里,您可以启用慢查询日志和常规日志,查看实时监视器,选择图表的一部分,查看相关查询并分析它们。
这不是问题的确切答案,因为这个问题已经有了很好的答案。这是附带信息。启用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来记录足够多的日志,以便找到您想要查找的内容,然后将其关闭。