O que é o General Query Log?

O General Query Log contém uma lista de informações geral sobre conexão, desconexão e queries nos clientes. Muito utilizado quando há uma necessidade de monitoramento das queries que estão sendo enviadas para o MySQL/MariaDB.

Ponto de atenção: você deve tomar cuidado com o general query log ativo, pois como ele guarda qualquer informação que o MySQL Server está fazendo o crescimento do arquivo de log é acelerado.

Habilitando o General Query Log:

Para habilitar o General Query log você precisa setar o valor 1 para a variável general_log.  Pode ser adicionado, também, no arquivo cnf ou da seguinte forma:

Configurando o nome do arquivo do General Log:

Por padrão, o general_log é escrito com o hostname do server ficando ${hostname}.txt no datadir do servidor, porém ele pode ser alterado, tanto dinamicamente, como via my.cnf. É possível, também, adicionar o caminho absoluto. Exemplo:

Você pode, também, configurar o general log, e adicionar um valor para log-basename, que configura um prefixo comum entre todos os arquivos de log.  Para o general log ele terá o nome do log-basename + .log. Igual, as formas anteriores para alterar. Pode ser, tanto no dinâmico, como, no arquivo cnf.

Importante log-basename, não por ser um caminho absoluto. O nome do log é sempre relativo ao datadir.

log-basename = servidor-176

Alterando o destino do general log.

Por padrão, o MariaDB salva o general log em arquivos, você pode adicionar no my.cnf para deixar explícito, ou, caso precise voltar ao padrão, pode rodar os seguintes comandos.

Alterando dinamicamente:

SET GLOBAL log_output='FILE';

Alterando via CNF:

log_output=FILE

Ou, você pode alterar para esses valores serem salvos em uma tabela:

Alterando dinamicamente:

SET GLOBAL log_output='TABLE';

Alterando via CNF:

log_output=TABLE

Os valores serão salvos em uma tabela chamada general_log no banco mysql.

As alterações ficam assim em arquivo:

E ficarão assim quando o modelo selecionado for tabela:

É possível, também, salvar nos dois ao mesmo tempo, separando os valores no my.cnf por virgula:

log_output=FILE, TABLE

Benefícios de usar tabela:

  • Os logs vão seguir no padrão da tabela mysql.general_log.
  • Os logs poderão ser acessados com comandos SQL. Dessa forma, você pode fazer o filtro de maneira mais rápida e fácil.
  • Logs podem ser acessados remotamente, de qualquer cliente que tenha acesso ao banco de dados.

Características da tabela de general log:

  • Por padrão, as tabelas de logs usam a engine CSV. Dessa forma, é possível que um usuário que contenha acesso pode copiar e importar em outros programas que processam CSV.
  • É possível alterar as tabelas de log para MyISAM, mas não é possível alterá-las para InnoDB.
  • Pode ser executado TRUNCATE TABLE para limpar a tabela.
  • Para fazer o log rotation é possível renomear a tabela com o RENAME TABLE.
  • Não é possível realizar um LOCK TABLE.
  • INSERT, DELETE e UPDATE, não podem ser executados.
  • Não é possível fazer dump do conteúdo da tabela.
  • Não é permitido fazer particionamento.
  • As escritas nas tabelas de log não são escritas no bin log, então não será replicado.
  • O server sempre vai conseguir fazer a escrita, mesmo estando com read_only ativo.

Desabilitando general log para uma sessão:

Caso você seja um usuário com permissão super, você pode desabilitar o general log para sua sessão da seguinte maneira:

SET SESSION SQL_LOG_OFF=1;

Na imagem abaixo é possível ver que ele registra o primeiro select, porém o segundo após desativar para a sessão ele não registra:

Desabilitando general log para algumas declarações.

A partir do MariaDB 10.3 é possível desabilitar o registro de algumas queries, utilizando a variável log_disabled_statements, essa opção não pode ser alterada dinamicamente, precisamos alterar no arquivo cnf e reiniciar o servidor.

Podemos desabilitar para declarações de slave e stored procedure:

log_disabled_statements='slave,sp'