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”.

show full processlist
tsql
show full processlist\G
tsql

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;

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

kill <id>
tsql

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: