【问题标题】:How to show the last queries executed on MySQL?如何显示在 MySQL 上执行的最后一个查询?
【发布时间】:2010-10-13 14:37:02
【问题描述】:

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

【问题讨论】:

    标签: mysql logging


    【解决方案1】:

    对于那些拥有 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 Reference Manual - Server System Variables - general_log

    【讨论】:

    • 出色的用户界面设计。无论如何,MySQL 日志表实际上使用的是 CSV 引擎,因此您可以执行 FlipMcF 在关于启用登录 general_log 表的答案中所说的所有内容,并拥有 general_log 的 tail -f,如下所示:tail -f /var/lib/mysql/mysql/ general_log.CSV
    • 该死的,mysql 文档甚至没有拍摄表参数。非常感谢。
    • 记得清理完你的通用日志表:"truncate table mysql.general_log"
    • 我通过这种方式得到了结果,但是参数以问号出现,例如,select foo from bar where x=?。如何获得完整的查询?
    【解决方案2】:

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

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

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

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

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

    嘿,presto,您可以在查询进入时查看它们。

    【讨论】:

    • 我的 my.cnf 中的 general_log_file 和 general_log
    • 如果你想知道重启 mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server,这是可行的
    • 较新版本的 Mac OS X(至少在 Mac OS X 上)需要 general_log_file 和 general_log 选项,而不仅仅是“log =”。否则,您会收到如下错误: ERROR /usr/local/mysql/bin/mysqld: ambiguous option '--log=/tmp/mysql_queries.log' (log-bin, log_slave_updates)
    • @JaySheth,我在 Mariadb 10.2 上遇到了这个错误,所以我不确定它是否仅与 Mac OS 相关。
    【解决方案3】:
    SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        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

        【讨论】:

          【解决方案6】:

          也许您可以通过查看query log 来发现这一点。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              mysqlbinlog binlog.000001 >  /tmp/statements.sql
              

              启用

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

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

              【讨论】:

              • 可能,但很痛苦。如果您想查看过去发生的事情,则更有用。
              【解决方案9】:

              阅读保罗的回答后,我继续挖掘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(代码的原始作者)。

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

              【讨论】:

              • 有趣。除非您首先锁定所有数据库,否则您会在清理过程中错过查询。这里可能会出现其他问题。如果我们处于“连续”日志记录的这一点,我会使用文件日志记录或 bin 日志和现成的日志轮换器。
              【解决方案10】:

              在linux下可以看下面的

              cd /root
              
              ls -al
              

              vi .mysql_history可能有帮助

              【讨论】:

              • 这看起来只适用于官方的命令行mysql客户端,并且只适用于root用户执行的查询
              • 问题说“所有服务器”,这使得这个答案不正确。这将显示由单个客户端执行的所有查询。
              • 如果启用了 mysql binlog,您可以通过在 linux 控制台中通过浏览到 mysql binlog 目录 mysqlbinlog binlog.000001 > /tmp/statements.sql 启用 [mysqld] 日志来检查用户运行的命令= /var/log/mysql/mysql.log 或一般日志会影响 mysql 的性能
              • 默认情况下会禁止某些条目,例如包含“密码”的字符串。
              猜你喜欢
              • 2019-06-08
              • 1970-01-01
              • 2014-06-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多