MySQL 本身并不内置完整的用户操作日志功能,但可以通过以下几种方式查询用户操作记录:
-- 查看是否启用通用日志
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%';
-- 查看慢查询配置
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;
-- 查看二进制日志列表
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
-- 启用相关监控(如果未启用)
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;
-- 查看是否启用审计
SHOW VARIABLES LIKE 'audit_log%';
-- 查询审计日志(具体表名取决于插件)
SELECT * FROM audit_log_table
WHERE user = 'username'
ORDER BY timestamp DESC;
-- 查看当前正在执行的查询
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;
[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';
-- 查询用户登录记录
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;
根据实际需求选择合适的日志记录方式,平衡性能、存储和安全要求。