如何跟踪我的 MySQL 服务器中的所有查询?

如何跟踪我的 MySQL 服务器中的所有查询?

我正在尝试计算 MySQL 服务器中所有 SELECTS、UPDATES、INSERT 查询。主要想法是说,在一天结束时,“我们今天有 x 个查询,即 x1 个 select、x2 个 insert,等等”。

我该怎么做?

谢谢!!

答案1

MySQL 已经维护了内部计数器:

mysqladmin ext | grep -e 'Com_\(update\|select\|insert\)'

不需要日志文件/表/tcpdumping/maatkit。

答案2

当前的 MySQL 版本支持两种不同类型的查询日志:

首先,通用查询日志会跟踪 MySQL 服务器上执行的所有语句,包括 SELECT。但它速度慢、效率低,并且很容易破坏生产数据库的性能,因此请谨慎使用它。

根据您运行的 MySQL 版本,您应该使用“--log”选项或“--general-log”和“--general_log_file”选项,以启用通用查询日志并控制其写入位置。文档有更多详细信息:

如果通用查询日志的运行时惩罚太高,您可以考虑二进制日志 (binlog) 是否可以满足您的需求。binlog 跟踪任何可以更新数据或架构的语句,但不跟踪 SELECT 等只读语句。但 binlog 确实很快且节省磁盘空间,还可以用于复制、备份/恢复等。

启用 binlog 的基本选项是“--log-bin”,还有一些其他相关选项可以精确控制其工作方式。“mysqlbinlog”实用程序(核心 MySQL 服务器安装的一部分)可以将 binlog 的二进制格式解析回 SQL 语句,您可以将其传送到用于汇总查询的任何脚本或程序(例如。mysqlbinlog <BIN_LOG_FILENAME> | <YOUR_SCRIPT_NAME>有关更多信息,请参阅相关文档页面:

答案3

日志都很好 - Irosa 和 Ryan 提到的答案很棒,但你可以完全被动地做到这一点 - 而无需启用日志记录。看看mk-查询-摘要马特吉特。它不仅可以分析 mysql 日志,还可以分析用 tcpdump 捕获的流量。并且“免费”它会给你查询类型/执行时间等的详细分类。

答案4

除了上述两种解决方案(MySQL 查询日志和mk-query-digest),你可能需要看看MySQL 代理可用于记录发送至您的查询mysqld

相关内容