我怎样才能查看活的MySQL查询?

如何在我的Linux服务器上跟踪MySQL查询?

例如,我喜欢设置某种监听器,然后请求网页并查看引擎执行的所有查询,或者查看正在生产服务器上运行的所有查询。 我该怎么做?

你可以运行MySQL命令SHOW FULL PROCESSLIST; 看看在任何给定的时间正在处理什么查询,但是这可能不会达到你所希望的。

获取历史logging而不必使用服务器修改每个应用程序的最佳方法可能是通过触发器。 您可以设置触发器,以便每个查询运行结果将查询插入某种历史表,然后创build一个单独的页面来访问此信息。

请注意,这可能会大大减慢服务器上的所有内容,但在每个查询之上添加一个额外的INSERT


编辑:另一种select是通用查询日志 ,但将其写入平面文件将会消除很多显示灵活性的可能性,特别是实时性。 如果你只是想要一个简单的,易于实现的方式来看看发生了什么,启用GQL,然后在日志文件上使用运行tail -f就可以了。

您可以很容易地将每个查询logging到日志文件中:

 mysql> SHOW VARIABLES LIKE "general_log%"; +------------------+----------------------------+ | Variable_name | Value | +------------------+----------------------------+ | general_log | OFF | | general_log_file | /var/run/mysqld/mysqld.log | +------------------+----------------------------+ mysql> SET GLOBAL general_log = 'ON'; 

做你的查询(在任何分贝)。 grep或以其他方式检查/var/run/mysqld/mysqld.log

那么别忘了

 mysql> SET GLOBAL general_log = 'OFF'; 

或者性能会下降,你的磁盘将会填满!

即使答案已经被接受,我想提出什么可能是最简单的select:

 $ mysqladmin -u bob -p -i 1 processlist 

这将每秒在您的屏幕上打印当前的查询。

  • -u你要执行命令的mysql用户
  • -p提示input密码(因此不必将其保存在文件中,或将命令显示在命令历史logging中)
  • i以秒为单位的时间间隔。
  • 使用--verbose标志来显示完整的进程列表,显示每个进程的整个查询。 (谢谢, nmat )

有一个可能的缺点:快速查询可能不会显示,如果他们之间运行设置的时间间隔。 IE:我的间隔设置为一秒钟,如果有一个查询需要.02秒运行,并在间隔之间运行,你不会看到它。

最好使用这个选项,当你很快想检查正在运行的查询,而不必设置一个监听器或其他东西。

运行这个方便的SQL查询来查看正在运行的MySQL查询。 只要你愿意,它可以从你喜欢的任何环境运行,而不需要任何代码改变或开销。 它可能需要一些MySQL权限configuration,但对我来说,它只是运行没有任何特殊的设置。

 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep'; 

唯一的问题是您经常会错过执行速度非常快的查询,所以对于长时间运行的查询或者当MySQL服务器查询正在备份的时候是非常有用的 – 以我的经验来说,这正是我想查看“活“查询。

您还可以添加条件,使其更具体的只是任何SQL查询。

例如显示所有查询运行5秒或更多:

 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5; 

例如显示所有正在运行的UPDATE:

 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %'; 

有关完整的详细信息,请参阅: http : //dev.mysql.com/doc/refman/5.1/en/processlist-table.html

这是我遇到的Linux Ubuntu机器上最简单的设置。 疯狂地看到所有的查询生活。

在Ubuntu上查找并打开你的MySQLconfiguration文件,通常是/etc/mysql/my.cnf。 查找“logging和复制”部分

 # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. log = /var/log/mysql/mysql.log 

只需取消注释“日志”variables来打开日志。 用这个命令重新启动MySQL:

 sudo /etc/init.d/mysql restart 

现在我们准备好开始监视查询了。打开一个新的terminal并运行这个命令来滚动日志文件,根据需要调整path。

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

现在运行你的应用程序 你会看到数据库查询在你的terminal窗口中开始飞行。 (确保您在terminal上启用了滚动和历史logging)

FROM http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/

我处于特定的情况下,我没有权限打开日志logging,如果打开日志,则无权查看日志。 我无法添加触发器,但我确实有权限调用show processlist。 所以,我尽了最大努力,想出了这个:

创build一个名为“showsqlprocesslist”的bash脚本:

 #!/bin/bash while [ 1 -le 1 ] do mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL"; done 

执行脚本:

 ./showsqlprocesslist > showsqlprocesslist.out & 

尾巴输出:

 tail -f showsqlprocesslist.out 

宾果邦戈。 即使它没有受到限制,但在我运行它的盒子上只占用了2-4%的CPU。 我希望这可以帮助别人。

退房mtop 。

从命令行你可以运行:

 watch --interval=[your-interval-in-seconds] "mysqladmin -u root -p[your-root-pw] processlist | grep [your-db-name]" 

用您的值replace值[x]。

