Você deve usar o log geral, não como um arquivo de texto, mas como uma tabela MySQL.
Por que criar o general_log como uma tabela?
- Você pode executar o SQL nele.
- Você pode girar com muita facilidade.
Como você configura?
A partir do MySQL 5.1, a seguinte opção foi introduzida: log-output .
- Configurar
log-output
paraFILE
(padrão) grava entradas de log no arquivo de texto. - Definir
log-output
paraTABLE
grava entradas de log emmysql.general_log
. - A configuração de
log-output
paraTABLE,FILE
grava entradas de log emmysql.general_log
e no arquivo de texto.
Há uma coisa importante que deve ser mudada.
Vamos ver uma tabela padrão do mysql.general_log:
mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE 'general_log' (
'event_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
'user_host' mediumtext NOT NULL,
'thread_id' int(11) 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'
1 row in set (0.09 sec)
É um arquivo CSV? Que nojo !!! Quem tem tempo para isso? Não se preocupe, transforme-o em uma tabela MyISAM
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
Se você já iniciou o MySQL, faça assim:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;
Agora, a tabela de registro geral se parece com isso:
mysql> show create table general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE 'general_log' (
'event_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
'user_host' mediumtext NOT NULL,
'thread_id' int(11) NOT NULL,
'server_id' int(10) unsigned NOT NULL,
'command_type' varchar(64) NOT NULL,
'argument' mediumtext NOT NULL,
KEY 'event_time' ('event_time')
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)
Como você gira o log geral quando é uma tabela MyISAM?
Aqui está um exemplo de como eliminar mysql.general_log
:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
Aqui está um exemplo de como manter os últimos 3 dias de entradas:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
INSERT INTO mysql.general_log_new
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
CAVEAT
Esta funcionalidade está disponível no MySQL 5.1 / 5,5 / 5.6. Você deve atualizar do MySQL 5.0.77 para o mais recente
EPÍLOGO
Eu poderia escrever muito mais aqui, mas já discuti isso várias vezes no DBA StackExchange. aqui estão algumas das minhas postagens sobre este assunto:
-
Feb 11, 2012
:MySQL general log
-
Jan 07, 2012
:How to enable MySQL general log?
-
Dec 27, 2011
:How to do MySQL User Accounting
-
Feb 24, 2011
:Audit logins on MySQL database