【问题标题】:List of users accessing database访问数据库的用户列表
【发布时间】:2026-01-19 22:05:01
【问题描述】:

我的一组队友访问了一个 MySQL 数据库。有没有命令可以获取当前正在访问或者已经访问并退出的用户的日志信息?

【问题讨论】:

    标签: mysql linux loginfo


    【解决方案1】:

    从 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';
    

    不过,请注意,这张桌子可能会变得很大。您需要定期清理它。

    【讨论】:

    • 这将只显示当前正在运行的查询 - 而不是以前访问过数据库的人。
    • 啊。我错过了。无法查看谁真正退出了,您只能看到当前登录的用户(即使他们没有运行查询,他们仍然会打开连接)。如果您想跟踪谁都已登录,您可能需要创建一个 cron 作业,定期将该信息捕获到一个表中,然后您可以查询该表。
    • 您也可以使用通用查询日志 - dev.mysql.com/doc/refman/5.1/en/query-log.html。您可以将其配置为记录到您可以直接查询的表中。
    • @matthewh 更新了我的答案以反映查询日志到表的方法。试试看。
    【解决方案2】:

    可以通过查看 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

    【讨论】: