如何在我的Linux服务器上跟踪MySQL查询?
例如,我想要设置某种侦听器,然后请求一个web页面并查看引擎执行的所有查询,或者只是查看在生产服务器上运行的所有查询。我该怎么做呢?
如何在我的Linux服务器上跟踪MySQL查询?
例如,我想要设置某种侦听器,然后请求一个web页面并查看引擎执行的所有查询,或者只是查看在生产服务器上运行的所有查询。我该怎么做呢?
当前回答
Gibbs MySQL Spyglass
AgilData最近推出了Gibbs MySQL可伸缩性顾问(一个免费的自助服务工具),它允许用户捕获实时查询流并上传到Gibbs。Spyglass(它是开源的)将监视MySQL服务器和客户端应用程序之间的交互。不需要重新配置或重新启动MySQL数据库服务器(无论是客户端还是应用程序)。
GitHub: AgilData / gibbs-mysql-spyglass
了解更多:包捕获MySQL与Rust
安装命令:
curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash
其他回答
看看mtop。
MySQL命令:SHOW FULL PROCESSLIST;查看在任何给定时间正在处理哪些查询,但这可能无法实现您所希望的。
获得历史记录而不必修改使用服务器的每个应用程序的最佳方法可能是通过触发器。您可以设置触发器,以便每次查询运行都会导致查询被插入到某种历史表中,然后创建一个单独的页面来访问此信息。
请注意,这可能会大大降低服务器上的所有内容,因为在每个查询上都添加了一个额外的INSERT。
编辑:另一种选择是通用查询日志,但将其写入平面文件将消除许多灵活显示的可能性,特别是实时显示。如果您只是想要一种简单、易于实现的方法来查看发生了什么,那么启用GQL,然后在日志文件上运行tail -f就可以了。
如果你想进行监控和统计,那么有一个很好的开源工具Percona monitoring and Management
但它是一个基于服务器的系统,并且它的启动不是很简单。
并有现场演示系统进行测试。
尽管答案已经被接受,但我想提出一个可能是最简单的选择:
$ mysqladmin -u bob -p -i 1 processlist
这将每秒钟在屏幕上打印当前查询。
-u执行命令的mysql用户名 -p提示输入你的密码(这样你就不必把它保存在一个文件中或让命令出现在你的命令历史中) i以秒为单位的间隔。 使用——verbose标志显示完整的进程列表,显示每个进程的整个查询。(谢谢,nmat)
这可能有一个缺点:如果快速查询在您设置的时间间隔之间运行,则可能不会显示。IE:我的间隔设置为1秒,如果有一个查询需要0.02秒才能运行,并且在间隔之间运行,您将看不到它。
当您希望快速检查正在运行的查询而无需设置侦听器或其他任何东西时,最好使用此选项。
我一直想做同样的事情,并从各种帖子中拼凑出了一个解决方案,再加上创建了一个小的控制台应用程序来输出实时查询文本,因为它被写入日志文件。这在我的情况下是重要的,因为我使用实体框架与MySQL,我需要能够检查生成的SQL。
创建日志文件的步骤(一些其他帖子的复制,这里都是为了简单起见):
Edit the file located at: C:\Program Files (x86)\MySQL\MySQL Server 5.5\my.ini Add "log=development.log" to the bottom of the file. (Note saving this file required me to run my text editor as an admin). Use MySql workbench to open a command line, enter the password. Run the following to turn on general logging which will record all queries ran: SET GLOBAL general_log = 'ON'; To turn off: SET GLOBAL general_log = 'OFF'; This will cause running queries to be written to a text file at the following location. C:\ProgramData\MySQL\MySQL Server 5.5\data\development.log Create / Run a console app that will output the log information in real time: Source available to download here Source: 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); } } } }