我可以只为一个数据库启用慢速查询日志吗?
我现在所做的是把整个日志放到excel中,然后运行一个数据透视表来确定哪个数据库是最慢的。 所以我已经做了一些改变,希望减less查询缓慢的发生。 而不是再次运行我的数据透视报告,这花了一些时间来清理数据我宁愿只从一个数据库输出慢查询
可能?
我有一些非正统的东西,如果你真的想有一个特定的数据库缓慢的查询日志。 请记住,我要提出的build议适用于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)
注意其中一列是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
从这里你可以执行三(3)个选项之一
选项1:通过你想要的数据库查询mysql.slow_log
mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';
选项2:删除mysql.slow_log中所有不是来自任何对象的条目
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
我还有一个你可能会喜欢的非正统观点。
尝试将MyISAM表的.MYD和.MYI移动到另一个磁盘卷。 将符号链接/var/lib/mysql/mysql/slow_log.MYD和/var/lib/mysql/mysql/slow_log.MYI添加到真正.MYD和.MYI的新位置。
如果你认为这很疯狂,那么你可能会喜欢另一个非正统的想法。
如果您已经开启了二进制日志logging,请设置复制以将慢速移动到另一个框。 你在世界上怎么做?
步骤01)使用此选项设置复制从站
[mysqld] replicate-do-db=mysql
步骤02)激活从站上的慢日志
步骤03)在主设备上运行这个命令
SET SQL_LOG_BIN=0; ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;
通过使用BLACKHOLE存储引擎,可以消除主机上慢速日志的磁盘I / O。 从站设置的目的是收集mysql.slow_log的条目。
我不认为你有这样的select在MySQL中,但有办法,你可以得到它,我在谷歌search你,发现一些有趣的链接,可能会帮助你实现你的问题。
希望这是有帮助的: