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


当前回答

// 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 < 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+中,日志选项已弃用。要指定日志文件并启用日志记录,请在my.cnf的[mysqld]部分中使用这个:

general_log_file = /path/to/query.log
general_log      = 1

另外,要从MySQL控制台打开日志记录(还必须以某种方式指定日志文件位置,或者找到默认位置):

SET global general_log = 1;

还要注意,还有其他选项可以只记录慢速查询或不使用索引的查询。

可以禁用或启用常规查询日志(记录所有查询)

SET GLOBAL general_log = 1 # (or 0 to disable)

对于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

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

在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表定义错误。General_log:期望位置1的列'user_host'的类型有字符集'utf8',但发现字符集'latin1'

因此,如果“检查以确保日志记录开启”的标准答案对您不起作用,请检查以确保字段具有正确的字符集。