我有一个MySQL数据库,可以被我的一组队友访问。是否有命令可以获取当前正在访问或已经访问并注销的用户的日志信息?
发布于 2011-04-07 10:43:25
在mysql工具中运行以下命令,查看当前正在运行的所有进程(包括休眠连接):
SHOW PROCESSLIST或者,您可以查询information_schema表以获得相同的结果:
select * from information_schema.processlist要查看所有登录用户的历史记录,您可以将常规查询日志配置为转到一个表中,方法是将以下启动参数添加到mysqld启动中"-- log -output=TABLE -- go log“,然后您可以从mysql schema中的general_log表中查询此信息。以下是您可以使用的查询:
select * from mysql.general_log where command_type = 'Connect';不过需要提醒的是,这张桌子可能会变得很大。你需要定期清理它。
发布于 2011-04-07 19:30:47
当前维护数据库连接的用户可以通过查看SHOW PROCESSLIST或INFORMATION_SCHEMA.PROCESSLIST获得。
该数据的历史记录将不会被拥有。使用通用查询日志并不是一个好主意,因为它根本没有可伸缩性:通用查询日志记录您的服务器看到的每个语句,将其写入LOCK_log和磁盘I/O会大大增加争用。如果您的通用查询日志是CSV表,则无法有效地对其进行查询,如果它是MyISAM表,则它本质上将序列化所有查询(甚至是读查询!)在你的数据库里。
这是因为每个查询都需要记录,即使是已读查询也是如此。为此,有必要写入通用查询日志。为此,需要在MyISAM日志表上设置一个表锁。这非常慢,甚至在低负载的服务器上也是不可取的。
不支持常规查询日志的其他格式。
有一组变量可以定义服务器启动、从连接和用户连接上的操作。
root@localhost [kris]> show global variables like 'init%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| init_connect | |
| init_file | |
| init_slave | |
+---------------+-------+
3 rows in set (0.00 sec)通过将init_connect设置为一条记录当前用户、当前时间和连接id的insert语句,您可以以一种更具伸缩性的方式生成所需的日志。为此,请使用具有auto_increment id的InnoDB表。
请注意,出于安全原因,不会为根用户(SUPER_PRIV)的登录处理init_connect。这些将从您的日志记录中逃脱。
在MySQL 5.5中,Audit API被添加到服务器。我相信,你真正想要的是一个审计插件。详情请参见http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html。
https://stackoverflow.com/questions/5575347
复制相似问题