我有一群我的队友访问的MySQL数据库。是否有任何命令来获取当前正在访问或已经访问和注销的用户的日志信息?
答案 0 :(得分:4)
从mysql工具运行以下命令以查看当前正在运行的所有进程(包括休眠连接):
SHOW PROCESSLIST
或者,您可以查询information_schema表以获得相同的内容:
select * from information_schema.processlist
要查看所有已登录的历史记录,您可以将常规查询日志配置为转到表,方法是将以下启动参数添加到mysqld启动“--log-output = TABLE --general-log “,然后您可以从mysql架构中的general_log表中查询此信息。以下是您可以使用的查询:
select * from mysql.general_log where command_type = 'Connect';
尽管如此,这张桌子可能会变得很大。你会想要定期清理它。
答案 1 :(得分:1)
通过查看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表。
请注意,出于安全原因,不会为root用户(SUPER_PRIV)的登录处理init_connect。这些将逃脱您的记录。
在MySQL 5.5中,Audit API已添加到服务器中。我相信,你真正想要的是一个审计插件。有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html。