Listando (e encerrando) processos no banco de dados. (MySQL)

Listando (e encerrando) processos no banco de dados. (MySQL)

Overview

Neste artigo rápido e informativo, mergulhamos no mundo do gerenciamento de processos no MySQL. Aprenderemos a listar os processos ativos de forma detalhada, descobriremos como identificar quem está conectado e suas atividades e, mais importante, veremos como podemos interromper forçadamente esses processos quando necessário. É uma leitura essencial para quem deseja manter seu banco de dados rodando de forma suave e segura. Prepare-se para ganhar mais controle sobre seu banco de dados MySQL com estas dicas valiosas!

Neste post, mostro uma forma de listar os processos ativos em um banco MySQL e como encerrar forçadamente eles. Desta forma, você consegue verificar quem está conectado e o que eles estão executando.

O comando que lista os processos que estão abertos no MySQL tem duas formas:

  • Tabela
  • Lista

Se você estiver acessando o MySQL via terminal, recomendo que faça a consulta pelo “modo lista”.

Listando processos no formato TABELA

show full processlist

Listando processos no formato LISTA

show full processlist\G

Explicando as colunas deste comando

Nos dois formatos, você terá as seguintes informações:

  1. ID: Representa a identificação do processo no banco de dados;
  2. User: Usuário conectado no banco. Além dos usuários, pode exibir os seguintes valores:
    • system user: Atividade que está sendo executada internamente em uma thread, pelo próprio MySQL. Neste caso, não possui informações na coluna Host (veja abaixo);
    • unauthenticated user: Está ligada a uma thread que foi iniciada com um cliente (client), mas que ainda não foi autenticada;
    • event_scheduler: Referente a threads de monitoramento agendado;
  3. Host: Hostname do cliente que está conectado. Geralmente são exibidos no formato hostname:porta;
  4. DB: Indica qual banco de dados foi selecionado pelo usuário. Exibe null se nenhum foi selecionado;
  5. Command: O tipo de comando que está sendo executado no momento. Não é a query em si, mas o tipo de comando, que pode ser um dos valores abaixo:
    • Binlog Dump: Thread no servidor principal (master), indicando que logs binarios estão sendo enviados para um servidor secundario (slave);
    • Change user: A thread está executando comando para troca de usuário;
    • Close stmt: A thread está fechando um statement;
    • Connect: Um servidor de replicação (slave) está conectado ao principal (master);
    • Connect Out: Um servidor de replicação (slave) está se conectando ao principal (master);
    • Create DB: A thread está executando um comando de criação de banco;
    • Daemon: Indica que a thread está trabalhando internamente para o servidor e não está disponível para clients;
    • Debug: Thread está gerando informações de debug;
    • Delayed insert: Thread é um gerenciador de inserts com delay;
    • Drop DB: A thread está executando um comando de remoção (drop) de banco;
    • Error: Indica que a thread está com problema. O manual não explica muito este item, mas me parece bastante obvio. 🙂
    • Execute: A thread está executando um comando (prepared statement);
    • Fetch: A thread está recuperando os resultados de um comando (prepared statement). (Vem após o execute);
    • Field List: A thread está recuperando informações referentes as colunas da tabela;
    • Init DB: A thread está selecionando o banco de dados padrão;
    • Kill: A thread está encerrando (matando) outra thread;
    • Long Data: A thread está recuperando um volume grande de informações ao executar um comando (prepared statement);
    • Ping: Thread está trabalhando em um ping que recebeu;
    • Prepare: Thread está preparando um comando (statement) para execução;
    • Processlist: A thread está providenciando as informações para o comando que mostrei logo acima;
    • Query: A thread está executando um statement;
    • Quit: Thread está sendo encerrada;
    • Refresh: A thread está atualizando/renovando informações de tabelas, logs, caches, reiniciando variáveis de status ou informações relativas a servidores de replicação;
    • Register Slave: Thread está registrando um servidor secundario (slave);
    • Reset stmt: A thread está reiniciando um comando (prepared statement);
    • Set option: A thread está definindo uma configuração para execução de comandos pelo cliente;
    • Shutdown: A thread está desligando o servidor;
    • Sleep: A thread está aguardando novos comandos;
    • Statistics: A thread está recuperando informações sobre o servidor;
    • Table Dump: A thread está executando um comando de remoção (drop) de tabela;
    • Time: Não utilizado.
  6. Time: Tempo em segundos que a thread está no estado (Command) atual;
  7. State: Exibe uma ação, evento ou status que indica o que a thread está fazendo. Esta coluna possui um número grande de valores possíveis. Basicamente, ela mostra em qual etapa do command atual ela está. Consulte o manual do MySQL (8.14.2 General Thread States) para ver uma lista completa dos valores possíveis para esta coluna;
  8. Info: Mostra o statement que está sendo executado no momento ou NULL se não estiver executando nada. Se o comando inicial foi uma chamada para uma procedure e ela está executando um select no momento, o comando exibido será o select. No “modo tabela”, esta coluna exibe apenas os 100 primeiros caracteres;

Como matar um dos processos listados

Matar um processo é simples, basta utilizar o comando abaixo:

kill <id>

Você deve substituir o <id> pelo número exibido na coluna ID.

Infelizmente (ou felizmente…) o MySQL não possui opção de matar processos em massa/lote. Para fazer isso, você vai ter que fazer algum script que execute os comandos kill individualmente.

Espero ter ajudado.

Referências: