MySQL如何开启记录从客户端收到的每条SQL查询语句和提交时间的功能? 我可以在phpmyadmin或NaviCat中这样做吗? 如何分析日志?


当前回答

你可能会遇到一组十六进制值,像这样(参数列):

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,因为我的日志表太大了。

其他回答

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 

实际设置按以下顺序读取:

    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

希望它能帮助到一些人。

看看另一个相关问题的答案。它展示了如何在不重新启动的情况下启用、禁用和查看活动服务器上的日志。

在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中,以root身份执行

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

之后别忘了关掉:

SET global general_log = off;

当我想快速优化不同的页面加载时,我使用这种方法进行日志记录。 这是一个小建议…

记录到表

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秒内执行的查询。

// 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;