我怎样才能查看活的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日志文件的步骤(其他文章的一些重复,所有这里为简单起见):
-
编辑位于以下位置的文件:
C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini
将“log = development.log”添加到文件的底部。 (注意保存这个文件需要我作为pipe理员运行我的文本编辑器)。
-
使用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
-
创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';
默认设置是“无”。