只有一个数据库的慢查询日志

Jas*_*son 8 mysql

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

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

可能的?

Rol*_*DBA 7

如果你真的想要一个特定数据库的慢查询日志,我有一些不太正统的东西。请记住,我将要建议的内容适用于 MySQL 5.1.30 及更高版本:

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

[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log
Run Code Online (Sandbox Code Playgroud)

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

步骤02)服务mysql重启

mysql 模式中有一个表叫做slow_log

在mysql中运行这个

SHOW CREATE TABLE mysql.slow_log\G
Run Code Online (Sandbox Code Playgroud)

它应该是一个 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
Run Code Online (Sandbox Code Playgroud)

它应该是这样的

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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

选项 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;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

更新 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
Run Code Online (Sandbox Code Playgroud)

Step 02) 激活slave上的slow log

步骤 03) 在 master 上运行此命令

SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;
Run Code Online (Sandbox Code Playgroud)

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