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';
#
# * 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
#!/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));
}
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);
}
}
}
}
11
除了描述如何启用常规日志记录的先前答案之外,在将任何SQL写入日志之前,我必须在我的vanilla MySql 5.6安装中修改一个附加变量:
SET GLOBAL log_output = 'FILE';
默认设置为“无” .
16
Gibbs MySQL Spyglass
AgilData最近推出了Gibbs MySQL Scalability Advisor(一种免费的自助服务工具),它允许用户捕获要上传到Gibbs的实时查询流 . Spyglass(开源)将观察MySQL服务器和客户端应用程序之间的交互 . 无需重新配置或重新启动MySQL数据库服务器(客户端或应用程序) .
12 回答
您可以运行MySQL命令
SHOW FULL PROCESSLIST;
以查看在任何给定时间正在处理的查询,但这可能赢得了't achieve what you'希望 .获取历史记录而不必使用服务器修改每个应用程序的最佳方法可能是通过触发器 . 您可以设置触发器,以便每次查询运行都会将查询插入到某种历史记录表中,然后创建一个单独的页面来访问此信息 .
请注意,这可能会大大减慢服务器上的所有内容,在每个查询的顶部添加额外的
INSERT
.编辑:另一种选择是General Query Log,但将其写入平面文件会消除很多显示灵活性的可能性,特别是在实时中 . 如果您只是想要一种简单易用的方法来查看正在发生的事情,那么启用GQL然后在日志文件上使用运行
tail -f
就可以了 .您可以非常轻松地将每个查询记录到日志文件中:
做你的查询(在任何数据库上) . Grep或以其他方式检查
/var/run/mysqld/mysqld.log
那就别忘了
或者性能将直线下降,你的磁盘将填满!
即使已经接受了答案,我想提出甚至可能是最简单的选择:
这将每秒在屏幕上打印当前查询 .
-u
要将命令执行为的mysql用户-p
提示您输入密码(这样您就不必将其保存在文件中或命令显示在命令历史记录中)i
以秒为单位的间隔 .使用
--verbose
标志显示完整的进程列表,显示每个进程的整个查询 . (谢谢,nmat)可能存在缺点:如果快速查询在您设置的时间间隔之间运行,则可能不会显示快速查询 . IE:我的间隔设置为一秒,如果有一个查询需要
.02
秒运行并在间隔之间运行,您将看不到它 .当您想要检查正在运行的查询而不必设置监听器或其他任何内容时,最好使用此选项 .
运行这个方便的SQL查询以查看正在运行的MySQL查询 . 它可以在任何您喜欢的环境中运行,无需任何代码更改或开销 . 它可能需要一些MySQL权限配置,但对我来说它只是在没有任何特殊设置的情况下运行 .
唯一的问题是,您经常会错过执行速度非常快的查询,因此对于运行时间较长的查询或MySQL服务器的备份查询最有用 - 根据我的经验,这正是我想要查看的时间“直播“查询 .
您还可以添加条件,使其更具体,只需任何SQL查询 .
例如显示运行5秒或更长时间的所有查询:
例如显示所有正在运行的UPDATE:
详情请见:http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
我处于一种特殊情况,我没有权限打开登录,如果打开日志,则无权查看日志 . 我无法添加触发器,但我确实有权调用show processlist . 所以,我尽了最大的努力,想出了这个:
创建一个名为“showsqlprocesslist”的bash脚本:
执行脚本:
尾输:
Bingo bango . 即使它没有受到限制,它只占用了我运行它的盒子上2-4%的CPU . 我希望这可能对某人有帮助 .
这是我遇到的Linux Ubuntu机器上最简单的设置 . 疯狂地看到所有的查询 .
在Ubuntu上找到并打开你的MySQL配置文件,通常是/etc/mysql/my.cnf . 查找“记录和复制”部分
只需取消注释“log”变量即可打开日志记录 . 使用以下命令重启MySQL:
现在我们准备开始监视查询了 . 打开一个新终端并运行此命令滚动日志文件,必要时调整路径 .
现在运行您的应用程序您将在终端窗口中看到数据库查询开始飞行 . (确保你有滚动和在终端上启用历史记录)
从http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
strace
查看实时MySQL / MariaDB查询的最快方法是使用调试器 . 在Linux上,您可以使用
strace
,例如:由于有很多转义字符,您可以通过管道(只需在这两个单行之间添加
|
)进入以下命令:所以你应该看到相当干净的SQL查询,没有时间,没有触及配置文件 .
显然,这不会取代启用日志的标准方式,如下所述(涉及重新加载SQL服务器) .
dtrace
使用MySQL探针查看实时MySQL查询,而无需触及服务器 . 示例脚本:
将以上脚本保存到文件(如
watch.d
),然后运行:了解更多:Getting started with DTracing MySQL
Gibbs MySQL Spyglass
见answer .
日志
以下是对开发建议有用的步骤 .
将这些行添加到
~/.my.cnf
或全局my.cnf
中:路径:/var/log/mysqld.log或/usr/local/var/log/mysqld.log也可能有效,具体取决于您的文件权限 .
然后重启你的MySQL / MariaDB(如有必要,用_1568367前缀):
然后检查你的日志:
完成后,将
general_log
更改为0
(以便将来可以使用它),然后删除该文件并再次重新启动SQL Server:killall -HUP mysqld
.从命令行,您可以运行:
将值[x]替换为您的值 .
甚至更好:
看看mtop .
我一直在寻找同样的方法,并拼凑了各种帖子的解决方案,并创建了一个小型控制台应用程序,以便在写入日志文件时输出实时查询文本 . 这在我的情况下很重要,因为我正在使用MySQL的实体框架,我需要能够检查生成的SQL .
创建日志文件的步骤(其他帖子的一些重复,为简单起见,所有这些都是):
将“log = development.log”添加到文件的底部 . (注意保存此文件需要我以管理员身份运行我的文本编辑器) .
运行以下命令以打开将记录所有运行的查询的常规日志记录:
这将导致运行查询被写入以下位置的文本文件 .
Source available to download here
资源:
除了描述如何启用常规日志记录的先前答案之外,在将任何SQL写入日志之前,我必须在我的vanilla MySql 5.6安装中修改一个附加变量:
默认设置为“无” .
Gibbs MySQL Spyglass
AgilData最近推出了Gibbs MySQL Scalability Advisor(一种免费的自助服务工具),它允许用户捕获要上传到Gibbs的实时查询流 . Spyglass(开源)将观察MySQL服务器和客户端应用程序之间的交互 . 无需重新配置或重新启动MySQL数据库服务器(客户端或应用程序) .
GitHub:AgilData/gibbs-mysql-spyglass
了解更多:Packet Capturing MySQL with Rust
安装命令: