MySQL - 记录每个连接

Bas*_*974 4 mysql logging connection

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

我尝试了一般日志记录,但它的日志记录太多了,我无法保持足够长的时间,日志文件增长得太快。

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

Rol*_*DBA 5

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

为什么将general_log创建为表?

  • 您可以针对它运行 SQL。
  • 您可以非常轻松地轮换出去。

你如何配置它?

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

  • 设置log-outputFILE(默认)会将日志条目写入文本文件。
  • 设置log-outputTABLE将日志条目写入mysql.general_log.
  • 设置log-outputTABLE,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) 
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE mysql.general_log ENGINE = MyISAM; 
ALTER TABLE mysql.general_log ADD INDEX (event_time); 
Run Code Online (Sandbox Code Playgroud)

如果您已经启动了 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; 
Run Code Online (Sandbox Code Playgroud)

现在,一般日志表如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

当它是 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; 
Run Code Online (Sandbox Code Playgroud)

以下是如何保留最近 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; 
Run Code Online (Sandbox Code Playgroud)

警告

MySQL 5.1/5,5/5.6 中提供了此功能。您应该从 MySQL 5.0.77 升级到最新版本

结语

我可以在这里写更多内容,但已经在 DBA StackExchange 中多次讨论过这个问题。以下是我关于这个主题的一些帖子: