MySQL 本身并不内置完整的用户操作日志功能,但可以通过以下几种方式查询用户操作记录:
1. 查询 MySQL 通用日志(General Log)
-- 查看是否启用通用日志
SHOW VARIABLES LIKE 'general_log%';
-- 开启通用日志(临时)
SET GLOBAL general_log = 1;
SET GLOBAL log_output = 'TABLE'; -- 输出到表
-- 查询通用日志内容
SELECT * FROM mysql.general_log
WHERE event_time > '2024-01-01'
ORDER BY event_time DESC
LIMIT 100;
-- 查询特定用户的操作
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE user_host LIKE '%username%'
AND argument NOT LIKE '%PROCESSLIST%';
2. 查询慢查询日志(Slow Query Log)
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';
-- 如果输出到表,查询慢查询日志
SELECT * FROM mysql.slow_log
WHERE start_time > '2024-01-01'
ORDER BY start_time DESC;
3. 查询二进制日志(Binary Log)
-- 查看二进制日志列表
SHOW BINARY LOGS;
-- 查看当前正在使用的二进制日志
SHOW MASTER STATUS;
-- 解析二进制日志内容(需要在命令行执行)
mysqlbinlog mysql-bin.000001
mysqlbinlog --database=your_db mysql-bin.000001
mysqlbinlog --start-datetime="2024-01-01 00:00:00" mysql-bin.000001
4. 使用 Performance Schema 监控
-- 启用相关监控(如果未启用)
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE 'events_statements%';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'statement/%';
-- 查询最近的 SQL 语句
SELECT * FROM performance_schema.events_statements_history
WHERE USER = 'username'
ORDER BY EVENT_TIME DESC
LIMIT 100;
-- 查询所有用户最近的操作
SELECT EVENT_TIME, USER, HOST, SQL_TEXT
FROM performance_schema.events_statements_history
WHERE SQL_TEXT IS NOT NULL
ORDER BY EVENT_TIME DESC
LIMIT 50;
5. 查询审计日志(如果安装了审计插件)
-- 查看是否启用审计
SHOW VARIABLES LIKE 'audit_log%';
-- 查询审计日志(具体表名取决于插件)
SELECT * FROM audit_log_table
WHERE user = 'username'
ORDER BY timestamp DESC;
6. 通过 INFORMATION_SCHEMA 查询进程信息
-- 查看当前正在执行的查询
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE USER != 'system user'
AND COMMAND != 'Sleep'
ORDER BY TIME DESC;
-- 查看历史连接信息
SELECT * FROM PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_HISTORY
ORDER BY EVENT_TIME DESC;
7. 启用和配置日志记录
在 my.cnf/my.ini 中配置:
[mysqld]
# 通用日志
general_log = 1
general_log_file = /var/log/mysql/mysql.log
log_output = FILE # 或 TABLE
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
# 二进制日志
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 7
max_binlog_size = 100M
临时启用(不需要重启):
-- 启用通用日志
SET GLOBAL general_log = 'ON';
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 设置日志输出方式
SET GLOBAL log_output = 'TABLE,FILE';
8. 实用查询示例
-- 查询用户登录记录
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE argument LIKE '%Connect%'
ORDER BY event_time DESC;
-- 查询 DDL 操作
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE argument REGEXP 'CREATE|ALTER|DROP|TRUNCATE'
ORDER BY event_time DESC;
-- 查询数据修改操作
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE argument REGEXP 'INSERT|UPDATE|DELETE'
ORDER BY event_time DESC;
-- 查看占用资源最多的查询
SELECT user, db, state_time, info
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE info IS NOT NULL
ORDER BY time DESC;
注意事项:
性能影响:开启通用日志会显著影响性能,生产环境谨慎使用
存储空间:日志文件可能快速增长,需要定期清理
安全考虑:日志可能包含敏感信息,需要妥善保护
版本差异:不同 MySQL 版本可能有功能差异
权限要求:查询日志需要相应的权限(SUPER 或相关权限)
推荐方案:
生产环境:使用 Performance Schema + 慢查询日志 + 二进制日志
安全审计:安装 MySQL 企业版审计插件或第三方审计工具
开发环境:可以开启通用日志进行调试
监控需求:结合 Prometheus + Grafana 等监控方案
根据实际需求选择合适的日志记录方式,平衡性能、存储和安全要求。