甚至更好:

  mysqladmin -u root -p -i 1 processlist; 

我一直在做同样的事情,并且拼凑了来自各个post的解决scheme,并且创build了一个小型的控制台应用程序,用于在写入日志文件时输出实时查询文本。 这对我来说很重要,因为我在使用Entity Framework和MySQL时需要能够检查生成的SQL。

创build日志文件的步骤(其他文章的一些重复,所有这里为简单起见):

  1. 编辑位于以下位置的文件:

     C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini 

    将“log = development.log”添加到文件的底部。 (注意保存这个文件需要我作为pipe理员运行我的文本编辑器)。

  2. 使用MySql工作台打开命令行,input密码。

    运行以下命令打开将logging所有已运行查询的通用日志logging:

     SET GLOBAL general_log = 'ON'; To turn off: SET GLOBAL general_log = 'OFF'; 

    这将导致正在运行的查询被写入到以下位置的文本文件。

     C:\ProgramData\MySQL\MySQL Server 5.5\data\development.log 
  3. 创build/运行将实时输出日志信息的控制台应用程序:

    可供下载的源代码

    资源:

     using System; using System.Configuration; using System.IO; using System.Threading; namespace LiveLogs.ConsoleApp { class Program { static void Main(string[] args) { // Console sizing can cause exceptions if you are using a // small monitor. Change as required. Console.SetWindowSize(152, 58); Console.BufferHeight = 1500; string filePath = ConfigurationManager.AppSettings["MonitoredTextFilePath"]; Console.Title = string.Format("Live Logs {0}", filePath); var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); // Move to the end of the stream so we do not read in existing // log text, only watch for new text. fileStream.Position = fileStream.Length; StreamReader streamReader; // Commented lines are for duplicating the log output as it's written to // allow verification via a diff that the contents are the same and all // is being output. // var fsWrite = new FileStream(@"C:\DuplicateFile.txt", FileMode.Create); // var sw = new StreamWriter(fsWrite); int rowNum = 0; while (true) { streamReader = new StreamReader(fileStream); string line; string rowStr; while (streamReader.Peek() != -1) { rowNum++; line = streamReader.ReadLine(); rowStr = rowNum.ToString(); string output = String.Format("{0} {1}:\t{2}", rowStr.PadLeft(6, '0'), DateTime.Now.ToLongTimeString(), line); Console.WriteLine(output); // sw.WriteLine(output); } // sw.Flush(); Thread.Sleep(500); } } } } 

strace

查看实时MySQL / MariaDB查询的最快方法是使用debugging器。 在Linux上,您可以使用strace ,例如:

 sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1 

由于有很多转义字符,所以可以通过上面的命令将pipe道 输出的格式 (只是在这两个单行之间添加) 格式化 :

 grep --line-buffered -o '".\+[^"]"' | grep --line-buffered -o '[^"]*[^"]' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n" 

所以你应该看到相当干净的SQL查询,没有触及configuration文件。

显然,这不会取代启用日志的标准方式,这在下面描述(涉及重新加载SQL服务器)。

dtrace

使用MySQL探测器来查看实时的MySQL查询,而无需接触服务器。 示例脚本:

 #!/usr/sbin/dtrace -q pid$target::*mysql_parse*:entry /* This probe is fired when the execution enters mysql_parse */ { printf("Query: %s\n", copyinstr(arg1)); } 

将上面的脚本保存到一个文件(如watch.d ),然后运行:

 pfexec dtrace -s watch.d -p $(pgrep -x mysqld) 

了解更多信息: 开始使用DTracing MySQL

AgilData最近推出了Gibbs MySQL可扩展性顾问 (一种免费的自助服务工具),它允许用户捕获实时查询stream以上传到Gibbs。 Spyglass (开放源代码)将监视你的MySQL服务器和客户端应用程序之间的交互。 不需要重新configuration或重新启动MySQL数据库服务器(客户端或应用程序)。

GitHub: AgilData / gibbs-mysql-spyglass

了解更多信息: 使用Rust捕获MySQL数据包

安装命令: curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash

日志

以下是对开发build议有用的步骤。

将这些行添加到~/.my.cnf或全局my.cnf

 [mysqld] general_log=1 general_log_file=/tmp/mysqld.log 

path: /var/log/mysqld.log/usr/local/var/log/mysqld.log也可能取决于您的文件权限。

然后重新启动你的MySQL / MariaDB(必要时使用sudo前缀):

 killall -HUP mysqld 

然后检查你的日志:

 tail -f /tmp/mysqld.log 

完成后,将general_log更改为0 (以便将来可以使用它),然后删除该文件并重新启动SQL Server: killall -HUP mysqld

除了描述如何启用通用日志logging的以前的答案之外,在将任何SQL写入日志之前,我必须在我的vanilla MySql 5.6安装中修改一个额外的variables:

 SET GLOBAL log_output = 'FILE'; 

默认设置是“无”。