【发布时间】:2026-01-19 22:05:01
【问题描述】:
我的一组队友访问了一个 MySQL 数据库。有没有命令可以获取当前正在访问或者已经访问并退出的用户的日志信息?
【问题讨论】:
我的一组队友访问了一个 MySQL 数据库。有没有命令可以获取当前正在访问或者已经访问并退出的用户的日志信息?
【问题讨论】:
从 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';
不过,请注意,这张桌子可能会变得很大。您需要定期清理它。
【讨论】:
可以通过查看 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 的插入语句,您可以以更可扩展的方式生成所需的日志。为此使用带有 auto_increment id 的 InnoDB 表。
请注意,出于安全原因,没有为 root 用户 (SUPER_PRIV) 的登录处理 init_connect。这些将逃脱您的日志记录。
在 MySQL 5.5 中,审核 API 被添加到服务器。我相信你真正想要的是一个审计插件。详情请见http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html。
【讨论】: