Registre todas as consultas no mysql


279

É possível ativar o log de auditoria no meu banco de dados mysql?

Basicamente, quero monitorar todas as consultas por uma hora e despejar o log em um arquivo.


8
TMS

Para o benefício dos leitores: Não deixe de ler a pergunta no comentário acima.
garras

Você pode consultar a minha resposta existente postado aqui dba.stackexchange.com/a/62477/6037
Peter Venderberghe

Respostas:


166

Inicie o mysql com a opção --log:

mysqld --log=log_file_name

ou coloque o seguinte no seu my.cnfarquivo:

log = log_file_name

Qualquer um deles registrará todas as consultas em log_file_name.

Você também pode registrar apenas consultas lentas usando a --log-slow-queriesopção em vez de --log. Por padrão, as consultas que levam 10 segundos ou mais são consideradas lentas. Você pode alterar isso definindo long_query_timeo número de segundos que uma consulta deve levar para executar antes de ser registrada.


61
Não é preciso dizer, mas deixar isso ativado em uma caixa de produção acaba sendo divertido rapidamente. g
ceejayoz

6
Se você tiver problemas para ativar o log dessa maneira, verifique duas vezes se o usuário do mysql pode gravar no local apropriado do arquivo.
Jon Topper

3
É possível registrar consultas somente com 1 db / tabela particular?
Temujin

2
O @Temujin phpmyadmin agora tem uma opção de 'rastreamento' para tabelas nas quais você especifica um log ('versão') e manterá o registro das consultas que o afetam com informações sobre horário e toda a consulta.
precisa saber é o seguinte

3
Esta resposta aceita deve ser excluída ou editada para refletir o fato de que não funciona com o MySQL 5.6. +.
itoctopus 31/07

233

( Nota : Para o mysql-5.6 +, isso não funcionará. Existe uma solução que se aplica ao mysql-5.6 + se você rolar para baixo ou clicar aqui .)

Se você não quiser ou não puder reiniciar o servidor MySQL, poderá proceder assim no seu servidor em execução:

  • Crie suas tabelas de log no mysqlbanco de dados
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
  • Habilitar o log de consulta no banco de dados
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;

14
Não tenho certeza se isso é verdade para todas as versões do MySQL (estou no 5.5), mas não precisei criar as tabelas. Eu segui a mesma menos aconselhamento criar as tabelas, que é mencionado aqui: stackoverflow.com/a/678310/135101
Tyler Collier

Talvez já tenha sido criado por um ou outro motivo, @TylerCollier #
Alexandre Marcondes

3
Deve-se observar que os CREATE TABLEcomandos (se as tabelas ainda não existirem) devem ser executados no mysqlbanco de dados, não em nenhum banco de dados criado pelo usuário. Talvez as instruções SQL possam ser atualizadas para refletir isso.
Robert Rossmann

2
Para visualizar o log, SELECT * FROM mysql.general_log order by (event_time) descserá melhor. apenas dizendo :-).
vinrav

Não concorde com a observação - a versão 5.6.37 do servidor funciona totalmente corretamente. Obrigado.
Dmitriy Olhovsky

215

Além do que me deparei aqui, executar a seguinte era a maneira mais simples de despejar consultas em um arquivo de log sem reiniciar

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

pode ser desligado com

SET global general_log = 0;

6
Absolutamente amo este, funciona para novas conexões do DB existente e
Carlton

1
Havia algumas entradas de estatísticas - não sei o que são, mas, caso contrário, funciona muito bem.
Snowcrash

Para que isso funcione, o usuário deve ter o privilégio SUPER, que é um privilégio global do banco de dados e, portanto, não pode ser limitado a esquemas ou tabelas específicos:GRANT SUPER ON *.* TO user1@localhost
RobM

Gostaria de votar mais de uma vez, se pudesse, tenho um marcador apontando aqui :) Muito obrigado!
Resi

125

A resposta principal não funciona no mysql 5.6+. Use isto:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

no seu arquivo my.cnf / my.ini

Ubuntu / Debian : /etc/mysql/my.cnf
Windows : c: \ ProgramData \ MySQL \ MySQL Server 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ mysql \ bin \ my.ini.


1
Se você o usou, pode me dizer o impacto no desempenho acima e seria sensato habilitar o log dessa maneira?
Ramesh Pareek

1
O impacto no desempenho de Ramesh parece ter uma redução de 5-15% no desempenho. Mais informações aqui percona.com/blog/2009/02/10/…
Firze 08/03

1
Não entendo por que o Mysql 5.6 não permite que o arquivo de log seja definido a partir de consultas? Como registrar todas as consultas no MySQL 5.6 e posterior quando você não tem acesso à árvore de diretórios do servidor, mas apenas phpMyAdmin?
Vicky Dev

reinicie o serviço mysql no painel de controle xampp após essas alterações.
Paramjeet

Isso funcionou para mim no meu ambiente local do Xampp Apache, mas ainda precisava ativar o logon via phpMyAdmin. Além disso, não foi possível localizar o arquivo na pasta / usr / log, nem seria criá-lo, mas funcionou muito bem comogeneral_log_file=filename.log
Joep

36

Ativar o log para tabela

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

Exibir log por consulta selecionada

select * from mysql.general_log

existe um curinga para registrar todas as tabelas? (há bastante: C)
RicardoE

Obrigado, essa configuração foi muito útil para mim, pois não consegui derrubar o servidor mysql. Eu também quero que o log apareça na tabela de logs
Gunnar Sigfusson

14

Maneira rápida de ativar o MySQL General Query Log sem reiniciar.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

Instalei o mysql através do homebrew, versão mysql: mysql Ver 14.14 Distrib 5.7.15, para osx10.11 (x86_64) usando o wrapper EditLine


6

Para o registro, general_log e slow_log foram introduzidos no 5.1.6:

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

5.2.1 Selecionando destinos de saída de consulta geral e log de consulta lenta

A partir do MySQL 5.1.6, o MySQL Server fornece controle flexível sobre o destino da saída para o log de consultas gerais e o log de consultas lentas, se esses logs estiverem ativados. Os destinos possíveis para entradas de log são os arquivos de log ou as tabelas general_log e slow_log no banco de dados mysql


5

Você deve estar ciente de que o logon do mysql realmente afeta o desempenho, mas pode ser uma coisa inteligente a se fazer.

Eu costumo deixá-lo ligado no servidor de desenvolvimento (exceto quando isso nos deixa loucos :))


2

Versão do SO / mysql:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

Adicionando log (por exemplo, não acho que /var/log/...seja o melhor caminho no Mac OS, mas funcionou:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

Mysql reiniciado

Resultado:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

1

No caso de usar o AWS RDS MYSQL, guia passo a passo aqui.

Quando definido como saída de 'arquivo', é possível visualizar o log diretamente no console de "registro" do AWS RDS.

Log do AWS RDS MYSQL

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.