如何显示在MySQL上执行的最后一个查询?


471

是否有任何查询/方式来显示所有服务器上执行的最后一个查询?

Answers:


793

对于那些拥有MySQL> = 5.1.12的用户,可以在运行时全局控制此选项:

  1. 执行 SET GLOBAL log_output = 'TABLE';
  2. 执行 SET GLOBAL general_log = 'ON';
  3. 看看桌子 mysql.general_log

如果您希望输出到文件而不是表:

  1. SET GLOBAL log_output = "FILE"; 默认值
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

我更喜欢这种方法来编辑.cnf文件,因为:

  1. 您没有编辑my.cnf文件,并可能永久打开日志记录
  2. 您不会在文件系统中四处寻找查询日志-甚至更糟的是,对完美目标的需求分散了注意力。 /var/log /var/data/log /opt /home/mysql_savior/var
  3. 您不必重新启动服务器并中断与服务器的任何当前连接。
  4. 重新启动服务器会将您留在开始的地方(默认情况下,日志仍处于关闭状态)

有关更多信息,请参见《 MySQL 5.1参考手册-服务器系统变量-general_log》。


4
出色的UI设计。无论如何,MySQL日志表实际上使用的是CSV引擎,因此您可以执行FlipMcF在启用登录general_log表的答案中所说的所有操作,并且具有general_log的tail -f像这样:tail -f / var / lib / mysql / mysql / general_log.CSV

2
该死的,为此的mysql文档甚至没有击中table参数。非常感谢。
Abhishek Dujari 2012年


6
完成操作后,请记住清除常规日志表:“截断表mysql.general_log”
pdwalker 2014年

1
我以这种方式得到结果,但是参数以问号显示,例如,从x =?的bar中选择foo。如何获得完整的查询?
okwap 2015年

43

您可以为此类诊断启用常规查询日志。通常,尽管您没有在生产服务器上记录所有SELECT查询,但这是性能的杀手。

编辑您的MySQL配置,例如/etc/mysql/my.cnf-查找或添加这样的行

[mysqld]
log = /var/log/mysql/mysql.log

重新启动mysql以获取更改,现在您可以

tail -f /var/log/mysql/mysql.log

嗨,很高兴,您可以看到查询的出现。


4
my.cnf中的general_log_file和general_log
Martin Thoma

如果您想知道如何重新启动mysql,这是可行的,请
Kumar,

1
较新版本的Mac OS X(至少在Mac OS X上)需要general_log_file和general_log选项,而不仅仅是“ log =”。否则,您将收到如下错误:错误/ usr / local / mysql / bin / mysqld:模糊选项'--log = / tmp / mysql_queries.log'(log-bin,log_slave_updates)
Jay Sheth

@JaySheth,我在Mariadb 10.2上遇到了该错误,所以我不确定这仅与Mac OS有关。
user10089632'3

16

您可以做一些事情来监视mysql查询日志。

打开mysql配置文件my.cnf

sudo nano /etc/mysql/my.cnf

[mysqld]标题下搜索以下行,并取消注释这些行以启用日志

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

重新启动mysql服务器以反映更改

sudo service mysql start

在终端中使用以下命令监视mysql服务器日志

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1)如果启用了常规mysql日志记录,则可以根据配置中提到的内容检查日志文件或表中的查询。检查以下命令启用了什么

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

如果我们需要表中的查询历史记录,那么

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

看看表mysql.general_log

如果您希望输出到文件:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2)我们也可以检查.mysql_history文件cat〜/ .mysql_history中的查询



4

如果启用了mysql binlog,则可以通过浏览到mysql binlog目录在Linux控制台中执行以下命令来检查用户运行的命令

mysqlbinlog binlog.000001 >  /tmp/statements.sql

使能

[mysqld]
log = /var/log/mysql/mysql.log

或常规日志将对mysql的性能产生影响


可能,但痛苦。如果您希望查看过去发生的情况,此功能将更为有用。
pdwalker 2014年


2

在阅读了Paul的回答后,我继续在https://dev.mysql.com/doc/refman/5.7/en/query-log.html上寻找更多信息。

我发现一个人真正有用的代码。这是上下文的摘要。

(注意:以下代码不是我的)

该脚本是保持表清洁的示例,它将帮助您减小表的大小。一天之后,将有大约18万条日志查询。(文件中每天30MB)

您需要添加一个额外的列(event_unix),然后可以使用此脚本保持日志的清洁...它将时间戳记更新为Unix时间戳记,删除超过1天的日志,然后将event_time更新为时间戳记来自event_unix ...听起来有点令人困惑,但是效果很好。

新列的命令:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

清理脚本:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

致谢Sebastian Kaiser(代码的原始作者)。

希望有人会像我一样有用。


有趣。除非您锁定了所有数据库的第一个数据库,否则在清除过程中会错过查询。这里可能还会出现其他问题。如果我们处于“连续”日志记录的这一点,我将使用文件日志记录或bin日志以及现成的日志循环器。
FlipMcF

1

您可以在linux中查看以下内容

cd /root

ls -al

vi .mysql_history 可能有帮助


6
看起来它仅适用于官方命令行mysql客户端,并且仅适用于root用户执行的查询
golimar 2013年

问题说“所有服务器”,这使该答案不正确。这将显示单个客户端执行的所有查询。
FlipMcF

如果启用了mysql binlog,则可以通过浏览到mysql binlog目录mysqlbinlog binlog.000001> /tmp/statements.sql,在Linux控制台中执行以下命令来检查用户运行的命令:[mysqld] log = / var / log / mysql / mysql.log或一般日志将对mysql的性能产生影响
Avinash Singh

无论如何,默认情况下都会禁止其中的某些条目,例如包含“ password”的字符串。
mckenzm 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.