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

是否有任何查询/方法显示在所有服务器上执行的最后查询?

603230 次浏览

也许你可以从查询日志中找到答案。

您可以为这种诊断启用一般查询日志。但是,通常不会在生产服务器上记录所有SELECT查询,这是性能杀手。

编辑你的MySQL配置,例如/etc/mysql/my.cnf -查找或添加如下一行

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

重新启动mysql以获取该更改,现在就可以了

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

嘿,马上,你就可以看到输入的查询了。

对于那些拥有MySQL >= 5.1.12的人,你可以在运行时全局控制这个选项:

  1. 执行# EYZ0
  2. 执行# EYZ0
  3. 看一下表mysql.general_log

如果你喜欢输出到一个文件而不是一个表:

  1. # EYZ0 # EYZ1。
  2. # EYZ0
  3. # EYZ0

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

  1. 您没有编辑my.cnf文件,并且可能会永久地打开日志记录
  2. 您不必在文件系统中寻找查询日志——或者更糟的是,不必因为需要完美的目的地而分心。# EYZ0 # EYZ1
  3. 您不必重新启动服务器并中断到它的任何当前连接。
  4. 重新启动服务器会让您回到开始时的位置(默认情况下日志仍然关闭)

更多信息,请参见 # EYZ0 < / p >

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

cd /root


ls -al

这可能会有帮助

如果使能了mysql binlog,可以通过执行命令查看用户执行的命令 以下命令在Linux控制台上浏览到mysql binlog目录

mysqlbinlog binlog.000001 >  /tmp/statements.sql

# EYZ0

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

或者一般的日志会对mysql的性能有影响

你可以做流动的事情来监视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
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
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';
我们还可以检查.mysql_history文件中的查询 猫~ / .mysql_history < / p >

如果你不想改变你的MySQL配置,你可以使用SQL分析器,如“Neor Profile SQL”http://www.profilesql.com

读完保罗的回答后,我继续挖掘关于https://dev.mysql.com/doc/refman/5.7/en/query-log.html的更多信息

我发现了一个非常有用的代码。这里是上下文的摘要。

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

这个脚本是一个保持表整洁的示例,这将帮助您减少表的大小。一天之后,将会有大约180k的日志查询。(在一个文件中,每天是30MB)

你需要添加一个额外的列(event_unix),然后你可以使用这个脚本来保持日志干净…它会将时间戳更新为unix时间戳,删除超过1天的日志,然后将event_time从event_unix更新为timestamp…听起来有点混乱,但效果很好。

新列的命令:

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(代码的原始作者)。

希望有人会像我一样觉得它有用。