Como mostrar as últimas consultas executadas no MySQL?

471

Existe alguma consulta / maneira de mostrar as últimas consultas executadas em TODOS os servidores?

FerranB
fonte

Respostas:

793

Para aqueles abençoados com MySQL> = 5.1.12, você pode controlar esta opção globalmente em tempo de execução:

  1. Executar SET GLOBAL log_output = 'TABLE';
  2. Executar SET GLOBAL general_log = 'ON';
  3. Dê uma olhada na mesa mysql.general_log

Se você preferir gerar um arquivo em vez de uma tabela:

  1. SET GLOBAL log_output = "FILE"; o padrão .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Prefiro esse método à edição de arquivos .cnf porque:

  1. você não está editando o my.cnf arquivo e ativando permanentemente o log
  2. você não está pescando no sistema de arquivos procurando o log de consultas - ou pior, distraído com a necessidade do destino perfeito. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Você não precisa reiniciar o servidor e interromper nenhuma conexão atual.
  4. reiniciar o servidor deixa você onde você começou (o log ainda está desativado)

Para obter mais informações, consulte o Manual de Referência do MySQL 5.1 - Variáveis ​​do sistema do servidor - general_log

FlipMcF
fonte
4
Ótimo design de interface do usuário. De qualquer forma, as tabelas de log do MySQL estão realmente usando o mecanismo CSV, para que você possa fazer tudo o que o FlipMcF disse na resposta sobre a ativação do logon na tabela general_log e ter o tail -f do general_log como este: tail -f / var / lib / mysql / mysql / general_log.CSV #
2
caramba, o documento do mysql nem sequer disparou no parâmetro da tabela. Muito obrigado.
Abhishek Dujari
6
lembre-se de limpar sua mesa de registo geral quando tiver terminado: "truncar tabela mysql.general_log"
pdwalker
1
Eu obtive o resultado dessa maneira, mas os parâmetros estão presentes por ponto de interrogação, por exemplo, selecione foo na barra em que x = ?. Como posso obter a consulta completa?
okwap 4/11/2015
43

Você pode ativar um log de consulta geral para esse tipo de diagnóstico. Geralmente, você não registra todas as consultas SELECT em um servidor de produção, mas é um matador de desempenho.

Edite sua configuração do MySQL, por exemplo, /etc/mysql/my.cnf - procure ou adicione uma linha como esta

[mysqld]
log = /var/log/mysql/mysql.log

Reinicie o mysql para captar essa alteração, agora você pode

tail -f /var/log/mysql/mysql.log

Olá presto, você pode assistir as consultas quando elas entram.

Paul Dixon
fonte
4
general_log_file e general_log no meu my.cnf
Martin Thoma 14/11
Isso está funcionando, se você quiser saber o reinício mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar
1
As versões mais recentes do Mac OS X (pelo menos no Mac OS X) requerem as opções general_log_file e general_log em vez de apenas "log =". Caso contrário, você receberá um erro como este: ERRO / usr / local / mysql / bin / mysqld: opção ambígua '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth
@ JaySheth, eu recebi esse erro no Mariadb 10.2, por isso não tenho certeza de que esteja relacionado apenas ao Mac OS.
user10089632
16

Você pode fazer a coisa certa para monitorar os logs de consultas do mysql.

Abra o arquivo de configuração mysql my.cnf

sudo nano /etc/mysql/my.cnf

Pesquise as seguintes linhas em um [mysqld]cabeçalho e remova o comentário dessas linhas para ativar o registro

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Reinicie o servidor mysql para refletir as alterações

sudo service mysql start

Monitore o log do servidor mysql com o seguinte comando no terminal

tail -f /var/log/mysql/mysql.log
Rokibul Hasan
fonte
15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
zloctb
fonte
9

1) Se o registro geral do mysql estiver ativado, podemos verificar as consultas no arquivo ou tabela de log com base no que mencionamos na configuração. Verifique o que está ativado com o seguinte comando

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Se precisarmos do histórico de consultas na tabela,

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Dê uma olhada na tabela mysql.general_log

Se você preferir gerar um arquivo:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Também podemos verificar as consultas no arquivo .mysql_history cat ~ / .mysql_history

minhas23
fonte
4

Se o mysql binlog estiver ativado, você poderá verificar os comandos executados pelo usuário executando o seguinte comando no console linux, navegando para o diretório mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

possibilitando

[mysqld]
log = /var/log/mysql/mysql.log

ou log geral afetará o desempenho do mysql

Avinash Singh
fonte
possível, mas doloroso. mais útil se você estiver olhando para ver o que aconteceu no passado.
Pdwalker #
2

Se você não quiser alterar sua configuração do MySQL, poderá usar um profiler SQL como "Neor Profile SQL" http://www.profilesql.com .

Bitclaw
fonte
2

Depois de ler a resposta de Paul, continuei procurando mais informações em https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Encontrei um código realmente útil por uma pessoa. Aqui está o resumo do contexto.

(Nota: O código a seguir não é meu)

Este script é um exemplo para manter a tabela limpa, o que ajudará você a reduzir o tamanho da tabela. Como depois de um dia, haverá cerca de 180 mil consultas de log. (em um arquivo, seriam 30 MB por dia)

Você precisa adicionar uma coluna adicional (event_unix) e, em seguida, pode usar esse script para manter o log limpo ... ele atualizará o registro de data e hora em um registro de data e hora do Unix, excluirá os logs com mais de 1 dia e, em seguida, atualizar o event_time no registro de data e hora do event_unix ... parece um pouco confuso, mas está funcionando muito bem.

Comandos para a nova coluna:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Script de limpeza:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

O crédito é para Sebastian Kaiser (escritor original do código).

Espero que alguém ache útil como eu.

Dev Aggarwal
fonte
Interessante. Você perderia consultas durante a limpeza, a menos que bloqueasse todos os bancos de dados primeiro. Existem outros problemas que podem surgir aqui. Se estivermos nesse ponto do registro 'contínuo', eu usaria o registro de arquivos ou o registro do compartimento e um rotador de registro pronto para uso.
FlipMcF
1

Você pode ver o seguinte no linux

cd /root

ls -al

vi .mysql_history Pode ajudar

Avinash Singh
fonte
6
Isto olha como ele só iria trabalhar para o cliente oficial mysql de linha de comando, e apenas para consultas executadas pelo usuário root
Golimar
A pergunta diz 'todo o servidor', o que torna esta resposta incorreta. Isso mostraria todas as consultas executadas por um único cliente.
FlipMcF
Se o mysql binlog estiver ativado, você poderá verificar os comandos executados pelo usuário executando o seguinte comando no console linux, navegando até o diretório mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql ativando o [mysqld] log = / var / log / mysql / O mysql.log ou o log genral afetará o desempenho do mysql
Avinash Singh
De qualquer forma, algumas entradas são suprimidas por padrão, cadeias contendo "senha", por exemplo.
Mckenzm