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

问题描述 投票:0回答:10

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

mysql logging
10个回答
933
投票

对于那些拥有 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


45
投票

您可以启用一般查询日志来进行此类诊断。一般来说,您不会在生产服务器上记录所有 SELECT 查询,但它是性能杀手。

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

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

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

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

嘿,快点,您可以观看传入的查询。


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

20
投票

您可以执行以下操作来监控 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

18
投票

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文件中的查询 猫~/.mysql_history


5
投票

也许您可以通过查看查询日志找到答案。


4
投票

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


4
投票

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

mysqlbinlog binlog.000001 >  /tmp/statements.sql

启用

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

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


3
投票

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

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

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

此脚本是保持表格清洁的示例,它将帮助您减小表格大小。一天后,日志查询量约为180k。 (在一个文件中,每天为 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(代码的原始作者)。

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


1
投票

可以在linux下看以下内容

cd /root
ls -al
vi .mysql_history   

可能有帮助

© www.soinside.com 2019 - 2024. All rights reserved.