【问题标题】:MySQL Check historical queries being runMySQL 检查正在运行的历史查询
【发布时间】:2022-02-08 21:01:44
【问题描述】:

是否有存储在 MySQL 上运行的所有历史查询的表/位置?

我想对历史查询进行分析,以确定在每个表中创建什么索引。

【问题讨论】:

  • 好主意,但我认为它们不会存储在任何地方。不过,通常监控工具会这样做。

标签: mysql


【解决方案1】:

您可以通过创建 slow_loggeneral_log 表来做到这一点。

MySQL 服务器提供了一种显示一般查询日志和慢查询日志的方法,如果这些日志已启用

首先,检查 MySQL 数据库中是否已经存在 slow_loggeneral_log 这两个表。

如果您还没有它们 - 那么您必须创建它们。 确保在 MySQL 数据库中创建它们。

创建general_log 表:

CREATE TABLE `general_log` (
    `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `user_host` mediumtext NOT NULL,
    `thread_id` bigint (21) unsigned NOT NULL,
    `server_id` int(10) unsigned NOT NULL,
    `command_type` varchar(64) NOT NULL,
    `argument` mediumtext NOT NULL) ENGINE = CSV DEFAULT CHARSET = utf8 COMMENT = 'General log'

一般查询日志是mysqld正在做什么的一般记录。

在那里你会找到如下信息:

  • 客户端连接或断开连接时
  • 从客户端收到的每条 SQL 语句

对于slow_log 表:

CREATE TABLE `slow_log` (
    `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `user_host` mediumtext NOT NULL,
    `query_time` time NOT NULL,
    `lock_time` time NOT NULL,
    `rows_sent` int(11) NOT NULL,
    `rows_examined` int(11) NOT NULL,
    `db` varchar(512) NOT NULL,
    `last_insert_id` int(11) NOT NULL,
    `insert_id` int(11) NOT NULL,
    `server_id` int(10) unsigned NOT NULL,
    `sql_text` mediumtext NOT NULL,
    `thread_id` bigint (21) unsigned NOT NULL) ENGINE = CSV DEFAULT CHARSET = utf8 COMMENT = 'Slow log'

慢查询日志由执行时间超过 long_query_time 秒且需要检查 leastmin_examined_row_limit 行的 SQL 语句组成。

慢查询日志可用于查找需要很长时间执行的查询,因此是优化的候选对象(在您的情况下为索引)。

然后你需要启用它(如果你还没有启用它):

SET global general_log = 1;
SET global log_output = 'table'; 

现在您可以通过运行以下查询来查看日志:

SELECT * FROM   mysql.general_log; 

如果要禁用数据库上的查询日志记录,请运行此查询

SET global general_log = 0; 

请注意,打开此功能会带来一些注意事项,例如消耗磁盘空间和类似的性能考虑,因此您可以根据需要打开和关闭它,而不是始终保持打开状态。

在此处阅读有关这些的更多信息:

【讨论】:

  • 你应该添加大写字母,这样会很快消耗大量磁盘空间
  • 你说得对,我更新了我的答案。
  • 嗨@Ben,感谢您的帮助。我已经打开 MySQL 并检查了。 sql_text 的默认数据类型是 BLOB,我该如何处理?
  • 我不确定我是否理解您的问题。那里有什么问题?
  • @Ben,我没有使用CREATE TABLE 语句,我只是使用了 SET global general_log = 1;设置全局 log_output = '表';但是 sql_text 列使用的是 BLOB 数据类型。我无法打开它来查看它。
猜你喜欢
  • 2011-02-15
  • 2017-05-11
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2019-01-27
相关资源
最近更新 更多