Log de consulta lenta para apenas um banco de dados

7

posso ativar o log de consultas lentas especificamente para apenas um banco de dados?

O que eu fiz atualmente é levar o log inteiro para o excel e, em seguida, executar um relatório dinâmico para descobrir qual banco de dados é o mais lento. Então, fiz algumas alterações nesse aplicativo, na esperança de reduzir a ocorrência lenta de consultas. em vez de executar meu relatório dinâmico novamente, o que demorou um pouco para limpar os dados. Em vez disso, eu gostaria de produzir consultas lentas a partir de um banco de dados

possível?

    
por Jason 20.06.2011 / 09:20

2 respostas

7

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.

    
por 20.06.2011 / 20:46
3

Eu não acho que você tenha essas opções disponíveis no MySQL, mas existem maneiras de obtê-las, procurei você no google e encontrei alguns links interessantes que podem ajudá-lo a alcançar seu problema.

Espero que isso seja útil:

link

link

    
por 20.06.2011 / 09:52

Tags