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

时间:2009-03-16 12:35:54

标签: mysql logging

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

10 个答案:

答案 0 :(得分:722)

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

  1. 执行SET GLOBAL log_output = 'TABLE';
  2. 执行SET GLOBAL general_log = 'ON';
  3. 查看表mysql.general_log
  4. 如果您希望输出到文件而不是表格:

    1. SET GLOBAL log_output = "FILE"; 默认
    2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
    3. SET GLOBAL general_log = 'ON';
    4. 我更喜欢这种方法来编辑.cnf文件,因为:

      1. 您没有编辑my.cnf文件并可能永久打开日志记录
      2. 你不是在寻找查询日志的文件系统周围钓鱼 - 更糟糕的是,由于需要完美的目的地而分散注意力。 /var/log /var/data/log /opt /home/mysql_savior/var
      3. 您不必重新启动服务器并中断与其的任何当前连接。
      4. 重新启动服务器会使您离开(默认情况下仍然关闭)
      5. 有关详细信息,请参阅 MySQL 5.1 Reference Manual - Server System Variables - general_log

答案 1 :(得分:40)

您可以为此类诊断启用general query log。通常,您不会在生产服务器上记录所有SELECT查询,但这是性能杀手。

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

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

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

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

嘿,你可以在他们进来时查看查询。

答案 2 :(得分:15)

你可以做一些流动的事情来监控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

答案 3 :(得分:13)

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

答案 4 :(得分:7)

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

答案 5 :(得分:4)

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

mysqlbinlog binlog.000001 >  /tmp/statements.sql

启用

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

或一般日志会对mysql的性能产生影响

答案 6 :(得分:3)

也许你可以通过查看query log来找到答案。

答案 7 :(得分:2)

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

cd /root

ls -al

vi .mysql_history这可能会有所帮助

答案 8 :(得分:2)

如果您不想改变您的MySQL配置,可以使用像#34; Neor Profile SQL"这样的SQL分析器。 http://www.profilesql.com

答案 9 :(得分:2)

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

我找到了一个非常有用的代码。这是上下文的摘要。

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

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

您需要添加一个额外的列(event_unix)然后您可以使用此脚本来保持日志清洁...它会将时间戳更新为Unix时间戳,删除超过1天的日志然后更新来自event_unix的event_time到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(代码的原作者)。

希望有人会发现它像我一样有用。