Eu tenho algo um pouco ortodoxo se você realmente quiser ter um log de consultas lentas para um banco de dados específico. Tenha em mente que o que estou prestes a sugerir funciona para o MySQL 5.1.30 e superior:
Passo 01) Comece por adicioná-los ao /etc/my.cnf
[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log
saída de log permite que você especifique a saída de logs gerais e logs lentos para serem tabelas em vez de arquivos de texto.
Step 02) service mysql restart
Existe uma tabela no esquema mysql chamada slow_log
No mysql, execute isto
SHOW CREATE TABLE mysql.slow_log\G
Deve ser uma tabela CSV.
Passo 03) Converta-o para MyISAM e indexe a tabela na coluna 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
Deveria se parecer com isso
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)
Observe que uma das colunas é db . Você deve adicionar um índice adicional da seguinte forma:
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
A partir daqui, você pode executar uma de três (3) opções
OPÇÃO 1: Consulta mysql.slow_log pelo banco de dados que você deseja
mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';
OPÇÃO 2: Apagar todas as entradas em mysql.slow_log que não vêm de qualquer dbiwant
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;
OPÇÃO 3: Copie todas as entradas em outra tabela slow_log para você consultar a partir de
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;
Experimente!
ATUALIZAÇÃO 2011-06-20 18:08 EDT
Eu tenho uma ideia não ortodoxa adicional que você pode gostar.
Tente mover o .MYD e .MYI da tabela MyISAM para o log lento em outro volume de disco. Teu link simbólico /var/lib/mysql/mysql/slow_log.MYD e /var/lib/mysql/mysql/slow_log.MYI para o novo local do real .MYD e .MYI.
Se você pensou que era louco, aqui está outra ideia não ortodoxa que você pode gostar.
Se você já tiver o log binário ativado, configure a replicação para mover o lento para outra caixa. Como no mundo você faz isso?
Passo 01) Configure o escravo de replicação com esta opção
[mysqld]
replicate-do-db=mysql
Passo 02) Ative o log lento no escravo
Passo 03) Execute este comando no master
SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;
Ao usar o mecanismo de armazenamento BLACKHOLE , isso elimina o disco I / O para o log lento no mestre. O escravo é configurado para que seu único propósito seja coletar entradas para mysql.slow_log.