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

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

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

我目前所做的是将整个日志放入 excel,然后运行数据透视表报告来确定哪个数据库最慢。因此,我对该应用程序进行了一些更改,希望减少慢查询的发生。我宁愿只从一个数据库中输出慢查询,而不是再次运行数据透视表报告,这需要一些时间来清理数据

可能的?

答案1

如果您确实想要针对特定​​数据库创建慢查询日志,我有一些非正统的建议。请记住,我即将提出的建议适用于 MySQL 5.1.30 及更高版本:

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

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

日志输出允许您将一般日志和慢速日志的输出指定为表格而不是文本文件。

步骤 02)服务 mysql 重启

mysql 模式中有一个名为 slow_log 的表

在 mysql 中运行这个

SHOW CREATE TABLE mysql.slow_log\G

它应该是一个 CSV 表。

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

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

它应该看起来像这样

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)

请注意,其中一列是D b。您应该添加一个附加索引,如下所示:

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

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

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

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

选项 2:删除 mysql.slow_log 中所有不来自 whateverdbiwant 的条目

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
DELETE FROM mysql.slow_log WHERE db <> 'whateverdbiwant';
SET GLOBAL slow_query_log = @old_log_state;

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

DROP TABLE IF EXISTS mysql.my_slow_log;
CREATE TABLE mysql.my_slow_log LIKE mysql.slow_log;
ALTER TABLE mysql.my_slow_log DROP INDEX db;
ALTER TABLE mysql.my_slow_log DISABLE KEYS;
INSERT INTO mysql.my_slow_log SELECT * FROM mysql.slow_log db='whateverdbiwant';
ALTER TABLE mysql.my_slow_log ENABLE KEYS;

试一试 !!!

更新时间 2011-06-20 18:08 EDT

我还有一个你可能会喜欢的非传统想法。

尝试将 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)在主服务器上运行此命令

SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;

通过使用黑洞存储引擎,这消除了主服务器上慢日志的磁盘 I/O。从服务器的设置使其唯一目的是收集 mysql.slow_log 的条目。

答案2

我认为您在 MySQL 中没有这样的选项,但您可以通过其他方式获得它,我在谷歌中搜索了您并找到了一些有趣的链接,这些链接可能会帮助您解决问题。

希望这对您有帮助:

http://code.google.com/p/mysql-log-filter/

http://www.maatkit.org/doc/mk-query-digest.html

相关内容