Bas*_*974 4 mysql logging connection
我想监视 MySQL 5.0.77 服务器并记录一天的每个传入连接。我需要知道谁正在连接到数据库。
我尝试了一般日志记录,但它的日志记录太多了,我无法保持足够长的时间,日志文件增长得太快。
有没有办法做到这一点 ?谢谢
您应该使用常规日志,而不是作为文本文件,而是作为 MySQL 表。
从 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)
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)
以下是如何清空的示例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 中多次讨论过这个问题。以下是我关于这个主题的一些帖子:
Feb 11, 2012:MySQL general logJan 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