仅查询一个数据库的慢查询日志

Modified on: Wed, 14 Aug 2019 07:00:02 +0800

我可以专门为一个数据库启用慢查询日志吗?

我目前所做的是将整个日志记录到excel中,然后运行数据透视报告以确定哪个数据库最慢。所以我已经离开并对该应用程序进行了一些更改,以期减少查询的缓慢发生。而不是再次运行我的枢轴报告,花了一些时间来清理数据,而不是只从一个数据库输出慢速查询

可能?

作者:Jason

最佳答案

如果您真的想要为特定数据库设置慢查询日志,我会有一些非正统的东西。请记住,我要建议的内容适用于MySQL 5.1.30及以上版本:

步骤01)首先将这些添加到/etc/my.cnf

[mysqld] log-output=TABLE slow-query-log slow-query-log-file=slow-queries.log

log-output < / strong>允许您将常规日志和慢速日志的输出指定为表而不是文本文件。

步骤02)服务mysql重启

mysql架构中有一个名为slow_log

的表

在mysql中运行此

[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log

它应该是CSV表格。

步骤03)将其转换为MyISAM并在start_time列上索引表

SHOW CREATE TABLE mysql.slow_log\G

看起来应该是这样的

mysql&gt; show create table mysql.slow_log\G *************************** 1. row *************************** Table: slow_log Create Table: 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, KEY `start_time` (`start_time`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log' 1 row in set (0.00 sec)

请注意,其中一列是db。您应该添加一个额外的索引,如下所示:

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

从这里你可以执行三(3)个选项中的一个

选项1:通过您想要的数据库查询mysql.slow_log

mysql&gt; SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';

选项2:删除mysql.slow_log中不是来自于任何人的所有条目

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: 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,
  KEY `start_time` (`start_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

选项3:将所有条目复制到另一个slow_log表中,供您从

查询

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ADD INDEX db (db,start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

试一试!!!

更新2011-06-20 18:08美国东部时间

我还有一个非常正统的想法。

尝试移动MyISAM表的.MYD和.MYI,以便慢速登录到另一个磁盘卷。它们是符号链接/var/lib/mysql/mysql/slow_log.MYD和/var/lib/mysql/mysql/slow_log.MYI到真实.MYD和.MYI的新位置。

如果你认为这很疯狂,那么这可能是你想要的另一个非正统的想法。

如果您已启用二进制日志记录,请设置复制以将缓慢移动到另一个框。你怎么做到这一点?

步骤01)使用此选项设置复制从站

[mysqld] replicate-do-db=mysql

步骤02)激活从属

的慢速登录

步骤03)在主

上运行此命令

mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';

使用BLACKHOLE存储空间引擎,这消除了磁盘I / O到主机上的慢速登录。设置slave以便其唯一目的是收集mysql.slow_log的条目。


相关问答

添加新评论