欢迎光临武汉华金科技
马上发布信息
详情描述
mysql如何查询用户操作日志

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 等监控方案

根据实际需求选择合适的日志记录方式,平衡性能、存储和安全要求。