MySQL – logging每个连接

我想监视一个MySQL 5.0.77服务器,并logging每一个传入的连接一天。 我需要知道谁连接到数据库。

我尝试了一般日志logging,但是日志logging方式太多 ,我无法保持足够长的时间,日志文件增长过快。

有没有办法做到这一点 ? 谢谢

您应该使用通用日志,而不是作为文本文件,而是作为MySQL表。

为什么要将general_log创build为表格?

  • 你可以对它运行SQL。
  • 你可以很容易地旋出。

你如何configuration它?

从MySQL 5.1开始,引入了以下选项: log-output

  • log-output设置为FILE (默认)将日志条目写入文本文件。
  • log-output设置为TABLE将日志条目写入mysql.general_log
  • log-output设置为TABLE,FILE将日志条目写入到mysql.general_log和文本文件中。

有一件事情必须改变。

我们来看一个标准的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) 

这是一个CSV文件? Yuck !!! 谁有这个时间? 不用担心,把它变成一个MyISAM表

 ALTER TABLE mysql.general_log ENGINE = MyISAM; ALTER TABLE mysql.general_log ADD INDEX (event_time); 

如果你已经开始使用MySQL,那就这样做:

 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; 

现在,通用日志表如下所示:

 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) 

当它是MyISAM表时,如何旋转通用日志?

这里是一个如何清空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; 

这是一个如何保持最后3天的条目的例子:

 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; 

警告

这个特性在MySQL 5.1 / 5,5 / 5.6中可用。 您应该从MySQL 5.0.77升级到最新版本

结语

我可以在这里写更多,但是在DBA StackExchange中已经讨论过很多次。 这里有一些关于这个问题的post:

  • Feb 11, 2012MySQL general log
  • Jan 07, 2012How to enable MySQL general log?
  • Dec 27, 2011How to do MySQL User Accounting
  • Feb 24, 2011Audit logins on MySQL database

这是一个想法,但它可能无法正常工作。
/var/log/mysql/named_pipe创build一个FIFOpipe道一方面,让MySQL使用它作为通用日志文件的文件名。

另一方面,设置类似的东西

 grep "login" < /var/log/mysql/named_pipe > /var/log/mysql/logins 

你需要grep的任何线,这是完全是你在日志之后。

可能工作..它可能不会。