AWS RDS MySQL / Log de consulta lenta

7

Estou tentando analisar consultas lentas no meu sistema e li que deveria ativar o "Log de consultas lentas". É curioso como posso visualizar esse log quando estou usando uma instância do MySQL hospedada no Amazon Web. RDS do serviço.

    
por Philip Isaacs 06.11.2012 / 21:46

2 respostas

10

Você sabia que há uma tabela de log lenta? É chamado mysql.slow_log :

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
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.01 sec)

mysql>

Existem duas variáveis que você deve ativar para iniciar a gravação de consultas lentas no mysql.slow_log:

Aqui está a situação

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.01 sec)

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.01 sec)

mysql>

log_output é já padrão para TABLE . Você precisará ativar o slow_query_log . Aqui está o que você deve fazer:

Se sua instância do RDS não tiver um grupo de parâmetros de banco de dados ...

  1. Acione uma instância do MySQL do AmazonRDS que usa um grupo de parâmetros de banco de dados.
  2. Edite o grupo de parâmetros de banco de dados configurando o slow_query_log como 1
  3. Reinicie a instância de banco de dados

Se sua instância do RDS tiver um grupo de parâmetros de banco de dados ...

  1. Edite o grupo de parâmetros de banco de dados configurando o slow_query_log como 1
  2. Reinicie a instância de banco de dados

Uma vez que a Instância foi reiniciada, faça o login no mysql e execute esta consulta

mysql> SELECT SLEEP(15);

Como o padrão para long_query_time é de 10 segundos, a consulta SELECT SLEEP(15); deve aparecer em mysql.slow_log . Leia a documentação do RDS para ver se há algum limite na tabela.

CAVEAT

Aqui está um aviso justo. Observe que mysql.slow_log é um arquivo CSV. A mesa não tem chave. Enquanto você pode consultar a tabela, ela fará varreduras de tabela completas. Seria ótimo se você pudesse fazer o seguinte:

ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);

Em seguida, você pode consultar muito rapidamente para intervalos de data e hora. Eu tentei rodar isso e eu entendi isso:

mysql> ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ERROR 1044 (42000): Access denied for user 'lwdba'@'%' to database 'mysql'
mysql>

Verifique a documentação do RDS para ver se a Amazon pode fazer isso por você.

Experimente!

    
por 06.11.2012 / 23:31
1

Você também pode copiar a tabela para uma nova em um banco de dados diferente e criar a nova MyISAM:

create table my_slow_logs as select * from mysql.slow_log;
alter table my_slow_logs engine=MyISAM;

(então select from my_slow_logs... )

O Amazon RDS permite isso, desde que você faça isso fora do banco de dados MySQL.

    
por 07.04.2015 / 20:58