Identificando Querys Lentas no Banco MySQL [Slow Query Log]


Fala pessoal,

O slow query log pode ser usado para encontrar consultas que levam muito tempo para executar e, portanto, são candidatas à otimização.
O Slow Query Log ou log de querys lenta consiste em um log de instruções SQLs que demoraram mais do que o tempo definido no parametro: long_query_time para executar.
Depois que uma instrução é executada, o mysqld escreve uma declaração no arquivo de slow query log.


Os valores mínimos e padrão de long_query_time são 0 e 10, respectivamente. O valor pode ser especificado para uma resolução de microssegundos.
Por padrão, não são registradas as consultas que não utilizam índices para pesquisas ou que realizam um SELECT *. Esse comportamento pode ser alterado usando a variável de sistema: log_queries_not_using_indexes. Mas, atenção, ativar este parametro pode fazer o log crescer em seu tamanho, pois, consultas que não utilizam índices serão registradas no log.

Por padrão, o slow query log está desabilitado. Para iniciá-lo, use a variável de sistema global slow_query_log [= {0 | 1}], OFF/ON.
Para especificar um caminho/nome de arquivo de log, use a variável de sistema global: slow_query_log_file = file_name.

Se você não especificar nenhum nome para o arquivo de slow query log, o nome padrão é host_name-slow.log. O servidor cria o arquivo no diretório de dados a menos que um nome de caminho absoluto seja dado para especificar um diretório diferente.

Vale informar também que por padrão, uma replicação para outro servidor(master x slave) por exemplo, não escreve consultas replicadas no slow query log. Para alterar isso, use a variável de sistema log_slow_slave_statements. Esta variável permite o registro de consultas que levaram mais do que long_query_time para serem executadas no slave.

Examinar um longo e lento arquivo de log pode se tornar uma tarefa difícil. Para tornar isso mais fácil, você pode processar um slow query log usando o comando
mysqldumpslow(https://dev.mysql.com/doc/refman/5.7/en/mysqldumpslow.html) para resumir as consultas que aparecem no log.

Vamos a um exemplo simples:

Primeiro verificamos que o mecanismo de slow query log está desabilitado através da variável de sistema: slow_query_log, como abaixo. Note que o arquivo de log pode ser por padrão criado, caso você não informe outro diretório/arquivo através da variável: slow_query_log_file.

mysql> show global variables like '%slow_query%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| slow_query_log      | OFF                                  |
| slow_query_log_file | /var/lib/mysql/mysql-master-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.00 sec)

mysql>

Legal, agora com o banco online vamos ativar o slow query log, afetando todas as sessões do banco em execução:

mysql> set global slow_query_log = ON;
Query OK, 0 rows affected (0.06 sec)

mysql> show global variables like '%slow_query%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| slow_query_log      | ON                                   |
| slow_query_log_file | /var/lib/mysql/mysql-master-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.01 sec)

Certo, veja o arquivo de log que foi criado: mysql-master-slow.log no diretório padrão: /var/lib/mysql.

[root@mysql-master mysql]# pwd
/var/lib/mysql

[root@mysql-master mysql]# ll
total 122972
-rw-r-----. 1 mysql mysql       56 Feb 18  2017 auto.cnf
-rw-------. 1 mysql mysql     1679 Feb 18  2017 ca-key.pem
-rw-r--r--. 1 mysql mysql     1074 Feb 18  2017 ca.pem
-rw-r--r--. 1 mysql mysql     1078 Feb 18  2017 client-cert.pem
-rw-------. 1 mysql mysql     1675 Feb 18  2017 client-key.pem
drwxr-x---. 2 mysql mysql     4096 Oct 14 17:10 DB_TESTE
-rw-r-----. 1 mysql mysql      344 Oct 15 18:31 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Oct 26 09:34 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Oct 26 09:34 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Feb 18  2017 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Oct 26 09:34 ibtmp1
drwxr-x---. 2 mysql mysql     4096 Feb 18  2017 mysql
-rw-r-----. 1 mysql mysql     1682 Oct 15 18:31 mysql-bin.000001
-rw-r-----. 1 mysql mysql      154 Oct 26 09:34 mysql-bin.000002
-rw-r-----. 1 mysql mysql       64 Oct 26 09:34 mysql-bin.index
-rw-rw----. 1 root  root         5 Oct 26 09:34 mysqld_safe.pid
-rw-r-----. 1 mysql mysql      183 Oct 26 18:40 mysql-master-slow.log
srwxrwxrwx. 1 mysql mysql        0 Oct 26 09:34 mysql.sock
-rw-------. 1 mysql mysql        5 Oct 26 09:34 mysql.sock.lock
drwxr-x---. 2 mysql mysql     4096 Feb 18  2017 performance_schema
-rw-------. 1 mysql mysql     1675 Feb 18  2017 private_key.pem
-rw-r--r--. 1 mysql mysql      451 Feb 18  2017 public_key.pem
-rw-r--r--. 1 mysql mysql     1078 Feb 18  2017 server-cert.pem
-rw-------. 1 mysql mysql     1679 Feb 18  2017 server-key.pem
drwxr-x---. 2 mysql mysql    12288 Feb 18  2017 sys
drwxr-x---. 2 mysql mysql     4096 Oct 15 10:59 test_replication
[root@mysql-master mysql]#

Você pode alterar de forma definitiva e deixar ativado esta funcionalidade, incluindo esta configuração do arquivo de configuração do MySQL, my.cnf, como abaixo:

Edite o arquivo com: vi /etc/my.cnf
Inclua as linhas abaixo:

slow-query-log           = ON
slow-query-log-file      = /var/lib/mysql/mysql-master-slow.log

Feito isso é preciso dar um restart no banco MySQL.


Vamos testar a funcionalidade agora.
Realize uma consulta com sleep, como abaixo. Primeiro com 9 e depois com 10, para que a consulta sql fique aguardando x tempo:

mysql> select sleep(9);
+----------+
| sleep(9) |
+----------+
|        0 |
+----------+
1 row in set (9.00 sec)

mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.03 sec)

E em outra sessão execute um tail -f no mysql-master-slow.log:
Perceba que uma query que demorar 9 segundos para executar não será logada, mas a partir de 10 que é o default já estará no arquivo:

[root@mysql-master mysql]# pwd
/var/lib/mysql

[root@mysql-master mysql]# tail -f mysql-master-slow.log

/usr/sbin/mysqld, Version: 5.7.17-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
/usr/sbin/mysqld, Version: 5.7.17-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-26T20:55:08.286620Z
# User@Host: root[root] @ localhost []  Id:     4
# Query_time: 10.029487  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1509051308;
select sleep(10);

É isso ai pessoal, boa sorte.

Ronaldo

Nenhum comentário:

Postar um comentário