Como habilitar o MySQL Query Log?

252

Como habilito a função MySQL que registra cada instrução de consulta SQL recebida dos clientes e o tempo que a instrução de consulta foi enviada? Posso fazer isso no phpmyadmin ou no NaviCat? Como analiso o log?

Feng-Chun Ting
fonte

Respostas:

301

Primeiro, lembre-se de que esse arquivo de log pode crescer muito em um servidor ocupado.

Para o mysql <5.1.29:

Para habilitar o log de consulta, colocar isso em /etc/my.cnfna [mysqld]seção

log   = /path/to/query.log  #works for mysql < 5.1.29

Além disso, para habilitá-lo no console do MySQL

SET general_log = 1;

Consulte http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Para mysql 5.1.29+

Com o mysql 5.1.29+, a logopção está obsoleta. Para especificar o arquivo de log e habilitar o log, use-o em my.cnf na [mysqld]seção:

general_log_file = /path/to/query.log
general_log      = 1

Como alternativa, para ativar o log no console do MySQL (também deve especificar o local do arquivo de log de alguma forma ou encontrar o local padrão):

SET global general_log = 1;

Observe também que existem opções adicionais para registrar apenas consultas lentas ou aquelas que não usam índices.

Gryphius
fonte
1
Isso não está funcionando no MySQL 5.6.19. Eles mudaram de novo?
Alex R
5
general_log = on general_log_file = / path / to / query.log funcionou para mim
Kiren Siva
27
Isso funcionou para mim (MySQL 5.6.12 no Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen
Certifique-se de que o usuário mysql acesse as permissões para o arquivo de log, ou ele retornará um erro 'não encontrado' ao definir o parâmetro general_log no console do MySQL
Will R.
Para 5.6.22, o @youen acertou exatamente. Obrigado! A única coisa a ter certeza é que o diretório e o arquivo que estão sendo gravados existem e são graváveis ​​pelo mysql.
NightOwlPrgmr
189

Dê uma olhada nesta resposta para outra pergunta relacionada. Ele mostra como ativar, desativar e ver os logs em servidores ativos sem reiniciar.

Registre todas as consultas no mysql


Aqui está um resumo:

Se você não deseja ou não pode reiniciar o servidor MySQL, pode proceder assim no seu servidor em execução:

  • Crie suas tabelas de log (veja a resposta )

  • Habilitar o log de consulta no banco de dados (observe que a string 'table' deve ser colocada literalmente e não substituída por qualquer nome de tabela. Obrigado Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Ver o log
select * from mysql.general_log;
  • Desabilitar o log de consulta no banco de dados
SET global general_log = 0;
Alexandre Marcondes
fonte
19
Deve-se notar que 'tabela' deve ser digitada literalmente e não substituída por um nome de tabela em seu banco de dados.
Nicholas Pickering
1
No Mac OS X, o instalador do software MySQL parece ter criado automaticamente a tabela general_log, com o tipo CSV. Isso significa que eu também posso adaptar o arquivo CSV correspondente: sudo tail -f -n 250 /usr
mysql
Após a configuração global log_output = 'table'; a consulta lenta estará gravando em um arquivo? Eu acho que depois do SET global general_log = 0; você deve definir o valor anterior 'log_output', é provável ser 'FILE'
user2602807
59

Eu uso esse método para fazer logon quando quero otimizar rapidamente diferentes carregamentos de páginas. É uma pequena dica ...

Registrando em uma TABLE

SET global general_log = 1;
SET global log_output = 'table';

Você pode então selecionar na minha mysql.general_logtabela para recuperar consultas recentes.

Posso fazer algo semelhante ao tail -fmysql.log, mas com mais refinamentos ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Isso facilita a visualização de minhas consultas que eu posso tentar reduzir. Eu uso um intervalo de 8 segundos para buscar apenas consultas executadas nos últimos 8 segundos.

Layke
fonte
57

Isso já estava em um comentário, mas merece sua própria resposta: Sem editar os arquivos de configuração: no mysql, como root, faça

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

Não se esqueça de desligá-lo depois:

SET global general_log = off;
commonpike
fonte
1
Descobri que sob Linux systemd, se você tenta fazer logon em um arquivo para /tmp/, pode ser acabar em algum lugar como/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley
15

Você pode desativar ou ativar o log de consultas gerais (que registra todas as consultas) com

SET GLOBAL general_log = 1 # (or 0 to disable)
Jon
fonte
No meu caso, o log de consultas gerais não pode ser ativado em servidores de hospedagem compartilhados. Só posso ter o log de consultas lentas ativado e os administradores do sistema podem fornecer as entradas relacionadas à minha conta mediante solicitação.
Feng-Chun Ting
9

Eu também queria ativar o arquivo de log do MySQL para ver as consultas e resolvi isso com as instruções abaixo

  1. Vamos para /etc/mysql/mysql.conf.d
  2. abra o mysqld.cnf

e habilite as linhas abaixo

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. reinicie o MySQL com este comando /etc/init.d/mysql restart
  2. /var/log/mysql/e verifique os logs
estridente
fonte
Não há problema em salvar essas configurações no arquivo conf para serem aplicadas toda vez que o MySQL for iniciado, mas você não precisa reiniciar o MySQL para aplicar essa configuração. Você pode configurá-lo usando 'SET global', como outros disseram.
Anjo
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Sameer Kumar Choudhary
fonte
3

No Windows, você pode simplesmente ir para

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Inserir esta linha no my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

O arquivo my.ini finalmente se parece com isso

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...
HimalayanCoder
fonte
3

Há um erro na versão MySQL 5.6. Até o mysqld mostra como:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

As configurações do Realy estão sendo lidas na seguinte ordem:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Verifique o arquivo: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Espero que ajude alguém.

croonx
fonte
Existe um relatório de bug em algum lugar para esse bug?
Mwfearnley #
1

para mysql> = 5.5 apenas para consultas lentas (1 segundo e mais) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
lptn
fonte
1
Isso está incorreto - isso habilita o log de consulta lento, não o log de consulta.
Sam Dufel
Eu acho que você tem que usar traços.
AFA Med
1

Para habilitar o log de consulta na máquina MAC:

Abra o seguinte arquivo:

vi /private/etc/my.cnf

Defina o URL do log de consulta na seção 'mysqld' da seguinte maneira:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Poucas máquinas não estão registrando a consulta corretamente; portanto, você pode habilitá-la no console do MySQL

mysql> SET global general_log = 1;
Kumanan
fonte
1

Não é exatamente uma resposta para a pergunta, porque a pergunta já tem ótimas respostas. Esta é uma informação lateral. A ativação do general_log realmente prejudica o desempenho do MySQL. Saí general_log =1acidentalmente em um servidor de produção e passei horas descobrindo por que o desempenho não era comparável a uma configuração semelhante em outros servidores. Então eu encontrei isso que explica o impacto da ativação do log geral. http://www.fromdual.com/general_query_log_vs_mysql_performance .

A essência da história, não coloque general_log=1no .cnfarquivo. Em vez disso, use set global general_log =1por um breve período apenas para registrar o suficiente para descobrir o que você está tentando descobrir e, em seguida, desligue-o.

Allen King
fonte
0

No phpMyAdmin 4.0, você acessa Status> Monitor. Lá, você pode ativar o log de consultas lento e o log geral, ver um monitor ao vivo, selecionar uma parte do gráfico, ver as consultas relacionadas e analisá-las.

Marc Delisle
fonte
0

Eu tive que largar e recriar o log geral em um ponto. Durante a recreação, os conjuntos de caracteres foram confusos e acabei tendo esse erro nos logs:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Portanto, se a resposta padrão de "verificar para garantir que o logon está ativado" não funcionar, verifique se seus campos têm o conjunto de caracteres correto.

William Neely
fonte