关于日志:如何显示在MySQL上执行的最后一个查询?

How to show the last queries executed on MySQL?

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


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

  • 执行SET GLOBAL log_output = 'TABLE';
  • 执行SET GLOBAL general_log = 'ON';
  • 看一下表mysql.general_log
  • 如果希望输出到文件而不是表:

  • SET GLOBAL log_output ="FILE";违约。
  • SET GLOBAL general_log_file ="/path/to/your/logfile.log";
  • SET GLOBAL general_log = 'ON';
  • 我更喜欢这种方法来编辑.cnf文件,因为:

  • 您没有编辑my.cnf文件,可能会永久打开日志记录。
  • 您不会在文件系统中到处寻找查询日志——或者更糟的是,您会因为需要完美的目标而分心。江户十一〔7〕江户十一〔8〕号
  • 您不必重新启动服务器并中断与它的任何当前连接。
  • 重新启动服务器将使您离开启动位置(默认情况下,日志仍处于关闭状态)
  • 有关详细信息,请参阅mysql 5.1参考手册-服务器系统变量-常规日志


    您可以为这类诊断启用常规查询日志。一般来说,您不会在生产服务器上记录所有的选择查询,但这是一个性能杀手。

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

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

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

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

    嘿,普雷斯托,你可以在他们进来的时候观察他们。


    您可以执行流式操作来监视MySQL查询日志。

    打开mysql配置文件my.cnf

    1
    sudo nano /etc/mysql/my.cnf

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

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

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

    1
    sudo service mysql start

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

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

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

    1)如果启用了一般的MySQL日志记录,那么我们可以根据配置中提到的内容检查日志文件或表中的查询。使用以下命令检查启用的内容

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

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

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

    查看mysql.general_log表

    如果希望输出到文件:

    1
    2
    3
    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_历史文件中的查询。cat~/.mysql_历史


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

    1
    mysqlbinlog binlog.000001 >  /tmp/statements.sql

    有可能

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

    或者常规日志会影响MySQL的性能


    也许您可以通过查看查询日志来发现这一点。


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

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

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

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

    您需要添加一个额外的列(event_unix),然后您可以使用此脚本来保持日志的整洁…它将把时间戳更新为unix时间戳,删除超过1天的日志,然后从event-unix将事件时间更新为时间戳…听起来有点困惑,但效果很好。

    新列的命令:

    1
    2
    3
    4
    5
    6
    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';

    清除脚本:

    1
    2
    3
    4
    5
    6
    7
    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';

    荣誉归于塞巴斯蒂安·凯撒(代码的原始作者)。

    希望有人能像我一样发现它的用处。


    如果您不想更改MySQL配置,可以使用SQL事件探查器,如"neor profile sql"http://www.profile sql.com。


    在Linux中可以看到以下内容

    1
    2
    3
    cd /root

    ls -al

    vi .mysql_history可能有帮助