Como posso rastrear consultas MySQL no meu servidor Linux à medida que elas acontecem?
Por exemplo, eu adoraria configurar algum tipo de ouvinte, solicitar uma página da web e visualizar todas as consultas que o mecanismo executou ou apenas visualizar todas as consultas que estão sendo executadas em um servidor de produção. Como posso fazer isso?
mysql
monitoring
barfoon
fonte
fonte
Respostas:
Você pode executar o comando MySQL
SHOW FULL PROCESSLIST;
para ver quais consultas estão sendo processadas a qualquer momento, mas isso provavelmente não alcançará o que você espera.O melhor método para obter um histórico sem precisar modificar todos os aplicativos usando o servidor é provavelmente através de gatilhos. Você pode configurar gatilhos para que cada consulta executada faça com que a consulta seja inserida em algum tipo de tabela de histórico e crie uma página separada para acessar essas informações.
Lembre-se de que isso provavelmente diminuirá consideravelmente tudo o que está no servidor, adicionando um extra
INSERT
a cada consulta.Edit: outra alternativa é o General Query Log , mas tê-lo gravado em um arquivo simples removeria muitas possibilidades de flexibilidade de exibição, especialmente em tempo real. Se você quiser apenas uma maneira simples e fácil de implementar para ver o que está acontecendo, habilitar o GQL e, em seguida, usar a execução
tail -f
no arquivo de log faria o truque.fonte
Você pode registrar todas as consultas em um arquivo de log com muita facilidade:
Faça suas consultas (em qualquer banco de dados). Grep ou examinar de outra forma
/var/run/mysqld/mysqld.log
Então não esqueça de
ou o desempenho cairá e seu disco será preenchido!
fonte
tail -f -n300 /var/run/mysqld/mysqld.log
para acompanhar ao vivo do seu arquivo de logSELECT name FROM person where id=?
mas não sei o queid
é.SHOW VARIABLES
não funcionou para mim. No entanto,SELECT @@GLOBAL.general_log_file;
funciona bem. (MariaDB 10.1.9)SHOW VARIABLES LIKE "log_output%"
. Se estiver definido comotable
, os logs serão salvos no próprio banco de dados, a tabelamysql.general_log
não está no sistema de arquivos. Você pode alterá-lo parafile
comSET GLOBAL log_output = 'file';
Mesmo que uma resposta já tenha sido aceita, eu gostaria de apresentar qual poderia ser a opção mais simples:
Isso imprimirá as consultas atuais na tela a cada segundo.
-u
O usuário do mysql que você deseja executar o comando como-p
Solicite sua senha (para que você não precise salvá-la em um arquivo ou para que o comando apareça no seu histórico de comandos)i
O intervalo em segundos.--verbose
sinalizador para mostrar a lista completa de processos, exibindo a consulta inteira para cada processo. (Obrigado, nmat )Existe uma possível desvantagem: as consultas rápidas podem não aparecer se forem executadas entre o intervalo que você configurou. IE: Meu intervalo é definido em um segundo e, se houver uma consulta que demora
.02
alguns segundos para ser executada e é executada entre intervalos, você não a verá.Use essa opção de preferência quando desejar verificar rapidamente a execução de consultas sem precisar configurar um ouvinte ou qualquer outra coisa.
fonte
--verbose
para ver as consultas completasExecute esta consulta SQL conveniente para ver as consultas MySQL em execução. Pode ser executado a partir de qualquer ambiente que você quiser, sempre que quiser, sem nenhuma alteração ou sobrecarga de código. Pode exigir alguma configuração de permissões do MySQL, mas, para mim, é executado sem nenhuma configuração especial.
O único problema é que muitas vezes você perde as consultas que são executadas muito rapidamente, por isso é mais útil para consultas de execução mais longa ou quando o servidor MySQL tem consultas que estão fazendo backup - na minha experiência, esse é exatamente o momento em que desejo visualizar " consultas ao vivo ".
Você também pode adicionar condições para torná-lo mais específico a qualquer consulta SQL.
Por exemplo, mostra todas as consultas em execução por 5 segundos ou mais:
por exemplo, Mostrar todas as atualizações em execução:
Para obter detalhes completos, consulte: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
fonte
Estou em uma situação específica em que não tenho permissões para ativar o logon e não teria permissões para ver os logs se eles estivessem ativados. Não foi possível adicionar um gatilho, mas eu tinha permissões para chamar show processlist. Então, esforcei-me ao máximo e cheguei a isso:
Crie um script bash chamado "showsqlprocesslist":
Execute o script:
Cauda da saída:
Bingo Bango. Mesmo que não seja acelerado, ele consumiu apenas 2-4% da CPU nas caixas em que o executei. Espero que talvez isso ajude alguém.
fonte
strace
A maneira mais rápida de ver consultas ao vivo do MySQL / MariaDB é usar o depurador. No Linux, você pode usar
strace
, por exemplo:Uma vez que existem muitos caracteres de escape, você pode formatar a saída do strace pela tubulação (basta adicionar
|
entre estes dois one-liners) acima para o seguinte comando:Portanto, você deve ver consultas SQL bastante limpas sem tempo, sem tocar nos arquivos de configuração.
Obviamente, isso não substituirá a maneira padrão de ativar logs, descrita abaixo (que envolve recarregar o servidor SQL).
dtrace
Use os testes do MySQL para visualizar as consultas ao vivo do MySQL sem tocar no servidor. Script de exemplo:
Salve o script acima em um arquivo (como
watch.d
) e execute:Saiba mais: Introdução ao MySQL DTracing
Gibbs MySQL Spyglass
Veja esta resposta .
Histórico
Aqui estão as etapas úteis para propostas de desenvolvimento.
Adicione estas linhas ao seu
~/.my.cnf
ou globalmy.cnf
:Caminhos:
/var/log/mysqld.log
ou/usr/local/var/log/mysqld.log
também podem funcionar dependendo das suas permissões de arquivo.então reinicie seu MySQL / MariaDB (prefixo com
sudo
se necessário):Em seguida, verifique seus logs:
Depois de terminar, a mudança
general_log
para0
(assim você pode usá-lo no futuro), em seguida, remover o arquivo e reiniciar o servidor SQL novamente:killall -HUP mysqld
.fonte
general_log
partir de uma consulta MySQL. Ele começará a gravar no arquivo quegeneral_log_file
está apontando.Esta é a configuração mais fácil em uma máquina Linux Ubuntu que eu já encontrei. É louco ver todas as consultas ao vivo.
Encontre e abra seu arquivo de configuração do MySQL, geralmente /etc/mysql/my.cnf no Ubuntu. Procure a seção que diz “Log e replicação”
Apenas descomente a variável "log" para ativar o log. Reinicie o MySQL com este comando:
Agora estamos prontos para começar a monitorar as consultas à medida que elas entram. Abra um novo terminal e execute este comando para rolar o arquivo de log, ajustando o caminho, se necessário.
Agora execute seu aplicativo. Você verá as consultas ao banco de dados começarem a aparecer na janela do seu terminal. (verifique se a rolagem e o histórico estão ativados no terminal)
FROM http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
fonte
Em uma linha de comando, você pode executar:
Substitua os valores [x] pelos seus valores.
Ou melhor ainda:
fonte
Confira mtop .
fonte
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete.
mtop.sourceforge.net Às vezes é bastante útil.Eu estava procurando fazer o mesmo, e reuni uma solução de várias postagens, além de criar um pequeno aplicativo de console para gerar o texto da consulta ao vivo, conforme ele é gravado no arquivo de log. Isso foi importante no meu caso, pois estou usando o Entity Framework com MySQL e preciso poder inspecionar o SQL gerado.
Etapas para criar o arquivo de log (alguma duplicação de outras postagens, todas aqui por simplicidade):
Edite o arquivo localizado em:
Adicione "log = development.log" ao final do arquivo. (Observe que salvar este arquivo exigiu que eu executasse meu editor de texto como administrador).
Use o MySql Workbench para abrir uma linha de comando, digite a senha.
Execute o seguinte para ativar o log geral que registrará todas as consultas executadas:
Isso fará com que as consultas em execução sejam gravadas em um arquivo de texto no seguinte local.
Crie / execute um aplicativo de console que produza as informações de log em tempo real:
Fonte disponível para download aqui
Fonte:
fonte
Além das respostas anteriores que descrevem como habilitar o log geral, tive que modificar uma variável adicional na minha instalação do MySql 5.6 vanilla antes de qualquer SQL ser gravado no log:
A configuração padrão era 'NENHUM'.
fonte
Gibbs MySQL Spyglass
A AgilData lançou recentemente o Gibbs MySQL Scalability Advisor (uma ferramenta gratuita de autoatendimento) que permite aos usuários capturar uma transmissão ao vivo de consultas a serem carregadas na Gibbs. O Spyglass (que é de código aberto) observará as interações entre os servidores MySQL e os aplicativos clientes. Nenhuma reconfiguração ou reinicialização do servidor de banco de dados MySQL é necessária (cliente ou aplicativo).
GitHub: AgilData / gibbs-mysql-spyglass
Saiba mais: Pacote de captura de MySQL com Rust
Comando de instalação:
fonte